1use serde::{de::Visitor, Deserialize, Deserializer};
3use std::marker::PhantomData;
4
5use crate::builder::{State, StateMachine};
6
7struct StateMachineVisitor<B, T>(PhantomData<(B, T)>);
8impl<B, T> StateMachineVisitor<B, T> {
9 fn new() -> Self {
10 Self(PhantomData)
11 }
12}
13impl<'de, B: Deserialize<'de>, T: Deserialize<'de>> Visitor<'de> for StateMachineVisitor<B, T> {
14 type Value = StateMachine<B, T>;
15 fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
16 formatter.write_str("A List describing a StateMachine [ \"Name\" State1 State2 ..]")
17 }
18 fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
19 where
20 A: serde::de::SeqAccess<'de>,
21 {
22 let name = seq.next_element()?.ok_or_else(|| todo!())?;
23 let mut states = Vec::with_capacity(seq.size_hint().unwrap_or(2));
24 while let Some(state) = seq.next_element()? {
25 states.push(state);
26 }
27 Ok(StateMachine { name, states })
28 }
29}
30
31struct StateVisitor<B, T>(PhantomData<(B, T)>);
32impl<B, T> StateVisitor<B, T> {
33 fn new() -> Self {
34 Self(PhantomData)
35 }
36}
37impl<'de, B: Deserialize<'de>, T: Deserialize<'de>> Visitor<'de> for StateVisitor<B, T> {
38 type Value = State<B, T>;
39 fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
40 formatter.write_str("A List describing a State [ \"Name\" Behavior Trs1 Trs2 .. ]")
41 }
42 fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
43 where
44 A: serde::de::SeqAccess<'de>,
45 {
46 let name = seq.next_element()?.ok_or_else(|| todo!())?;
47 let behavior = seq.next_element()?.ok_or_else(|| todo!())?;
48 let mut transitions = Vec::with_capacity(seq.size_hint().unwrap_or(2));
49 while let Some(transition) = seq.next_element()? {
50 transitions.push(transition);
51 }
52 Ok(State {
53 name,
54 behavior,
55 transitions,
56 })
57 }
58}
59
60impl<'de, B: Deserialize<'de>, T: Deserialize<'de>> Deserialize<'de> for StateMachine<B, T> {
61 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
62 where
63 D: Deserializer<'de>,
64 {
65 deserializer.deserialize_seq(StateMachineVisitor::new())
66 }
67}
68
69impl<'de, B: Deserialize<'de>, T: Deserialize<'de>> Deserialize<'de> for State<B, T> {
70 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
71 where
72 D: Deserializer<'de>,
73 {
74 deserializer.deserialize_seq(StateVisitor::new())
75 }
76}