typed_json/
array.rs

1use crate::DeShared;
2
3impl<'de, T> ItemDe<'de> for Option<T>
4where
5    T: serde::de::Deserializer<'de, Error = serde::de::value::Error>,
6{
7    fn value_seed<V>(&mut self, seed: V) -> Result<Option<V::Value>, serde::de::value::Error>
8    where
9        V: serde::de::DeserializeSeed<'de>,
10    {
11        if let Some(t) = self.take() {
12            seed.deserialize(t).map(Some)
13        } else {
14            Ok(None)
15        }
16    }
17}
18
19impl<T> ItemSer for Option<T>
20where
21    T: serde::ser::Serialize,
22{
23    fn serialize<S>(&self, seq: &mut S) -> Result<(), S::Error>
24    where
25        S: serde::ser::SerializeSeq,
26    {
27        if let Some(x) = self {
28            seq.serialize_element(x)?;
29        }
30        Ok(())
31    }
32
33    fn size(&self) -> usize {
34        1
35    }
36}
37
38impl<'de, T, U> ItemDe<'de> for (T, U)
39where
40    T: ItemDe<'de>,
41    U: ItemDe<'de>,
42{
43    fn value_seed<V>(&mut self, seed: V) -> Result<Option<V::Value>, serde::de::value::Error>
44    where
45        V: serde::de::DeserializeSeed<'de>,
46    {
47        if !self.0.is_done() {
48            self.0.value_seed(seed)
49        } else {
50            self.1.value_seed(seed)
51        }
52    }
53}
54
55impl<T, U> ItemSer for (T, U)
56where
57    T: ItemSer,
58    U: ItemSer,
59{
60    #[inline]
61    fn serialize<S>(&self, seq: &mut S) -> Result<(), S::Error>
62    where
63        S: serde::ser::SerializeSeq,
64    {
65        self.0.serialize(seq)?;
66        self.1.serialize(seq)?;
67        Ok(())
68    }
69
70    #[inline]
71    fn size(&self) -> usize {
72        self.0.size() + self.1.size()
73    }
74}
75
76impl<'de> ItemDe<'de> for () {
77    fn value_seed<V>(&mut self, _seed: V) -> Result<Option<V::Value>, serde::de::value::Error>
78    where
79        V: serde::de::DeserializeSeed<'de>,
80    {
81        Ok(None)
82    }
83}
84impl ItemSer for () {
85    #[inline]
86    fn serialize<S>(&self, _seq: &mut S) -> Result<(), S::Error>
87    where
88        S: serde::ser::SerializeSeq,
89    {
90        Ok(())
91    }
92
93    #[inline]
94    fn size(&self) -> usize {
95        0
96    }
97}
98
99trait ItemDe<'de>: DeShared {
100    fn value_seed<V>(&mut self, seed: V) -> Result<Option<V::Value>, serde::de::value::Error>
101    where
102        V: serde::de::DeserializeSeed<'de>;
103}
104
105pub trait ItemSer {
106    fn serialize<S>(&self, seq: &mut S) -> Result<(), S::Error>
107    where
108        S: serde::ser::SerializeSeq;
109    fn size(&self) -> usize;
110}
111
112#[derive(Copy, Clone)]
113#[doc(hidden)]
114pub struct Array<T>(pub T);
115
116struct ListState<T>(T);
117
118impl<'de, T: ItemDe<'de>> crate::Deserializer<'de> for Array<T> {
119    fn deserialize_any2<V>(self, visitor: V) -> Result<V::Value, serde::de::value::Error>
120    where
121        V: serde::de::Visitor<'de>,
122    {
123        visitor.visit_seq(ListState(self.0))
124    }
125}
126impl<'de, T: ItemDe<'de>> serde::de::Deserializer<'de> for Array<T> {
127    type Error = serde::de::value::Error;
128    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
129    where
130        V: serde::de::Visitor<'de>,
131    {
132        visitor.visit_seq(ListState(self.0))
133    }
134    serde::forward_to_deserialize_any! {
135        bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
136        bytes byte_buf option unit unit_struct newtype_struct seq tuple
137        tuple_struct map struct enum identifier ignored_any
138    }
139}
140impl<'de, K: ItemDe<'de>> serde::de::SeqAccess<'de> for ListState<K> {
141    type Error = serde::de::value::Error;
142    fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
143    where
144        T: serde::de::DeserializeSeed<'de>,
145    {
146        self.0.value_seed(seed)
147    }
148}
149impl<T: ItemSer> serde::ser::Serialize for Array<T> {
150    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
151    where
152        S: serde::Serializer,
153    {
154        let mut seq = serializer.serialize_seq(Some(self.0.size()))?;
155        self.0.serialize(&mut seq)?;
156        serde::ser::SerializeSeq::end(seq)
157    }
158}