Skip to main content

smart_string/str_stack/
with_serde.rs

1use core::fmt;
2
3use serde::de::SeqAccess;
4use serde::de::Visitor;
5use serde::ser::SerializeSeq;
6use serde::Deserialize;
7use serde::Deserializer;
8use serde::Serialize;
9use serde::Serializer;
10
11use crate::StrStack;
12
13struct SeqVisitor;
14struct SeqInPlaceVisitor<'a>(&'a mut StrStack);
15
16impl<'de> Visitor<'de> for SeqVisitor {
17    type Value = StrStack;
18
19    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
20        formatter.write_str("a string sequence")
21    }
22
23    fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
24    where
25        A: SeqAccess<'de>,
26    {
27        let mut stack = StrStack::new();
28        while let Some(s) = seq.next_element()? {
29            stack.push(s);
30        }
31        Ok(stack)
32    }
33}
34
35impl<'a, 'de> Visitor<'de> for SeqInPlaceVisitor<'a> {
36    type Value = ();
37
38    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
39        formatter.write_str("a string sequence")
40    }
41
42    fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
43    where
44        A: SeqAccess<'de>,
45    {
46        self.0.clear();
47        while let Some(s) = seq.next_element()? {
48            self.0.push(s);
49        }
50        Ok(())
51    }
52}
53
54impl Serialize for StrStack {
55    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
56        let mut seq = serializer.serialize_seq(Some(self.len()))?;
57        for s in self.iter() {
58            seq.serialize_element(s)?;
59        }
60        seq.end()
61    }
62}
63
64impl<'de> Deserialize<'de> for StrStack {
65    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
66    where
67        D: Deserializer<'de>,
68    {
69        deserializer.deserialize_seq(SeqVisitor)
70    }
71
72    fn deserialize_in_place<D>(deserializer: D, place: &mut Self) -> Result<(), D::Error>
73    where
74        D: Deserializer<'de>,
75    {
76        deserializer.deserialize_seq(SeqInPlaceVisitor(place))
77    }
78}
79
80#[cfg(test)]
81mod tests {
82    use super::*;
83
84    #[test]
85    fn test_serialize() {
86        let mut stack = StrStack::new();
87
88        stack.push("123");
89        stack.push("456");
90        stack.push("789");
91
92        let json = serde_json::to_string(&stack).unwrap();
93        assert_eq!(json, r#"["123","456","789"]"#);
94    }
95
96    #[test]
97    fn test_deserialize() {
98        let json = r#"["123","456","789"]"#;
99        let stack: StrStack = serde_json::from_str(json).unwrap();
100
101        let mut it = stack.iter();
102        assert_eq!(it.len(), 3);
103        assert_eq!(it.next(), Some("123"));
104        assert_eq!(it.next(), Some("456"));
105        assert_eq!(it.next(), Some("789"));
106        assert_eq!(it.next(), None);
107    }
108}