1use std::str::from_utf8;
2
3use serde::{de::SeqAccess, Deserializer};
4
5use crate::error::{Error, ErrorKind};
6use crate::utils::{NULL_BYTE, VALUE_TERM_BYTE, ROW_TERM_BYTE};
7
8pub struct DeRecord<'de> {
9 buf: &'de [u8],
10}
11
12impl<'de> DeRecord<'de> {
13 pub(crate) fn from_ref(buf: &'de [u8]) -> Self {
14 DeRecord { buf }
15 }
16
17 fn next_is_null(&mut self) -> Result<bool, Error> {
18 match self.buf[0] == NULL_BYTE {
19 true => {
20 if self.buf[1] == VALUE_TERM_BYTE {
21 self.buf = &self.buf[2..];
22 Ok(true)
23 } else {
24 Err(Error(ErrorKind::Deserialize(
25 format!("Expected TERM_BYTE after NULL_BYTE, got {:?}", self.buf[1])
26 )))
27 }
28 },
29 false => Ok(false),
30 }
31 }
32
33 fn next_value(&mut self) -> Result<Option<&str>, Error> {
34 if self.buf[0] == NULL_BYTE {
36 if self.buf[1] == VALUE_TERM_BYTE {
37 self.buf = &self.buf[2..];
38 return Ok(None);
39 } else {
40 return Err(Error(ErrorKind::Deserialize(
41 format!("Expected TERM_BYTE after NULL_BYTE, got {:?}", self.buf[1])
42 )));
43 }
44 }
45
46 if self.buf[0] == VALUE_TERM_BYTE {
48 self.buf = &self.buf[1..];
49 return Ok(Some(""));
50 }
51
52 for i in 1..self.buf.len() {
54 if self.buf[i] == VALUE_TERM_BYTE {
55 let value = &self.buf[0..i];
56 self.buf = &self.buf[i + 1..];
57
58 return Ok(Some(from_utf8(value)?));
59 }
60 }
61
62 Err(Error(ErrorKind::Deserialize(
63 "Unable to find VALUE_TERM_BYTE in record".to_owned()
64 )))
65 }
66
67 fn next_str_value(&mut self) -> Result<&str, Error> {
68 let value = self.next_value()?;
69 let value = value.ok_or(Error(ErrorKind::Deserialize(
70 "Got None but expected string".to_owned()
71 )))?;
72
73 Ok(value)
74 }
75}
76
77impl<'a, 'de> Deserializer<'de> for &'a mut DeRecord<'de> {
78 type Error = Error;
79
80 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
81 where
82 V: serde::de::Visitor<'de> {
83 todo!()
84 }
85
86 fn deserialize_bool<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
87 where
88 V: serde::de::Visitor<'de> {
89 let value = self.next_str_value()?;
90
91 match value {
92 "true" => visitor.visit_bool(true),
93 "false" => visitor.visit_bool(false),
94 _ => Err(Error(ErrorKind::Deserialize("Failed to deserialize bool".to_owned()))),
95 }
96 }
97
98 fn deserialize_i8<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
99 where
100 V: serde::de::Visitor<'de> {
101 let value = self.next_str_value()?;
102 let value = value.parse().unwrap();
103
104 visitor.visit_i8(value)
105 }
106
107 fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
108 where
109 V: serde::de::Visitor<'de> {
110 let value = self.next_str_value()?;
111 let value = value.parse().unwrap();
112
113 visitor.visit_i16(value)
114 }
115
116 fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
117 where
118 V: serde::de::Visitor<'de> {
119 let value = self.next_str_value()?;
120 let value = value.parse().unwrap();
121
122 visitor.visit_i32(value)
123 }
124
125 fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
126 where
127 V: serde::de::Visitor<'de> {
128 let value = self.next_str_value()?;
129 let value = value.parse().unwrap();
130
131 visitor.visit_i64(value)
132 }
133
134 fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
135 where
136 V: serde::de::Visitor<'de> {
137 let value = self.next_str_value()?;
138 let value = value.parse().unwrap();
139
140 visitor.visit_u8(value)}
141
142 fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
143 where
144 V: serde::de::Visitor<'de> {
145 let value = self.next_str_value()?;
146 let value = value.parse().unwrap();
147
148 visitor.visit_u16(value)}
149
150 fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
151 where
152 V: serde::de::Visitor<'de> {
153 let value = self.next_str_value()?;
154 let value = value.parse().unwrap();
155
156 visitor.visit_u32(value)
157 }
158
159 fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
160 where
161 V: serde::de::Visitor<'de> {
162 let value = self.next_str_value()?;
163 let value = value.parse().unwrap();
164
165 visitor.visit_u64(value)
166 }
167
168 fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
169 where
170 V: serde::de::Visitor<'de> {
171 let value = self.next_str_value()?;
172 let value = value.parse().unwrap();
173
174 visitor.visit_f32(value)
175 }
176
177 fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
178 where
179 V: serde::de::Visitor<'de> {
180 let value = self.next_str_value()?;
181 let value = value.parse().unwrap();
182
183 visitor.visit_f64(value)
184 }
185
186 fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Self::Error>
187 where
188 V: serde::de::Visitor<'de> {
189 let value = self.next_str_value()?;
190 if value.len() <= 1 {
191 return Err(Error(ErrorKind::Deserialize(
192 format!("Expected 1 character, got {}", value.len())
193 )));
194 }
195 let value = value.chars().next().unwrap_or_default();
196 visitor.visit_char(value)
197 }
198
199 fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Self::Error>
200 where
201 V: serde::de::Visitor<'de> {
202 let value = self.next_str_value()?;
203 visitor.visit_str(value)
204 }
205
206 fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Self::Error>
207 where
208 V: serde::de::Visitor<'de> {
209 let value = self.next_str_value()?;
210 visitor.visit_string(value.to_owned())
211 }
212
213 fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Self::Error>
214 where
215 V: serde::de::Visitor<'de> {
216 todo!()
217 }
218
219 fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Self::Error>
220 where
221 V: serde::de::Visitor<'de> {
222 todo!()
223 }
224
225 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>
226 where
227 V: serde::de::Visitor<'de> {
228 let value = self.next_is_null()?;
229 match value {
230 true => visitor.visit_none(),
231 false => visitor.visit_some(self)
232 }
233 }
234
235 fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Self::Error>
236 where
237 V: serde::de::Visitor<'de> {
238 todo!()
239 }
240
241 fn deserialize_unit_struct<V>(
242 self,
243 name: &'static str,
244 visitor: V,
245 ) -> Result<V::Value, Self::Error>
246 where
247 V: serde::de::Visitor<'de> {
248 todo!()
249 }
250
251 fn deserialize_newtype_struct<V>(
252 self,
253 name: &'static str,
254 visitor: V,
255 ) -> Result<V::Value, Self::Error>
256 where
257 V: serde::de::Visitor<'de> {
258 todo!()
259 }
260
261 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
262 where
263 V: serde::de::Visitor<'de> {
264 visitor.visit_seq(self)
265 }
266
267 fn deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error>
268 where
269 V: serde::de::Visitor<'de> {
270 todo!()
271 }
272
273 fn deserialize_tuple_struct<V>(
274 self,
275 name: &'static str,
276 len: usize,
277 visitor: V,
278 ) -> Result<V::Value, Self::Error>
279 where
280 V: serde::de::Visitor<'de> {
281 todo!()
282 }
283
284 fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Self::Error>
285 where
286 V: serde::de::Visitor<'de> {
287 visitor.visit_seq(self)
288 }
289
290 fn deserialize_struct<V>(
291 self,
292 name: &'static str,
293 fields: &'static [&'static str],
294 visitor: V,
295 ) -> Result<V::Value, Self::Error>
296 where
297 V: serde::de::Visitor<'de> {
298 visitor.visit_seq(self)
299 }
300
301 fn deserialize_enum<V>(
302 self,
303 name: &'static str,
304 variants: &'static [&'static str],
305 visitor: V,
306 ) -> Result<V::Value, Self::Error>
307 where
308 V: serde::de::Visitor<'de> {
309 todo!()
310 }
311
312 fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Self::Error>
313 where
314 V: serde::de::Visitor<'de> {
315 todo!()
316 }
317
318 fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
319 where
320 V: serde::de::Visitor<'de> {
321 todo!()
322 }
323
324 fn deserialize_i128<V>(self, visitor: V) -> Result<V::Value, Self::Error>
325 where
326 V: serde::de::Visitor<'de>,
327 {
328 let _ = visitor;
329 Err(serde::de::Error::custom("i128 is not supported"))
330 }
331
332 fn deserialize_u128<V>(self, visitor: V) -> Result<V::Value, Self::Error>
333 where
334 V: serde::de::Visitor<'de>,
335 {
336 let _ = visitor;
337 Err(serde::de::Error::custom("u128 is not supported"))
338 }
339
340 fn is_human_readable(&self) -> bool {
341 true
342 }
343}
344
345impl<'a, 'de> SeqAccess<'de> for DeRecord<'de> {
346 type Error = Error;
347
348 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
349 where
350 T: serde::de::DeserializeSeed<'de> {
351 if self.buf.len() == 0 || self.buf[0] == ROW_TERM_BYTE {
352 return Ok(None);
353 }
354
355 seed.deserialize(self).map(Some)
356 }
357}