pure_hfsm/
de.rs

1//! Deserialize state machines
2use 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}