1use serde::{
9 Deserialize, de,
10 de::{DeserializeSeed, Visitor},
11};
12use tuwunel_core::{
13 Error, Result, arrayvec::ArrayVec, checked, debug::DebugInspect, err, unhandled,
14 utils::string,
15};
16
17#[cfg_attr(
29 unabridged,
30 tracing::instrument(
31 name = "deserialize",
32 level = "trace",
33 skip_all,
34 fields(len = %buf.len()),
35 )
36)]
37pub fn from_slice<'a, T>(buf: &'a [u8]) -> Result<T>
38where
39 T: Deserialize<'a>,
40{
41 let mut deserializer = Deserializer { buf, pos: 0, rec: 0, seq: 0 };
42
43 T::deserialize(&mut deserializer).debug_inspect(|_| {
44 deserializer
45 .finished()
46 .expect("deserialization failed to consume trailing bytes");
47 })
48}
49
50pub(crate) struct Deserializer<'de> {
57 buf: &'de [u8],
58 pos: usize,
59 rec: usize,
60 seq: usize,
61}
62
63#[derive(Clone, Copy, Debug, Deserialize)]
69pub struct Ignore;
70
71#[derive(Clone, Copy, Debug, Deserialize)]
77pub struct IgnoreAll;
78
79impl<'de> Deserializer<'de> {
80 const SEP: u8 = crate::ser::SEP;
81
82 fn finished(&self) -> Result {
85 let pos = self.pos;
86 let len = self.buf.len();
87 let parsed = &self.buf[0..pos];
88 let unparsed = &self.buf[pos..];
89 let remain = self.remaining()?;
90 let trailing_sep = remain == 1 && unparsed[0] == Self::SEP;
91 (remain == 0 || trailing_sep)
92 .then_some(())
93 .ok_or(err!(SerdeDe(
94 "{remain} trailing of {len} bytes not deserialized.\n{parsed:?}\n{unparsed:?}",
95 )))
96 }
97
98 #[inline]
100 fn sequence_start(&mut self, len: usize) {
101 debug_assert!(self.seq == 0, "Nested sequences are not handled at this time");
102 self.seq = len;
103 }
104
105 #[inline]
109 fn record_ignore(&mut self) {
110 if self.seq > 0 {
111 self.record_next();
112 } else {
113 self.record_ignore_all();
114 }
115 }
116
117 #[inline]
121 fn record_ignore_all(&mut self) { self.record_trail(); }
122
123 #[inline]
126 fn record_next(&mut self) -> &'de [u8] {
127 self.buf[self.pos..]
128 .split(|b| *b == Deserializer::SEP)
129 .inspect(|record| self.inc_pos(record.len()))
130 .next()
131 .expect("remainder of buf even if SEP was not found")
132 }
133
134 #[inline]
137 fn record_peek_byte(&self) -> Option<u8> {
138 let started = self.pos != 0 || self.rec > 0;
139 let buf = &self.buf[self.pos..];
140 debug_assert!(
141 !started || buf[0] == Self::SEP,
142 "Missing expected record separator at current position"
143 );
144
145 buf.get::<usize>(started.into()).copied()
146 }
147
148 #[inline]
154 fn record_start(&mut self) {
155 let started = self.pos != 0 || self.rec > 0;
156 let input_done = self.pos >= self.buf.len();
157 let output_done = self.rec >= self.seq;
158 let incomplete = input_done && !output_done;
159 debug_assert!(
160 !started || incomplete || self.buf.get(self.pos) == Some(&Self::SEP),
161 "Missing expected record separator at current position"
162 );
163
164 let inc = started && !incomplete;
165 self.inc_pos(inc.into());
166 self.inc_rec(1);
167 }
168
169 #[inline]
172 fn record_trail(&mut self) -> &'de [u8] {
173 let record = &self.buf[self.pos..];
174 self.inc_pos(record.len());
175 record
176 }
177
178 #[inline]
180 #[cfg_attr(
181 unabridged,
182 tracing::instrument(
183 level = "trace",
184 skip(self),
185 fields(
186 len = self.buf.len(),
187 rem = self.remaining().unwrap_or_default().saturating_sub(n),
188 ),
189 )
190 )]
191 fn inc_pos(&mut self, n: usize) {
192 self.pos = self.pos.saturating_add(n);
193 debug_assert!(self.pos <= self.buf.len(), "pos out of range");
194 }
195
196 #[inline]
197 fn inc_rec(&mut self, n: usize) { self.rec = self.rec.saturating_add(n); }
198
199 #[inline]
201 fn remaining(&self) -> Result<usize> {
202 let pos = self.pos;
203 let len = self.buf.len();
204 checked!(len - pos)
205 }
206}
207
208impl<'a, 'de: 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
209 type Error = Error;
210
211 #[cfg_attr(unabridged, tracing::instrument(level = "trace", skip_all))]
212 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value>
213 where
214 V: Visitor<'de>,
215 {
216 self.sequence_start(1);
217 visitor.visit_seq(self)
218 }
219
220 #[cfg_attr(
221 unabridged,
222 tracing::instrument(level = "trace", skip(self, visitor))
223 )]
224 fn deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value>
225 where
226 V: Visitor<'de>,
227 {
228 self.sequence_start(len);
229 visitor.visit_seq(self)
230 }
231
232 #[cfg_attr(
233 unabridged,
234 tracing::instrument(level = "trace", skip(self, visitor))
235 )]
236 fn deserialize_tuple_struct<V>(
237 self,
238 _name: &'static str,
239 len: usize,
240 visitor: V,
241 ) -> Result<V::Value>
242 where
243 V: Visitor<'de>,
244 {
245 self.sequence_start(len);
246 visitor.visit_seq(self)
247 }
248
249 #[cfg_attr(unabridged, tracing::instrument(level = "trace", skip_all))]
250 fn deserialize_map<V>(self, visitor: V) -> Result<V::Value>
251 where
252 V: Visitor<'de>,
253 {
254 let input = self.record_next();
255 let mut d = serde_json::Deserializer::from_slice(input);
256 d.deserialize_map(visitor).map_err(Into::into)
257 }
258
259 #[cfg_attr(
260 unabridged,
261 tracing::instrument(level = "trace", skip(self, visitor))
262 )]
263 fn deserialize_struct<V>(
264 self,
265 name: &'static str,
266 fields: &'static [&'static str],
267 visitor: V,
268 ) -> Result<V::Value>
269 where
270 V: Visitor<'de>,
271 {
272 let input = self.record_next();
273 let mut d = serde_json::Deserializer::from_slice(input);
274 d.deserialize_struct(name, fields, visitor)
275 .map_err(Into::into)
276 }
277
278 #[cfg_attr(
279 unabridged,
280 tracing::instrument(level = "trace", skip(self, visitor))
281 )]
282 fn deserialize_unit_struct<V>(self, name: &'static str, visitor: V) -> Result<V::Value>
283 where
284 V: Visitor<'de>,
285 {
286 match name {
287 | "Ignore" => self.record_ignore(),
288 | "IgnoreAll" => self.record_ignore_all(),
289 | _ => unhandled!("Unrecognized deserialization Directive {name:?}"),
290 }
291
292 visitor.visit_unit()
293 }
294
295 #[cfg_attr(
296 unabridged,
297 tracing::instrument(level = "trace", skip(self, visitor))
298 )]
299 fn deserialize_newtype_struct<V>(self, name: &'static str, visitor: V) -> Result<V::Value>
300 where
301 V: Visitor<'de>,
302 {
303 match name {
304 | "$serde_json::private::RawValue" => visitor.visit_map(self),
305 | "Json" => visitor
306 .visit_newtype_struct(&mut serde_json::Deserializer::from_slice(
307 self.record_trail(),
308 ))
309 .map_err(|e| Self::Error::SerdeDe(format!("{name}: {e}").into())),
310
311 | "Cbor" => visitor
312 .visit_newtype_struct(&mut minicbor_serde::Deserializer::new(self.record_trail()))
313 .map_err(|e| Self::Error::SerdeDe(format!("{name}: {e}").into())),
314
315 | _ => visitor.visit_newtype_struct(self),
316 }
317 }
318
319 #[cfg_attr(
320 unabridged,
321 tracing::instrument(level = "trace", skip(self, _visitor))
322 )]
323 fn deserialize_enum<V>(
324 self,
325 _name: &'static str,
326 _variants: &'static [&'static str],
327 _visitor: V,
328 ) -> Result<V::Value>
329 where
330 V: Visitor<'de>,
331 {
332 unhandled!("deserialize Enum not implemented")
333 }
334
335 #[cfg_attr(unabridged, tracing::instrument(level = "trace", skip_all))]
336 fn deserialize_option<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
337 if self
338 .buf
339 .get(self.pos)
340 .is_none_or(|b| *b == Deserializer::SEP)
341 {
342 visitor.visit_none()
343 } else {
344 visitor.visit_some(self)
345 }
346 }
347
348 #[cfg_attr(unabridged, tracing::instrument(level = "trace", skip_all))]
349 fn deserialize_bool<V: Visitor<'de>>(self, _visitor: V) -> Result<V::Value> {
350 unhandled!("deserialize bool not implemented")
351 }
352
353 #[cfg_attr(unabridged, tracing::instrument(level = "trace", skip_all))]
354 fn deserialize_i8<V: Visitor<'de>>(self, _visitor: V) -> Result<V::Value> {
355 unhandled!("deserialize i8 not implemented")
356 }
357
358 #[cfg_attr(unabridged, tracing::instrument(level = "trace", skip_all))]
359 fn deserialize_i16<V: Visitor<'de>>(self, _visitor: V) -> Result<V::Value> {
360 unhandled!("deserialize i16 not implemented")
361 }
362
363 #[cfg_attr(unabridged, tracing::instrument(level = "trace", skip_all))]
364 fn deserialize_i32<V: Visitor<'de>>(self, _visitor: V) -> Result<V::Value> {
365 unhandled!("deserialize i32 not implemented")
366 }
367
368 #[cfg_attr(unabridged, tracing::instrument(level = "trace", skip_all))]
369 fn deserialize_i64<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
370 const BYTES: usize = size_of::<i64>();
371
372 let end = self.pos.saturating_add(BYTES).min(self.buf.len());
373 let bytes: ArrayVec<u8, BYTES> = self.buf[self.pos..end].try_into()?;
374 let bytes = bytes
375 .into_inner()
376 .map_err(|_| Self::Error::SerdeDe("i64 buffer underflow".into()))?;
377
378 self.inc_pos(BYTES);
379 visitor.visit_i64(i64::from_be_bytes(bytes))
380 }
381
382 #[cfg_attr(unabridged, tracing::instrument(level = "trace", skip_all))]
383 fn deserialize_u8<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
384 let byte = self
385 .buf
386 .get(self.pos)
387 .copied()
388 .ok_or_else(|| Self::Error::SerdeDe("u8 buffer underflow".into()))?;
389
390 self.inc_pos(1);
391 visitor.visit_u8(byte)
392 }
393
394 #[cfg_attr(unabridged, tracing::instrument(level = "trace", skip_all))]
395 fn deserialize_u16<V: Visitor<'de>>(self, _visitor: V) -> Result<V::Value> {
396 unhandled!("deserialize u16 not implemented")
397 }
398
399 #[cfg_attr(unabridged, tracing::instrument(level = "trace", skip_all))]
400 fn deserialize_u32<V: Visitor<'de>>(self, _visitor: V) -> Result<V::Value> {
401 unhandled!("deserialize u32 not implemented")
402 }
403
404 #[cfg_attr(unabridged, tracing::instrument(level = "trace", skip_all))]
405 fn deserialize_u64<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
406 const BYTES: usize = size_of::<u64>();
407
408 let end = self.pos.saturating_add(BYTES).min(self.buf.len());
409 let bytes: ArrayVec<u8, BYTES> = self.buf[self.pos..end].try_into()?;
410 let bytes = bytes
411 .into_inner()
412 .map_err(|_| Self::Error::SerdeDe("u64 buffer underflow".into()))?;
413
414 self.inc_pos(BYTES);
415 visitor.visit_u64(u64::from_be_bytes(bytes))
416 }
417
418 #[cfg_attr(unabridged, tracing::instrument(level = "trace", skip_all))]
419 fn deserialize_f32<V: Visitor<'de>>(self, _visitor: V) -> Result<V::Value> {
420 unhandled!("deserialize f32 not implemented")
421 }
422
423 #[cfg_attr(unabridged, tracing::instrument(level = "trace", skip_all))]
424 fn deserialize_f64<V: Visitor<'de>>(self, _visitor: V) -> Result<V::Value> {
425 unhandled!("deserialize f64 not implemented")
426 }
427
428 #[cfg_attr(unabridged, tracing::instrument(level = "trace", skip_all))]
429 fn deserialize_char<V: Visitor<'de>>(self, _visitor: V) -> Result<V::Value> {
430 unhandled!("deserialize char not implemented")
431 }
432
433 #[cfg_attr(unabridged, tracing::instrument(level = "trace", skip_all))]
434 fn deserialize_str<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
435 let input = self.record_next();
436 let out = deserialize_str(input)?;
437 visitor.visit_borrowed_str(out)
438 }
439
440 #[cfg_attr(unabridged, tracing::instrument(level = "trace", skip_all))]
441 fn deserialize_string<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
442 let input = self.record_next();
443 let out = string::string_from_bytes(input)?;
444 visitor.visit_string(out)
445 }
446
447 #[cfg_attr(unabridged, tracing::instrument(level = "trace", skip_all))]
448 fn deserialize_bytes<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
449 let input = self.record_trail();
450 visitor.visit_borrowed_bytes(input)
451 }
452
453 #[cfg_attr(unabridged, tracing::instrument(level = "trace", skip_all))]
454 fn deserialize_byte_buf<V: Visitor<'de>>(self, _visitor: V) -> Result<V::Value> {
455 unhandled!("deserialize Byte Buf not implemented")
456 }
457
458 #[cfg_attr(unabridged, tracing::instrument(level = "trace", skip_all))]
459 fn deserialize_unit<V: Visitor<'de>>(self, _visitor: V) -> Result<V::Value> {
460 unhandled!("deserialize Unit not implemented")
461 }
462
463 #[cfg_attr(unabridged, tracing::instrument(level = "trace", skip_all))]
465 fn deserialize_identifier<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
466 let input = "$serde_json::private::RawValue";
467 visitor.visit_borrowed_str(input)
468 }
469
470 #[cfg_attr(unabridged, tracing::instrument(level = "trace", skip_all))]
471 fn deserialize_ignored_any<V: Visitor<'de>>(self, _visitor: V) -> Result<V::Value> {
472 unhandled!("deserialize Ignored Any not implemented")
473 }
474
475 #[cfg_attr(
476 unabridged,
477 tracing::instrument(level = "trace", skip_all, fields(?self.buf))
478 )]
479 fn deserialize_any<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
480 const TYPE_PRE_1_91: &str = "serde_json::value::de::<impl serde_core::de::Deserialize \
481 for serde_json::value::Value>::deserialize::ValueVisitor";
482 const TYPE: &str = "serde_json::value::de::<impl serde_core::de::Deserialize<'_> for \
483 serde_json::value::Value>::deserialize::ValueVisitor";
484 debug_assert!(
485 matches!(tuwunel_core::debug::type_name::<V>(), TYPE | TYPE_PRE_1_91),
486 "deserialize_any: type not expected {0}",
487 tuwunel_core::debug::type_name::<V>()
488 );
489
490 match self.record_peek_byte() {
491 | Some(b'{') => self.deserialize_map(visitor),
492 | Some(b'[') => serde_json::Deserializer::from_slice(self.record_next())
493 .deserialize_seq(visitor)
494 .map_err(Into::into),
495
496 | _ => self.deserialize_str(visitor),
497 }
498 }
499}
500
501impl<'a, 'de: 'a> de::SeqAccess<'de> for &'a mut Deserializer<'de> {
502 type Error = Error;
503
504 #[cfg_attr(
505 unabridged,
506 tracing::instrument(level = "trace", skip(self, seed))
507 )]
508 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>>
509 where
510 T: DeserializeSeed<'de>,
511 {
512 let finished = self.pos >= self.buf.len();
514
515 let complete = self.rec >= self.seq;
517
518 if finished && complete {
531 return Ok(None);
532 }
533
534 self.record_start();
535 seed.deserialize(&mut **self).map(Some)
536 }
537}
538
539impl<'a, 'de: 'a> de::MapAccess<'de> for &'a mut Deserializer<'de> {
542 type Error = Error;
543
544 #[cfg_attr(
545 unabridged,
546 tracing::instrument(level = "trace", skip(self, seed))
547 )]
548 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>
549 where
550 K: DeserializeSeed<'de>,
551 {
552 seed.deserialize(&mut **self).map(Some)
553 }
554
555 #[cfg_attr(
556 unabridged,
557 tracing::instrument(level = "trace", skip(self, seed))
558 )]
559 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value>
560 where
561 V: DeserializeSeed<'de>,
562 {
563 seed.deserialize(&mut **self)
564 }
565}
566
567#[inline]
570fn deserialize_str(input: &[u8]) -> Result<&str> { string::str_from_bytes(input) }
571
572#[cfg(disable)]
574#[inline]
575fn deserialize_str(input: &[u8]) -> Result<&str> {
576 unsafe { std::str::from_utf8_unchecked(input) }
580}