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}