rusty_tracks/messages/
plan.rs1use 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(String::from(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(String::from(format!("Wrong datatype {:?}", err)))
117 }
118 }
119}