summaryrefslogtreecommitdiff
path: root/meap/meap-code/ch5/ch5-message-store/src/main.rs
blob: e790a57ebdb306838aeac7798093faa0e4f6947e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93

#[derive(Debug)]
struct CubeSat {
  id: u64,
}

#[derive(Debug)]
enum StatusMessage {
  Ok,
}

#[derive(Debug)]
struct Mailbox {
  messages: Vec<Message>,
}

#[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<Message> {
        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<Message> {
        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<u64> {
  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);
  }
}