1use serde::de::{self, EnumAccess, IntoDeserializer, SeqAccess, VariantAccess};
2
3use crate::{buffer::ReadBuffer, macros::unimpl, macros::unimpl_de, UcPackError};
4
5pub struct Deserializer<B: ReadBuffer> {
8 buffer: B,
9}
10
11impl<B: ReadBuffer> Deserializer<B> {
12 pub fn new(buffer: B) -> Self {
13 Self { buffer }
14 }
15
16 fn read_u16(&mut self) -> Result<u16, UcPackError> {
17 self.buffer.read_n().map(u16::from_le_bytes)
18 }
19}
20
21impl<'de, 'a, B: ReadBuffer> de::Deserializer<'de> for &'a mut Deserializer<B> {
22 type Error = UcPackError;
23
24 fn deserialize_any<V>(self, _: V) -> Result<V::Value, Self::Error>
25 where
26 V: de::Visitor<'de>,
27 {
28 unimpl!(name = "any")
29 }
30
31 fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Self::Error>
32 where
33 V: de::Visitor<'de>,
34 {
35 let a = match self.buffer.read_u8()? {
36 0 => false,
37 1 => true,
38 _ => return Err(UcPackError::InvalidData),
39 };
40
41 visitor.visit_bool(a)
42 }
43
44 fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
45 where
46 V: de::Visitor<'de>,
47 {
48 visitor.visit_i8(self.buffer.read_u8()? as i8)
49 }
50
51 fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
52 where
53 V: de::Visitor<'de>,
54 {
55 visitor.visit_i16(self.read_u16()? as i16)
56 }
57
58 unimpl_de!(deserialize_i32, i32);
59 unimpl_de!(deserialize_i64, i64);
60
61 fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
62 where
63 V: de::Visitor<'de>,
64 {
65 visitor.visit_u8(self.buffer.read_u8()?)
66 }
67
68 fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
69 where
70 V: de::Visitor<'de>,
71 {
72 visitor.visit_u16(self.read_u16()?)
73 }
74
75 unimpl_de!(deserialize_u32, u32);
76 unimpl_de!(deserialize_u64, u64);
77
78 fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
79 where
80 V: de::Visitor<'de>,
81 {
82 let float = self.buffer.read_n().map(f32::from_le_bytes)?;
83 visitor.visit_f32(float)
84 }
85
86 unimpl_de!(deserialize_f64, f64);
87 unimpl_de!(deserialize_char, char);
88 unimpl_de!(deserialize_str, &str);
89 unimpl_de!(deserialize_string, name = "String");
90 unimpl_de!(deserialize_bytes, &[u8]);
91 unimpl_de!(deserialize_byte_buf, name = "byte_buf");
92 unimpl_de!(deserialize_option, name = "option");
93 unimpl_de!(deserialize_unit, name = "unit");
94
95 fn deserialize_unit_struct<V>(self, name: &'static str, _: V) -> Result<V::Value, Self::Error>
96 where
97 V: de::Visitor<'de>,
98 {
99 unimpl!(name = name)
100 }
101
102 fn deserialize_newtype_struct<V>(
103 self,
104 _: &'static str,
105 visitor: V,
106 ) -> Result<V::Value, Self::Error>
107 where
108 V: de::Visitor<'de>,
109 {
110 visitor.visit_newtype_struct(self)
111 }
112
113 unimpl_de!(deserialize_seq, name = "seq");
114
115 fn deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error>
116 where
117 V: de::Visitor<'de>,
118 {
119 visitor.visit_seq(SeriesAccess::new(self, len))
120 }
121
122 fn deserialize_tuple_struct<V>(
123 self,
124 _: &'static str,
125 len: usize,
126 visitor: V,
127 ) -> Result<V::Value, Self::Error>
128 where
129 V: de::Visitor<'de>,
130 {
131 self.deserialize_tuple(len, visitor)
132 }
133
134 unimpl_de!(deserialize_map, name = "map");
135
136 fn deserialize_struct<V>(
137 self,
138 _: &'static str,
139 fields: &'static [&'static str],
140 visitor: V,
141 ) -> Result<V::Value, Self::Error>
142 where
143 V: de::Visitor<'de>,
144 {
145 self.deserialize_tuple(fields.len(), visitor)
146 }
147
148 fn deserialize_enum<V>(
149 self,
150 _: &'static str,
151 _: &'static [&'static str],
152 visitor: V,
153 ) -> Result<V::Value, Self::Error>
154 where
155 V: de::Visitor<'de>,
156 {
157 visitor.visit_enum(self)
158 }
159
160 fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Self::Error>
161 where
162 V: de::Visitor<'de>,
163 {
164 self.deserialize_u8(visitor)
165 }
166
167 fn deserialize_ignored_any<V>(self, _: V) -> Result<V::Value, Self::Error>
168 where
169 V: de::Visitor<'de>,
170 {
171 unimpl!(name = "ignored type")
172 }
173}
174
175impl<'a, 'de, B: ReadBuffer> VariantAccess<'a> for &'de mut Deserializer<B> {
176 type Error = UcPackError;
177
178 fn unit_variant(self) -> Result<(), Self::Error> {
179 Ok(())
180 }
181
182 fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Self::Error>
183 where
184 T: de::DeserializeSeed<'a>,
185 {
186 seed.deserialize(self)
187 }
188
189 fn tuple_variant<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error>
190 where
191 V: de::Visitor<'a>,
192 {
193 de::Deserializer::deserialize_tuple(self, len, visitor)
194 }
195
196 fn struct_variant<V>(
197 self,
198 fields: &'static [&'static str],
199 visitor: V,
200 ) -> Result<V::Value, Self::Error>
201 where
202 V: de::Visitor<'a>,
203 {
204 de::Deserializer::deserialize_tuple(self, fields.len(), visitor)
205 }
206}
207
208impl<'a, 'de, B: ReadBuffer> EnumAccess<'a> for &'de mut Deserializer<B> {
209 type Error = UcPackError;
210 type Variant = Self;
211
212 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error>
213 where
214 V: de::DeserializeSeed<'a>,
215 {
216 let variant = self.buffer.read_u8()?;
217 let v = seed.deserialize(variant.into_deserializer())?;
218 Ok((v, self))
219 }
220}
221
222struct SeriesAccess<'a, B: ReadBuffer + 'a> {
223 deserializer: &'a mut Deserializer<B>,
224 remaining: usize,
225}
226
227impl<'a, B: ReadBuffer + 'a> SeriesAccess<'a, B> {
228 fn new(deserializer: &'a mut Deserializer<B>, len: usize) -> Self {
229 Self {
230 deserializer,
231 remaining: len,
232 }
233 }
234}
235
236impl<'a, 'seq, B: ReadBuffer> SeqAccess<'seq> for SeriesAccess<'a, B> {
237 type Error = UcPackError;
238
239 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
240 where
241 T: de::DeserializeSeed<'seq>,
242 {
243 if self.remaining <= 0 {
245 return Ok(None);
246 }
247
248 self.remaining -= 1;
249 seed.deserialize(&mut *self.deserializer).map(Some)
250 }
251}