smart_string/str_stack/
with_serde.rs1use 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}