rusty_tracks/messages/
plan.rs

1use track_rails::message_generated::protocol;
2use track_rails::message_generated::protocol::{Message, Payload};
3
4pub struct CreatePlan{
5    pub id: usize
6}
7
8impl TryFrom<Message<'_>> for CreatePlan {
9    type Error = String;
10
11    fn try_from(msg: Message) -> Result<Self, Self::Error> {
12        match msg.data_type() {
13            Payload::CreatePlanResponse => {
14                Ok(CreatePlan { id: msg.data_as_create_plan_response().ok_or(String::from("Did not contain id."))?.id() as usize })
15            },
16            e => Err(format!("Wrong datatype {:?}", e))
17        }
18
19    }
20}
21
22pub struct DeletePlan{}
23impl TryFrom<Message<'_>>
24for DeletePlan {
25    type Error = String;
26    fn try_from(msg: Message) -> Result<Self, Self::Error> {
27        match msg.data_type() {
28            Payload::DeletePlanResponse => {
29                Ok(DeletePlan { })
30            }
31            e => Err(format!("Wrong datatype {:?}", e))
32        }
33    }
34}
35
36pub struct Plans (pub(crate) Vec<Plan>);
37
38
39pub struct Plan {
40    pub id: usize,
41}
42
43impl TryFrom<protocol::Plan<'_>> for Plan {
44    type Error = String;
45
46    fn try_from(initial: protocol::Plan) -> Result<Self, Self::Error> {
47        let id = initial.id() as usize;
48        Ok(Plan { id })
49    }
50}
51
52impl TryFrom<Message<'_>> for Plans {
53    type Error = String;
54
55    fn try_from(msg: Message<'_>) -> Result<Self, Self::Error> {
56        match msg.data_type() {
57            Payload::Catalog => {
58                msg.data_as_catalog().map(|c| {
59                    let plans = match c.plans() {
60                        Some(plans) => plans,
61                        None => return Err(String::from("Contains no plans.")),
62                    };
63                    match Plans::try_from(plans) {
64                        Ok(plan) => Ok(plan),
65                        Err(err) => return Err(err)
66                    }
67                }).ok_or(String::from("Plans is empty"))?
68            }
69            e => Err(format!("Wrong datatype {:?}", e))
70        }
71    }
72}
73
74impl TryFrom<protocol::Plans<'_>> for Plans {
75    type Error = String;
76
77    fn try_from(initial: protocol::Plans<'_>) -> Result<Self, Self::Error> {
78        let mut plans = vec![];
79        for plan in initial.plans() {
80            plans.push(Plan::try_from(plan)?)
81        }
82        Ok(Plans(plans))
83    }
84}
85
86pub struct StartPlan {
87    already_running: bool,
88}
89
90impl TryFrom<Message<'_>> for StartPlan {
91    type Error = String;
92
93    fn try_from(msg: Message<'_>) -> Result<Self, Self::Error> {
94        match msg.data_type() {
95            Payload::StartPlanResponse => {
96                let already_running = msg.data_as_start_plan_response().ok_or(String::from("Did not contain start."))?.already_running();
97                Ok(StartPlan { already_running })
98            },
99            err => Err(format!("Wrong datatype {:?}", err))
100        }
101    }
102}
103
104pub struct StopPlan {
105    already_stopped: bool
106}
107
108impl TryFrom<Message<'_>> for StopPlan {
109    type Error = String;
110    fn try_from(msg: Message<'_>) -> Result<Self, Self::Error> {
111        match msg.data_type() {
112            Payload::StopPlanResponse => {
113                let already_stopped = msg.data_as_stop_plan_response().ok_or(String::from("Did not contain start."))?.already_stopped();
114                Ok(StopPlan { already_stopped })
115            },
116            err => Err(format!("Wrong datatype {:?}", err))
117        }
118    }
119}