#[derive(Debug)] struct CubeSat { id: u64, } #[derive(Debug)] enum StatusMessage { Ok, } #[derive(Debug)] struct Mailbox { messages: Vec, } #[derive(Debug)] struct Message { to: u64, content: String, } struct GroundStation {} impl Mailbox { fn post(&mut self, to: &CubeSat, msg: Message) { self.messages.push(msg); } fn deliver(&mut self, recipient: &CubeSat) -> Option { for i in 0..self.messages.len() { if self.messages[i].to == recipient.id { let msg = self.messages.remove(i); return Some(msg); } } None } } impl GroundStation { fn connect(&self, sat_id: u64) -> CubeSat { CubeSat { id: sat_id, } } fn send(&self, mailbox: &mut Mailbox, to: &CubeSat, msg: Message) { mailbox.post(to, msg); } } impl CubeSat { fn recv(&self, mailbox: &mut Mailbox) -> Option { mailbox.deliver(&self) } } // fn main() { // let base = GroundStation {}; // let mut sat_a = CubeSat { id: 0, mailbox: Mailbox { messages: vec![] } }; // let mut sat_b = CubeSat { id: 1, mailbox: Mailbox { messages: vec![] } }; // let mut sat_c = CubeSat { id: 2, mailbox: Mailbox { messages: vec![] } }; // } /// Returns a vector of CubeSat IDs fn fetch_sat_ids() -> Vec { vec![1,2,3] } fn main() { let mut mail = Mailbox { messages: vec![] }; let base = GroundStation {}; let sat_ids = fetch_sat_ids(); for sat_id in &sat_ids { let sat = base.connect(sat_id); let msg = Message { to: sat_id, content: String::from("hello") }; base.send(&mut mail, &sat, msg); } for sat_id in &sat_ids { let sat = base.connect(sat_id); let msg = sat.recv(&mut mail); println!("{:?}: {:?}", sat, msg); } }