rf_distributed/
mailbox.rs

1use crate::message::Message;
2use crate::state::States;
3use std::collections::HashMap;
4
5/// This trait represents the mailbox of a device. It is used to store the messages received from the neighbors
6pub trait Mailbox {
7    /// Enqueue a message in the mailbox
8    fn enqueue(&mut self, msg: Message);
9    /// Returns the messages stored in the mailbox
10    fn messages(&mut self) -> Messages;
11}
12
13/// This type alias represent the messages stored in the mailbox
14pub type Messages = HashMap<i32, Message>;
15
16/// This trait is used to convert a set of [Messages] into a set of [States]
17pub trait AsStates {
18    fn as_states(&self) -> States;
19}
20
21impl AsStates for Messages {
22    fn as_states(&self) -> States {
23        let mut states = States::new();
24        for (id, msg) in self.iter() {
25            states.insert(*id, msg.export.clone());
26        }
27        states
28    }
29}
30
31#[cfg(test)]
32mod test {
33    use std::collections::HashMap;
34    use std::time::SystemTime;
35
36    #[test]
37    fn test_as_states() {
38        use crate::mailbox::AsStates;
39        use crate::message::Message;
40        use crate::state::States;
41        use rf_core::export;
42        use rf_core::export::Export;
43        use rf_core::path::Path;
44        use std::any::Any;
45
46        let mut messages = HashMap::new();
47        let export_1 = export!((Path::new(), 1));
48        let export_2 = export!((Path::new(), 2));
49        let export_3 = export!((Path::new(), 3));
50        messages.insert(1, Message::new(1, export_1.clone(), SystemTime::now()));
51        messages.insert(2, Message::new(2, export_2.clone(), SystemTime::now()));
52        messages.insert(3, Message::new(3, export_3.clone(), SystemTime::now()));
53
54        let states: States = messages.as_states();
55        assert_eq!(states.len(), 3);
56        assert_eq!(states.get(&1).unwrap(), &export_1);
57        assert_eq!(states.get(&2).unwrap(), &export_2);
58        assert_eq!(states.get(&3).unwrap(), &export_3);
59    }
60}