rf_distributed/
mailbox.rs1use crate::message::Message;
2use crate::state::States;
3use std::collections::HashMap;
4
5pub trait Mailbox {
7 fn enqueue(&mut self, msg: Message);
9 fn messages(&mut self) -> Messages;
11}
12
13pub type Messages = HashMap<i32, Message>;
15
16pub 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}