Skip to main content

sacp_cbor/
serde_impl.rs

1use alloc::string::String;
2use alloc::vec::Vec;
3use core::fmt;
4use serde::de::{
5    self, Deserialize, DeserializeSeed, EnumAccess, IntoDeserializer, MapAccess, SeqAccess,
6    VariantAccess, Visitor,
7};
8use serde::ser::{self, SerializeMap, SerializeSeq};
9use serde::Deserializer;
10use serde::Serialize;
11
12use crate::alloc_util;
13use crate::canonical::{CanonicalCbor, CanonicalCborRef};
14use crate::codec::{ArrayDecoder, CborDecode, Decoder, MapDecoder};
15use crate::encode::Encoder;
16use crate::profile::{check_encoded_key_order, cmp_text_keys_canonical};
17use crate::query::{CborKind, CborValueRef};
18use crate::scalar::F64Bits;
19use crate::{CborError, DecodeLimits, ErrorCode};
20
21const RAW_VALUE_MARKER: &str = "$__sacp_cbor_raw_value";
22
23#[derive(Debug, Clone, Copy, PartialEq, Eq)]
24enum MapKeyMode {
25    Strict,
26    SortKeys,
27}
28
29fn check_map_key_order(
30    enc: &mut Encoder,
31    prev_key_range: Option<(usize, usize)>,
32    key_start: usize,
33    key_end: usize,
34    entry_start: usize,
35) -> Result<(), SerdeError> {
36    if let Some((ps, pe)) = prev_key_range {
37        let buf = enc.as_bytes();
38        let prev = &buf[ps..pe];
39        let curr = &buf[key_start..key_end];
40        if let Err(code) = check_encoded_key_order(prev, curr) {
41            enc.truncate(entry_start);
42            return Err(SerdeError::with_code(code));
43        }
44    }
45    Ok(())
46}
47
48/// Serialize a Rust value into canonical SACP-CBOR/1 bytes.
49///
50/// # Errors
51///
52/// Returns an error if the value cannot be represented under SACP-CBOR/1 constraints.
53pub fn to_vec<T: Serialize>(value: &T) -> Result<Vec<u8>, CborError> {
54    let mut enc = Encoder::new();
55    value
56        .serialize(EncoderSerializer::new(&mut enc))
57        .map_err(|err| CborError::new(err.code, 0))?;
58    Ok(enc.into_vec())
59}
60
61/// Serialize a Rust value into canonical SACP-CBOR/1 bytes while sorting map keys.
62///
63/// This is an opt-in convenience API that allows encoding Rust map types with
64/// non-canonical iteration order (e.g., `HashMap`, or `BTreeMap` where canonical
65/// ordering differs from lexicographic ordering) by buffering and sorting map
66/// keys according to the SACP-CBOR/1 canonical ordering rule.
67///
68/// # Errors
69///
70/// Returns an error if the value cannot be represented under SACP-CBOR/1 constraints.
71pub fn to_vec_sorted_maps<T: Serialize>(value: &T) -> Result<Vec<u8>, CborError> {
72    let mut enc = Encoder::new();
73    value
74        .serialize(EncoderSerializer::new_sorted_maps(&mut enc))
75        .map_err(|err| CborError::new(err.code, 0))?;
76    Ok(enc.into_vec())
77}
78
79/// Deserialize a Rust value from canonical SACP-CBOR/1 bytes.
80///
81/// This validates and deserializes in a single pass over the input.
82///
83/// # Errors
84///
85/// Returns an error if bytes are invalid or if the decoded value doesn't match the target type.
86pub fn from_slice<'de, T: Deserialize<'de>>(
87    bytes: &'de [u8],
88    limits: DecodeLimits,
89) -> Result<T, CborError> {
90    let mut decoder = Decoder::<true>::new_checked(bytes, limits)?;
91    let value = T::deserialize(&mut decoder).map_err(DeError::into_cbor_error)?;
92    if decoder.position() != bytes.len() {
93        return Err(CborError::new(ErrorCode::TrailingBytes, decoder.position()));
94    }
95    Ok(value)
96}
97
98#[derive(Debug, Clone, Copy)]
99struct SerdeError {
100    code: ErrorCode,
101}
102
103impl SerdeError {
104    const fn with_code(code: ErrorCode) -> Self {
105        Self { code }
106    }
107}
108
109impl fmt::Display for SerdeError {
110    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
111        let err = CborError::new(self.code, 0);
112        fmt::Display::fmt(&err, f)
113    }
114}
115
116#[cfg(feature = "std")]
117impl std::error::Error for SerdeError {}
118
119impl serde::ser::Error for SerdeError {
120    fn custom<T: fmt::Display>(_msg: T) -> Self {
121        Self::with_code(ErrorCode::SerdeError)
122    }
123}
124
125impl From<CborError> for SerdeError {
126    fn from(err: CborError) -> Self {
127        Self::with_code(err.code)
128    }
129}
130
131struct EncoderSerializer<'a> {
132    enc: &'a mut Encoder,
133    mode: MapKeyMode,
134}
135
136impl<'a> EncoderSerializer<'a> {
137    fn new(enc: &'a mut Encoder) -> Self {
138        Self::with_mode(enc, MapKeyMode::Strict)
139    }
140
141    fn new_sorted_maps(enc: &'a mut Encoder) -> Self {
142        Self::with_mode(enc, MapKeyMode::SortKeys)
143    }
144
145    fn with_mode(enc: &'a mut Encoder, mode: MapKeyMode) -> Self {
146        Self { enc, mode }
147    }
148
149    #[inline]
150    fn encode_with<FEmit, FRoot>(self, emit: FEmit, root: FRoot) -> Result<(), SerdeError>
151    where
152        FEmit: FnOnce(&mut Encoder) -> Result<(), CborError>,
153        FRoot: FnOnce(&mut Encoder) -> Result<(), CborError>,
154    {
155        let res = if self.enc.in_container() {
156            emit(self.enc)
157        } else {
158            root(self.enc)
159        };
160        res.map_err(SerdeError::from)
161    }
162}
163
164impl<'a> ser::Serializer for EncoderSerializer<'a> {
165    type Ok = ();
166    type Error = SerdeError;
167
168    type SerializeSeq = SeqSerializer<'a>;
169    type SerializeTuple = SeqSerializer<'a>;
170    type SerializeTupleStruct = SeqSerializer<'a>;
171    type SerializeTupleVariant = TupleVariantSerializer<'a>;
172    type SerializeMap = MapSerializer<'a>;
173    type SerializeStruct = StructSerializer<'a>;
174    type SerializeStructVariant = StructVariantSerializer<'a>;
175
176    fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
177        self.encode_with(|enc| enc.emit_bool(v), |enc| enc.bool(v))
178    }
179
180    fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
181        self.encode_with(
182            |enc| enc.emit_int(i64::from(v)),
183            |enc| enc.int(i64::from(v)),
184        )
185    }
186
187    fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
188        self.encode_with(
189            |enc| enc.emit_int(i64::from(v)),
190            |enc| enc.int(i64::from(v)),
191        )
192    }
193
194    fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
195        self.encode_with(
196            |enc| enc.emit_int(i64::from(v)),
197            |enc| enc.int(i64::from(v)),
198        )
199    }
200
201    fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
202        self.encode_with(|enc| enc.emit_int(v), |enc| enc.int(v))
203    }
204
205    fn serialize_i128(self, v: i128) -> Result<Self::Ok, Self::Error> {
206        self.encode_with(|enc| enc.emit_int_i128(v), |enc| enc.int_i128(v))
207    }
208
209    fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
210        self.encode_with(
211            |enc| enc.emit_int(i64::from(v)),
212            |enc| enc.int(i64::from(v)),
213        )
214    }
215
216    fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
217        self.encode_with(
218            |enc| enc.emit_int(i64::from(v)),
219            |enc| enc.int(i64::from(v)),
220        )
221    }
222
223    fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
224        self.encode_with(
225            |enc| enc.emit_int(i64::from(v)),
226            |enc| enc.int(i64::from(v)),
227        )
228    }
229
230    fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
231        self.encode_with(
232            |enc| enc.emit_int_u128(u128::from(v)),
233            |enc| enc.int_u128(u128::from(v)),
234        )
235    }
236
237    fn serialize_u128(self, v: u128) -> Result<Self::Ok, Self::Error> {
238        self.encode_with(|enc| enc.emit_int_u128(v), |enc| enc.int_u128(v))
239    }
240
241    fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
242        self.serialize_f64(f64::from(v))
243    }
244
245    fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
246        let bits = F64Bits::try_from_f64(v).map_err(SerdeError::from)?;
247        self.encode_with(|enc| enc.emit_float(bits), |enc| enc.float(bits))
248    }
249
250    fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
251        let mut buf = [0u8; 4];
252        let s = v.encode_utf8(&mut buf);
253        self.encode_with(|enc| enc.emit_text(s), |enc| enc.text(s))
254    }
255
256    fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
257        self.encode_with(|enc| enc.emit_text(v), |enc| enc.text(v))
258    }
259
260    fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
261        self.encode_with(|enc| enc.emit_bytes(v), |enc| enc.bytes(v))
262    }
263
264    fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
265        self.encode_with(Encoder::emit_null, Encoder::null)
266    }
267
268    fn serialize_some<T: ?Sized + Serialize>(self, value: &T) -> Result<Self::Ok, Self::Error> {
269        value.serialize(self)
270    }
271
272    fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
273        self.encode_with(Encoder::emit_null, Encoder::null)
274    }
275
276    fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> {
277        self.encode_with(Encoder::emit_null, Encoder::null)
278    }
279
280    fn serialize_unit_variant(
281        self,
282        _name: &'static str,
283        _variant_index: u32,
284        variant: &'static str,
285    ) -> Result<Self::Ok, Self::Error> {
286        self.encode_with(|enc| enc.emit_text(variant), |enc| enc.text(variant))
287    }
288
289    fn serialize_newtype_struct<T: ?Sized + Serialize>(
290        self,
291        _name: &'static str,
292        value: &T,
293    ) -> Result<Self::Ok, Self::Error> {
294        value.serialize(self)
295    }
296
297    fn serialize_newtype_variant<T: ?Sized + Serialize>(
298        self,
299        _name: &'static str,
300        _variant_index: u32,
301        variant: &'static str,
302        value: &T,
303    ) -> Result<Self::Ok, Self::Error> {
304        let map = start_enum_map(self.enc, variant)?;
305        if let Err(err) = value.serialize(EncoderSerializer::with_mode(self.enc, self.mode)) {
306            self.enc.truncate(map.start);
307            self.enc.abort_container();
308            return Err(err);
309        }
310        self.enc.finish_container(map.root);
311        Ok(())
312    }
313
314    fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
315        let len = len.ok_or_else(|| SerdeError::with_code(ErrorCode::IndefiniteLengthForbidden))?;
316        let root = self.enc.array_header(len).map_err(SerdeError::from)?;
317        Ok(SeqSerializer::new(self.enc, len, root, self.mode))
318    }
319
320    fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error> {
321        let root = self.enc.array_header(len).map_err(SerdeError::from)?;
322        Ok(SeqSerializer::new(self.enc, len, root, self.mode))
323    }
324
325    fn serialize_tuple_struct(
326        self,
327        _name: &'static str,
328        len: usize,
329    ) -> Result<Self::SerializeTupleStruct, Self::Error> {
330        let root = self.enc.array_header(len).map_err(SerdeError::from)?;
331        Ok(SeqSerializer::new(self.enc, len, root, self.mode))
332    }
333
334    fn serialize_tuple_variant(
335        self,
336        _name: &'static str,
337        _variant_index: u32,
338        variant: &'static str,
339        len: usize,
340    ) -> Result<Self::SerializeTupleVariant, Self::Error> {
341        let map = start_enum_map(self.enc, variant)?;
342        if let Err(err) = self.enc.array_header(len) {
343            self.enc.truncate(map.start);
344            self.enc.abort_container();
345            return Err(SerdeError::from(err));
346        }
347        Ok(TupleVariantSerializer::new(self.enc, len, map, self.mode))
348    }
349
350    fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
351        let len = len.ok_or_else(|| SerdeError::with_code(ErrorCode::IndefiniteLengthForbidden))?;
352        let root = self.enc.map_header(len).map_err(SerdeError::from)?;
353        MapSerializer::new(self.enc, len, root, self.mode)
354    }
355
356    fn serialize_struct(
357        self,
358        _name: &'static str,
359        len: usize,
360    ) -> Result<Self::SerializeStruct, Self::Error> {
361        let root = self.enc.map_header(len).map_err(SerdeError::from)?;
362        StructSerializer::new(self.enc, len, root, self.mode)
363    }
364
365    fn serialize_struct_variant(
366        self,
367        _name: &'static str,
368        _variant_index: u32,
369        variant: &'static str,
370        len: usize,
371    ) -> Result<Self::SerializeStructVariant, Self::Error> {
372        let map = start_enum_map(self.enc, variant)?;
373        if let Err(err) = self.enc.map_header(len) {
374            self.enc.truncate(map.start);
375            self.enc.abort_container();
376            return Err(SerdeError::from(err));
377        }
378        StructVariantSerializer::new(self.enc, len, map, self.mode)
379    }
380}
381
382#[derive(Copy, Clone)]
383struct EnumMapState {
384    start: usize,
385    root: bool,
386}
387
388fn start_enum_map(enc: &mut Encoder, variant: &str) -> Result<EnumMapState, SerdeError> {
389    let start = enc.buf_len();
390    let root = match enc.map_header(1) {
391        Ok(root) => root,
392        Err(err) => {
393            enc.truncate(start);
394            return Err(SerdeError::from(err));
395        }
396    };
397    if let Err(err) = enc.emit_text(variant) {
398        enc.truncate(start);
399        enc.abort_container();
400        return Err(SerdeError::from(err));
401    }
402    Ok(EnumMapState { start, root })
403}
404
405struct SeqSerializer<'a> {
406    enc: &'a mut Encoder,
407    remaining: usize,
408    root: bool,
409    finished: bool,
410    mode: MapKeyMode,
411}
412
413impl<'a> SeqSerializer<'a> {
414    fn new(enc: &'a mut Encoder, remaining: usize, root: bool, mode: MapKeyMode) -> Self {
415        Self {
416            enc,
417            remaining,
418            root,
419            finished: false,
420            mode,
421        }
422    }
423}
424
425impl SerializeSeq for SeqSerializer<'_> {
426    type Ok = ();
427    type Error = SerdeError;
428
429    fn serialize_element<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<(), SerdeError> {
430        if self.remaining == 0 {
431            return Err(SerdeError::with_code(ErrorCode::ArrayLenMismatch));
432        }
433        value.serialize(EncoderSerializer::with_mode(self.enc, self.mode))?;
434        self.remaining -= 1;
435        Ok(())
436    }
437
438    fn end(self) -> Result<(), SerdeError> {
439        if self.remaining != 0 {
440            return Err(SerdeError::with_code(ErrorCode::ArrayLenMismatch));
441        }
442        let mut this = self;
443        this.enc.finish_container(this.root);
444        this.finished = true;
445        Ok(())
446    }
447}
448
449impl Drop for SeqSerializer<'_> {
450    fn drop(&mut self) {
451        if !self.finished {
452            self.enc.abort_container();
453        }
454    }
455}
456
457impl ser::SerializeTuple for SeqSerializer<'_> {
458    type Ok = ();
459    type Error = SerdeError;
460
461    fn serialize_element<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<(), SerdeError> {
462        SerializeSeq::serialize_element(self, value)
463    }
464
465    fn end(self) -> Result<(), SerdeError> {
466        SerializeSeq::end(self)
467    }
468}
469
470impl ser::SerializeTupleStruct for SeqSerializer<'_> {
471    type Ok = ();
472    type Error = SerdeError;
473
474    fn serialize_field<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<(), SerdeError> {
475        SerializeSeq::serialize_element(self, value)
476    }
477
478    fn end(self) -> Result<(), SerdeError> {
479        SerializeSeq::end(self)
480    }
481}
482
483struct TupleVariantSerializer<'a> {
484    enc: &'a mut Encoder,
485    remaining: usize,
486    map_start: usize,
487    map_root: bool,
488    finished: bool,
489    mode: MapKeyMode,
490}
491
492impl<'a> TupleVariantSerializer<'a> {
493    fn new(enc: &'a mut Encoder, remaining: usize, map: EnumMapState, mode: MapKeyMode) -> Self {
494        Self {
495            enc,
496            remaining,
497            map_start: map.start,
498            map_root: map.root,
499            finished: false,
500            mode,
501        }
502    }
503}
504
505impl ser::SerializeTupleVariant for TupleVariantSerializer<'_> {
506    type Ok = ();
507    type Error = SerdeError;
508
509    fn serialize_field<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<(), SerdeError> {
510        if self.remaining == 0 {
511            return Err(SerdeError::with_code(ErrorCode::ArrayLenMismatch));
512        }
513        value.serialize(EncoderSerializer::with_mode(self.enc, self.mode))?;
514        self.remaining -= 1;
515        Ok(())
516    }
517
518    fn end(self) -> Result<(), SerdeError> {
519        if self.remaining != 0 {
520            return Err(SerdeError::with_code(ErrorCode::ArrayLenMismatch));
521        }
522        let mut this = self;
523        this.enc.finish_container(false);
524        this.enc.finish_container(this.map_root);
525        this.finished = true;
526        Ok(())
527    }
528}
529
530impl Drop for TupleVariantSerializer<'_> {
531    fn drop(&mut self) {
532        if !self.finished {
533            self.enc.truncate(self.map_start);
534            self.enc.abort_container();
535            self.enc.abort_container();
536        }
537    }
538}
539
540struct PendingKey {
541    entry_start: usize,
542    key_start: usize,
543    key_end: usize,
544}
545
546struct SortedEntry {
547    key: String,
548    value: Vec<u8>,
549}
550
551fn push_sorted_entry<T: ?Sized + Serialize>(
552    entries: &mut Vec<SortedEntry>,
553    key: &'static str,
554    value: &T,
555    remaining: &mut usize,
556    mode: MapKeyMode,
557) -> Result<(), SerdeError> {
558    if *remaining == 0 {
559        return Err(SerdeError::with_code(ErrorCode::MapLenMismatch));
560    }
561
562    let mut tmp = Encoder::new();
563    value.serialize(EncoderSerializer::with_mode(&mut tmp, mode))?;
564    let value = tmp.into_canonical().map_err(SerdeError::from)?.into_bytes();
565    let key = alloc_util::try_string_from_str(key, 0).map_err(SerdeError::from)?;
566    entries.push(SortedEntry { key, value });
567    *remaining -= 1;
568    Ok(())
569}
570
571fn finish_sorted_entries(
572    enc: &mut Encoder,
573    entries: &mut [SortedEntry],
574    remaining: usize,
575    roots: &[bool],
576) -> Result<(), SerdeError> {
577    if remaining != 0 {
578        return Err(SerdeError::with_code(ErrorCode::MapLenMismatch));
579    }
580
581    entries.sort_by(|a, b| cmp_text_keys_canonical(&a.key, &b.key));
582    for window in entries.windows(2) {
583        if window[0].key == window[1].key {
584            return Err(SerdeError::with_code(ErrorCode::DuplicateMapKey));
585        }
586    }
587
588    for entry in entries.iter() {
589        enc.emit_text(&entry.key).map_err(SerdeError::from)?;
590        enc.emit_raw_bytes(&entry.value).map_err(SerdeError::from)?;
591    }
592
593    for &root in roots {
594        enc.finish_container(root);
595    }
596    Ok(())
597}
598
599enum MapState {
600    Strict {
601        prev_key_range: Option<(usize, usize)>,
602        pending: Option<PendingKey>,
603    },
604    Sorted {
605        entries: Vec<SortedEntry>,
606        pending_key: Option<String>,
607    },
608}
609
610struct MapSerializer<'a> {
611    enc: &'a mut Encoder,
612    remaining: usize,
613    root: bool,
614    finished: bool,
615    mode: MapKeyMode,
616    state: MapState,
617}
618
619impl<'a> MapSerializer<'a> {
620    fn new(
621        enc: &'a mut Encoder,
622        remaining: usize,
623        root: bool,
624        mode: MapKeyMode,
625    ) -> Result<Self, SerdeError> {
626        let state = match mode {
627            MapKeyMode::Strict => MapState::Strict {
628                prev_key_range: None,
629                pending: None,
630            },
631            MapKeyMode::SortKeys => MapState::Sorted {
632                entries: alloc_util::try_vec_with_capacity::<SortedEntry>(remaining, 0)
633                    .map_err(SerdeError::from)?,
634                pending_key: None,
635            },
636        };
637        Ok(Self {
638            enc,
639            remaining,
640            root,
641            finished: false,
642            mode,
643            state,
644        })
645    }
646
647    fn write_pending_key<T: ?Sized + Serialize>(
648        &mut self,
649        key: &T,
650        prev_key_range: Option<(usize, usize)>,
651    ) -> Result<PendingKey, SerdeError> {
652        let entry_start = self.enc.buf_len();
653        let (key_start, key_end) = key.serialize(MapKeySerializer::new(self.enc, entry_start))?;
654
655        check_map_key_order(self.enc, prev_key_range, key_start, key_end, entry_start)?;
656
657        Ok(PendingKey {
658            entry_start,
659            key_start,
660            key_end,
661        })
662    }
663}
664
665impl SerializeMap for MapSerializer<'_> {
666    type Ok = ();
667    type Error = SerdeError;
668
669    fn serialize_key<T: ?Sized + Serialize>(&mut self, key: &T) -> Result<(), SerdeError> {
670        match &mut self.state {
671            MapState::Strict { .. } => {
672                let (has_pending, prev) = match &self.state {
673                    MapState::Strict {
674                        pending,
675                        prev_key_range,
676                    } => (pending.is_some(), *prev_key_range),
677                    MapState::Sorted { .. } => unreachable!(),
678                };
679                if has_pending {
680                    return Err(SerdeError::with_code(ErrorCode::SerdeError));
681                }
682                if self.remaining == 0 {
683                    return Err(SerdeError::with_code(ErrorCode::MapLenMismatch));
684                }
685                let p = self.write_pending_key(key, prev)?;
686                if let MapState::Strict { pending, .. } = &mut self.state {
687                    *pending = Some(p);
688                }
689                Ok(())
690            }
691            MapState::Sorted { pending_key, .. } => {
692                if pending_key.is_some() {
693                    return Err(SerdeError::with_code(ErrorCode::SerdeError));
694                }
695                if self.remaining == 0 {
696                    return Err(SerdeError::with_code(ErrorCode::MapLenMismatch));
697                }
698                let k = key.serialize(MapKeyStringSerializer)?;
699                *pending_key = Some(k);
700                Ok(())
701            }
702        }
703    }
704
705    fn serialize_value<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<(), SerdeError> {
706        match &mut self.state {
707            MapState::Strict {
708                prev_key_range,
709                pending,
710            } => {
711                let p = pending
712                    .take()
713                    .ok_or_else(|| SerdeError::with_code(ErrorCode::SerdeError))?;
714
715                if let Err(err) = value.serialize(EncoderSerializer::with_mode(self.enc, self.mode))
716                {
717                    self.enc.truncate(p.entry_start);
718                    return Err(err);
719                }
720
721                *prev_key_range = Some((p.key_start, p.key_end));
722                self.remaining -= 1;
723                Ok(())
724            }
725            MapState::Sorted {
726                entries,
727                pending_key,
728            } => {
729                let key = pending_key
730                    .take()
731                    .ok_or_else(|| SerdeError::with_code(ErrorCode::SerdeError))?;
732
733                let mut tmp = Encoder::new();
734                value.serialize(EncoderSerializer::with_mode(&mut tmp, self.mode))?;
735                let value = tmp.into_canonical().map_err(SerdeError::from)?.into_bytes();
736
737                entries.push(SortedEntry { key, value });
738                self.remaining -= 1;
739                Ok(())
740            }
741        }
742    }
743
744    fn serialize_entry<K: ?Sized + Serialize, V: ?Sized + Serialize>(
745        &mut self,
746        key: &K,
747        value: &V,
748    ) -> Result<(), SerdeError> {
749        match &mut self.state {
750            MapState::Strict { .. } => {
751                if self.remaining == 0 {
752                    return Err(SerdeError::with_code(ErrorCode::MapLenMismatch));
753                }
754                let prev = match &self.state {
755                    MapState::Strict { prev_key_range, .. } => *prev_key_range,
756                    MapState::Sorted { .. } => unreachable!(),
757                };
758                let p = self.write_pending_key(key, prev)?;
759                if let Err(err) = value.serialize(EncoderSerializer::with_mode(self.enc, self.mode))
760                {
761                    self.enc.truncate(p.entry_start);
762                    return Err(err);
763                }
764                if let MapState::Strict { prev_key_range, .. } = &mut self.state {
765                    *prev_key_range = Some((p.key_start, p.key_end));
766                }
767                self.remaining -= 1;
768                Ok(())
769            }
770            MapState::Sorted { entries, .. } => {
771                if self.remaining == 0 {
772                    return Err(SerdeError::with_code(ErrorCode::MapLenMismatch));
773                }
774                let key = key.serialize(MapKeyStringSerializer)?;
775
776                let mut tmp = Encoder::new();
777                value.serialize(EncoderSerializer::with_mode(&mut tmp, self.mode))?;
778                let value = tmp.into_canonical().map_err(SerdeError::from)?.into_bytes();
779
780                entries.push(SortedEntry { key, value });
781                self.remaining -= 1;
782                Ok(())
783            }
784        }
785    }
786
787    fn end(self) -> Result<(), SerdeError> {
788        if self.remaining != 0 {
789            return Err(SerdeError::with_code(ErrorCode::MapLenMismatch));
790        }
791
792        let mut this = self;
793        match &mut this.state {
794            MapState::Strict { pending, .. } => {
795                if pending.is_some() {
796                    return Err(SerdeError::with_code(ErrorCode::SerdeError));
797                }
798            }
799            MapState::Sorted {
800                entries,
801                pending_key,
802            } => {
803                if pending_key.is_some() {
804                    return Err(SerdeError::with_code(ErrorCode::SerdeError));
805                }
806
807                entries.sort_by(|a, b| cmp_text_keys_canonical(&a.key, &b.key));
808                for w in entries.windows(2) {
809                    if w[0].key == w[1].key {
810                        return Err(SerdeError::with_code(ErrorCode::DuplicateMapKey));
811                    }
812                }
813
814                for e in entries.iter() {
815                    this.enc.emit_text(&e.key).map_err(SerdeError::from)?;
816                    this.enc
817                        .emit_raw_bytes(&e.value)
818                        .map_err(SerdeError::from)?;
819                }
820            }
821        }
822
823        this.enc.finish_container(this.root);
824        this.finished = true;
825        Ok(())
826    }
827}
828
829impl Drop for MapSerializer<'_> {
830    fn drop(&mut self) {
831        if !self.finished {
832            self.enc.abort_container();
833        }
834    }
835}
836
837struct StructSerializer<'a> {
838    enc: &'a mut Encoder,
839    remaining: usize,
840    entries: Vec<SortedEntry>,
841    root: bool,
842    finished: bool,
843    mode: MapKeyMode,
844}
845
846impl<'a> StructSerializer<'a> {
847    fn new(
848        enc: &'a mut Encoder,
849        remaining: usize,
850        root: bool,
851        mode: MapKeyMode,
852    ) -> Result<Self, SerdeError> {
853        Ok(Self {
854            enc,
855            remaining,
856            entries: alloc_util::try_vec_with_capacity::<SortedEntry>(remaining, 0)
857                .map_err(SerdeError::from)?,
858            root,
859            finished: false,
860            mode,
861        })
862    }
863}
864
865impl ser::SerializeStruct for StructSerializer<'_> {
866    type Ok = ();
867    type Error = SerdeError;
868
869    fn serialize_field<T: ?Sized + Serialize>(
870        &mut self,
871        key: &'static str,
872        value: &T,
873    ) -> Result<(), SerdeError> {
874        push_sorted_entry(
875            &mut self.entries,
876            key,
877            value,
878            &mut self.remaining,
879            self.mode,
880        )
881    }
882
883    fn end(self) -> Result<(), SerdeError> {
884        let mut this = self;
885        finish_sorted_entries(this.enc, &mut this.entries, this.remaining, &[this.root])?;
886        this.finished = true;
887        Ok(())
888    }
889}
890
891impl Drop for StructSerializer<'_> {
892    fn drop(&mut self) {
893        if !self.finished {
894            self.enc.abort_container();
895        }
896    }
897}
898
899struct StructVariantSerializer<'a> {
900    enc: &'a mut Encoder,
901    remaining: usize,
902    entries: Vec<SortedEntry>,
903    map_start: usize,
904    map_root: bool,
905    finished: bool,
906    mode: MapKeyMode,
907}
908
909impl<'a> StructVariantSerializer<'a> {
910    fn new(
911        enc: &'a mut Encoder,
912        remaining: usize,
913        map: EnumMapState,
914        mode: MapKeyMode,
915    ) -> Result<Self, SerdeError> {
916        Ok(Self {
917            enc,
918            remaining,
919            entries: alloc_util::try_vec_with_capacity::<SortedEntry>(remaining, 0)
920                .map_err(SerdeError::from)?,
921            map_start: map.start,
922            map_root: map.root,
923            finished: false,
924            mode,
925        })
926    }
927}
928
929impl ser::SerializeStructVariant for StructVariantSerializer<'_> {
930    type Ok = ();
931    type Error = SerdeError;
932
933    fn serialize_field<T: ?Sized + Serialize>(
934        &mut self,
935        key: &'static str,
936        value: &T,
937    ) -> Result<(), SerdeError> {
938        push_sorted_entry(
939            &mut self.entries,
940            key,
941            value,
942            &mut self.remaining,
943            self.mode,
944        )
945    }
946
947    fn end(self) -> Result<(), SerdeError> {
948        let mut this = self;
949        finish_sorted_entries(
950            this.enc,
951            &mut this.entries,
952            this.remaining,
953            &[false, this.map_root],
954        )?;
955        this.finished = true;
956        Ok(())
957    }
958}
959
960impl Drop for StructVariantSerializer<'_> {
961    fn drop(&mut self) {
962        if !self.finished {
963            self.enc.truncate(self.map_start);
964            self.enc.abort_container();
965            self.enc.abort_container();
966        }
967    }
968}
969
970struct MapKeySerializer<'a> {
971    enc: &'a mut Encoder,
972    entry_start: usize,
973}
974
975impl<'a> MapKeySerializer<'a> {
976    fn new(enc: &'a mut Encoder, entry_start: usize) -> Self {
977        Self { enc, entry_start }
978    }
979}
980
981impl ser::Serializer for MapKeySerializer<'_> {
982    type Ok = (usize, usize);
983    type Error = SerdeError;
984
985    type SerializeSeq = ser::Impossible<(usize, usize), SerdeError>;
986    type SerializeTuple = ser::Impossible<(usize, usize), SerdeError>;
987    type SerializeTupleStruct = ser::Impossible<(usize, usize), SerdeError>;
988    type SerializeTupleVariant = ser::Impossible<(usize, usize), SerdeError>;
989    type SerializeMap = ser::Impossible<(usize, usize), SerdeError>;
990    type SerializeStruct = ser::Impossible<(usize, usize), SerdeError>;
991    type SerializeStructVariant = ser::Impossible<(usize, usize), SerdeError>;
992
993    fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
994        let key_start = self.entry_start;
995        if let Err(err) = self.enc.emit_text(v) {
996            self.enc.truncate(self.entry_start);
997            return Err(SerdeError::from(err));
998        }
999        let key_end = self.enc.buf_len();
1000        Ok((key_start, key_end))
1001    }
1002
1003    fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
1004        let mut buf = [0u8; 4];
1005        let s = v.encode_utf8(&mut buf);
1006        self.serialize_str(s)
1007    }
1008
1009    fn serialize_bool(self, _v: bool) -> Result<Self::Ok, Self::Error> {
1010        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1011    }
1012
1013    fn serialize_i8(self, _v: i8) -> Result<Self::Ok, Self::Error> {
1014        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1015    }
1016
1017    fn serialize_i16(self, _v: i16) -> Result<Self::Ok, Self::Error> {
1018        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1019    }
1020
1021    fn serialize_i32(self, _v: i32) -> Result<Self::Ok, Self::Error> {
1022        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1023    }
1024
1025    fn serialize_i64(self, _v: i64) -> Result<Self::Ok, Self::Error> {
1026        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1027    }
1028
1029    fn serialize_i128(self, _v: i128) -> Result<Self::Ok, Self::Error> {
1030        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1031    }
1032
1033    fn serialize_u8(self, _v: u8) -> Result<Self::Ok, Self::Error> {
1034        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1035    }
1036
1037    fn serialize_u16(self, _v: u16) -> Result<Self::Ok, Self::Error> {
1038        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1039    }
1040
1041    fn serialize_u32(self, _v: u32) -> Result<Self::Ok, Self::Error> {
1042        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1043    }
1044
1045    fn serialize_u64(self, _v: u64) -> Result<Self::Ok, Self::Error> {
1046        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1047    }
1048
1049    fn serialize_u128(self, _v: u128) -> Result<Self::Ok, Self::Error> {
1050        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1051    }
1052
1053    fn serialize_f32(self, _v: f32) -> Result<Self::Ok, Self::Error> {
1054        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1055    }
1056
1057    fn serialize_f64(self, _v: f64) -> Result<Self::Ok, Self::Error> {
1058        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1059    }
1060
1061    fn serialize_bytes(self, _v: &[u8]) -> Result<Self::Ok, Self::Error> {
1062        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1063    }
1064
1065    fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
1066        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1067    }
1068
1069    fn serialize_some<T: ?Sized + Serialize>(self, _value: &T) -> Result<Self::Ok, Self::Error> {
1070        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1071    }
1072
1073    fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
1074        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1075    }
1076
1077    fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> {
1078        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1079    }
1080
1081    fn serialize_unit_variant(
1082        self,
1083        _name: &'static str,
1084        _variant_index: u32,
1085        _variant: &'static str,
1086    ) -> Result<Self::Ok, Self::Error> {
1087        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1088    }
1089
1090    fn serialize_newtype_struct<T: ?Sized + Serialize>(
1091        self,
1092        _name: &'static str,
1093        _value: &T,
1094    ) -> Result<Self::Ok, Self::Error> {
1095        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1096    }
1097
1098    fn serialize_newtype_variant<T: ?Sized + Serialize>(
1099        self,
1100        _name: &'static str,
1101        _variant_index: u32,
1102        _variant: &'static str,
1103        _value: &T,
1104    ) -> Result<Self::Ok, Self::Error> {
1105        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1106    }
1107
1108    fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
1109        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1110    }
1111
1112    fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, Self::Error> {
1113        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1114    }
1115
1116    fn serialize_tuple_struct(
1117        self,
1118        _name: &'static str,
1119        _len: usize,
1120    ) -> Result<Self::SerializeTupleStruct, Self::Error> {
1121        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1122    }
1123
1124    fn serialize_tuple_variant(
1125        self,
1126        _name: &'static str,
1127        _variant_index: u32,
1128        _variant: &'static str,
1129        _len: usize,
1130    ) -> Result<Self::SerializeTupleVariant, Self::Error> {
1131        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1132    }
1133
1134    fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
1135        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1136    }
1137
1138    fn serialize_struct(
1139        self,
1140        _name: &'static str,
1141        _len: usize,
1142    ) -> Result<Self::SerializeStruct, Self::Error> {
1143        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1144    }
1145
1146    fn serialize_struct_variant(
1147        self,
1148        _name: &'static str,
1149        _variant_index: u32,
1150        _variant: &'static str,
1151        _len: usize,
1152    ) -> Result<Self::SerializeStructVariant, Self::Error> {
1153        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1154    }
1155}
1156
1157struct MapKeyStringSerializer;
1158
1159impl ser::Serializer for MapKeyStringSerializer {
1160    type Ok = String;
1161    type Error = SerdeError;
1162
1163    type SerializeSeq = ser::Impossible<String, SerdeError>;
1164    type SerializeTuple = ser::Impossible<String, SerdeError>;
1165    type SerializeTupleStruct = ser::Impossible<String, SerdeError>;
1166    type SerializeTupleVariant = ser::Impossible<String, SerdeError>;
1167    type SerializeMap = ser::Impossible<String, SerdeError>;
1168    type SerializeStruct = ser::Impossible<String, SerdeError>;
1169    type SerializeStructVariant = ser::Impossible<String, SerdeError>;
1170
1171    fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
1172        alloc_util::try_string_from_str(v, 0).map_err(SerdeError::from)
1173    }
1174
1175    fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
1176        let mut buf = [0u8; 4];
1177        let s = v.encode_utf8(&mut buf);
1178        self.serialize_str(s)
1179    }
1180
1181    fn serialize_bool(self, _v: bool) -> Result<Self::Ok, Self::Error> {
1182        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1183    }
1184    fn serialize_i8(self, _v: i8) -> Result<Self::Ok, Self::Error> {
1185        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1186    }
1187    fn serialize_i16(self, _v: i16) -> Result<Self::Ok, Self::Error> {
1188        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1189    }
1190    fn serialize_i32(self, _v: i32) -> Result<Self::Ok, Self::Error> {
1191        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1192    }
1193    fn serialize_i64(self, _v: i64) -> Result<Self::Ok, Self::Error> {
1194        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1195    }
1196    fn serialize_i128(self, _v: i128) -> Result<Self::Ok, Self::Error> {
1197        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1198    }
1199    fn serialize_u8(self, _v: u8) -> Result<Self::Ok, Self::Error> {
1200        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1201    }
1202    fn serialize_u16(self, _v: u16) -> Result<Self::Ok, Self::Error> {
1203        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1204    }
1205    fn serialize_u32(self, _v: u32) -> Result<Self::Ok, Self::Error> {
1206        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1207    }
1208    fn serialize_u64(self, _v: u64) -> Result<Self::Ok, Self::Error> {
1209        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1210    }
1211    fn serialize_u128(self, _v: u128) -> Result<Self::Ok, Self::Error> {
1212        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1213    }
1214    fn serialize_f32(self, _v: f32) -> Result<Self::Ok, Self::Error> {
1215        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1216    }
1217    fn serialize_f64(self, _v: f64) -> Result<Self::Ok, Self::Error> {
1218        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1219    }
1220    fn serialize_bytes(self, _v: &[u8]) -> Result<Self::Ok, Self::Error> {
1221        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1222    }
1223    fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
1224        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1225    }
1226    fn serialize_some<T: ?Sized + Serialize>(self, _value: &T) -> Result<Self::Ok, Self::Error> {
1227        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1228    }
1229    fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
1230        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1231    }
1232    fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> {
1233        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1234    }
1235    fn serialize_unit_variant(
1236        self,
1237        _name: &'static str,
1238        _variant_index: u32,
1239        _variant: &'static str,
1240    ) -> Result<Self::Ok, Self::Error> {
1241        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1242    }
1243    fn serialize_newtype_struct<T: ?Sized + Serialize>(
1244        self,
1245        _name: &'static str,
1246        _value: &T,
1247    ) -> Result<Self::Ok, Self::Error> {
1248        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1249    }
1250    fn serialize_newtype_variant<T: ?Sized + Serialize>(
1251        self,
1252        _name: &'static str,
1253        _variant_index: u32,
1254        _variant: &'static str,
1255        _value: &T,
1256    ) -> Result<Self::Ok, Self::Error> {
1257        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1258    }
1259    fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
1260        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1261    }
1262    fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, Self::Error> {
1263        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1264    }
1265    fn serialize_tuple_struct(
1266        self,
1267        _name: &'static str,
1268        _len: usize,
1269    ) -> Result<Self::SerializeTupleStruct, Self::Error> {
1270        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1271    }
1272    fn serialize_tuple_variant(
1273        self,
1274        _name: &'static str,
1275        _variant_index: u32,
1276        _variant: &'static str,
1277        _len: usize,
1278    ) -> Result<Self::SerializeTupleVariant, Self::Error> {
1279        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1280    }
1281    fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
1282        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1283    }
1284    fn serialize_struct(
1285        self,
1286        _name: &'static str,
1287        _len: usize,
1288    ) -> Result<Self::SerializeStruct, Self::Error> {
1289        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1290    }
1291    fn serialize_struct_variant(
1292        self,
1293        _name: &'static str,
1294        _variant_index: u32,
1295        _variant: &'static str,
1296        _len: usize,
1297    ) -> Result<Self::SerializeStructVariant, Self::Error> {
1298        Err(SerdeError::with_code(ErrorCode::MapKeyMustBeText))
1299    }
1300}
1301
1302/// A serde decoding error that preserves an [`ErrorCode`] plus an input offset.
1303#[cfg_attr(docsrs, doc(cfg(feature = "serde")))]
1304#[derive(Debug, Clone, Copy, PartialEq, Eq)]
1305pub struct DeError {
1306    /// Error category.
1307    pub code: ErrorCode,
1308    /// Byte offset within the input where the error was detected.
1309    pub offset: usize,
1310}
1311
1312impl DeError {
1313    #[inline]
1314    #[must_use]
1315    /// Construct a new serde error with a code and offset.
1316    pub const fn new(code: ErrorCode, offset: usize) -> Self {
1317        Self { code, offset }
1318    }
1319
1320    #[inline]
1321    #[must_use]
1322    /// Convert into the crate's [`CborError`].
1323    pub const fn into_cbor_error(self) -> CborError {
1324        CborError::new(self.code, self.offset)
1325    }
1326}
1327
1328impl fmt::Display for DeError {
1329    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1330        let e = CborError::new(self.code, self.offset);
1331        fmt::Display::fmt(&e, f)
1332    }
1333}
1334
1335#[cfg(feature = "std")]
1336impl std::error::Error for DeError {}
1337
1338impl serde::de::Error for DeError {
1339    fn custom<T: fmt::Display>(_msg: T) -> Self {
1340        Self::new(ErrorCode::SerdeError, 0)
1341    }
1342}
1343
1344impl From<CborError> for DeError {
1345    fn from(e: CborError) -> Self {
1346        Self::new(e.code, e.offset)
1347    }
1348}
1349
1350impl crate::wire::DecodeError for DeError {
1351    #[inline]
1352    fn new(code: ErrorCode, offset: usize) -> Self {
1353        Self::new(code, offset)
1354    }
1355}
1356
1357struct ArrayAccess<'a, 'de, const CHECKED: bool> {
1358    array: ArrayDecoder<'a, 'de, CHECKED>,
1359}
1360
1361impl<'de, const CHECKED: bool> SeqAccess<'de> for ArrayAccess<'_, 'de, CHECKED> {
1362    type Error = DeError;
1363
1364    fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, DeError>
1365    where
1366        T: DeserializeSeed<'de>,
1367    {
1368        self.array
1369            .decode_next(|decoder| seed.deserialize(decoder).map_err(DeError::into_cbor_error))
1370            .map_err(DeError::from)
1371    }
1372
1373    fn size_hint(&self) -> Option<usize> {
1374        Some(self.array.remaining())
1375    }
1376}
1377
1378struct MapAccessImpl<'a, 'de, const CHECKED: bool> {
1379    map: MapDecoder<'a, 'de, CHECKED>,
1380}
1381
1382impl<'de, const CHECKED: bool> MapAccess<'de> for MapAccessImpl<'_, 'de, CHECKED> {
1383    type Error = DeError;
1384
1385    fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, DeError>
1386    where
1387        K: DeserializeSeed<'de>,
1388    {
1389        let Some(key) = self.map.next_key().map_err(DeError::from)? else {
1390            return Ok(None);
1391        };
1392        seed.deserialize(<&'de str as IntoDeserializer<'de, DeError>>::into_deserializer(key))
1393            .map(Some)
1394    }
1395
1396    fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, DeError>
1397    where
1398        V: DeserializeSeed<'de>,
1399    {
1400        self.map
1401            .decode_value(|decoder| seed.deserialize(decoder).map_err(DeError::into_cbor_error))
1402            .map_err(DeError::from)
1403    }
1404
1405    fn size_hint(&self) -> Option<usize> {
1406        Some(self.map.remaining())
1407    }
1408}
1409
1410enum EnumPayload<'a, 'de, const CHECKED: bool> {
1411    Unit,
1412    Map(MapDecoder<'a, 'de, CHECKED>),
1413}
1414
1415struct EnumAccessImpl<'a, 'de, const CHECKED: bool> {
1416    key: &'de str,
1417    payload: EnumPayload<'a, 'de, CHECKED>,
1418    offset: usize,
1419}
1420
1421#[allow(clippy::elidable_lifetime_names)]
1422impl<'a, 'de, const CHECKED: bool> EnumAccess<'de> for EnumAccessImpl<'a, 'de, CHECKED> {
1423    type Error = DeError;
1424    type Variant = VariantAccessImpl<'a, 'de, CHECKED>;
1425
1426    fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), DeError>
1427    where
1428        V: DeserializeSeed<'de>,
1429    {
1430        let variant = seed.deserialize(
1431            <&'de str as IntoDeserializer<'de, DeError>>::into_deserializer(self.key),
1432        )?;
1433        Ok((
1434            variant,
1435            VariantAccessImpl {
1436                payload: self.payload,
1437                offset: self.offset,
1438            },
1439        ))
1440    }
1441}
1442
1443struct VariantAccessImpl<'a, 'de, const CHECKED: bool> {
1444    payload: EnumPayload<'a, 'de, CHECKED>,
1445    offset: usize,
1446}
1447
1448impl<'de, const CHECKED: bool> VariantAccess<'de> for VariantAccessImpl<'_, 'de, CHECKED> {
1449    type Error = DeError;
1450
1451    fn unit_variant(self) -> Result<(), DeError> {
1452        match self.payload {
1453            EnumPayload::Unit => Ok(()),
1454            EnumPayload::Map(_) => Err(DeError::new(ErrorCode::ExpectedEnum, self.offset)),
1455        }
1456    }
1457
1458    fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, DeError>
1459    where
1460        T: DeserializeSeed<'de>,
1461    {
1462        match self.payload {
1463            EnumPayload::Unit => Err(DeError::new(ErrorCode::ExpectedEnum, self.offset)),
1464            EnumPayload::Map(mut map) => map
1465                .decode_value(|decoder| seed.deserialize(decoder).map_err(DeError::into_cbor_error))
1466                .map_err(DeError::from),
1467        }
1468    }
1469
1470    fn tuple_variant<V>(self, len: usize, visitor: V) -> Result<V::Value, DeError>
1471    where
1472        V: Visitor<'de>,
1473    {
1474        match self.payload {
1475            EnumPayload::Unit => Err(DeError::new(ErrorCode::ExpectedEnum, self.offset)),
1476            EnumPayload::Map(mut map) => map
1477                .decode_value(|decoder| {
1478                    decoder
1479                        .deserialize_tuple(len, visitor)
1480                        .map_err(DeError::into_cbor_error)
1481                })
1482                .map_err(DeError::from),
1483        }
1484    }
1485
1486    fn struct_variant<V>(
1487        self,
1488        fields: &'static [&'static str],
1489        visitor: V,
1490    ) -> Result<V::Value, DeError>
1491    where
1492        V: Visitor<'de>,
1493    {
1494        match self.payload {
1495            EnumPayload::Unit => Err(DeError::new(ErrorCode::ExpectedEnum, self.offset)),
1496            EnumPayload::Map(mut map) => map
1497                .decode_value(|decoder| {
1498                    decoder
1499                        .deserialize_struct("", fields, visitor)
1500                        .map_err(DeError::into_cbor_error)
1501                })
1502                .map_err(DeError::from),
1503        }
1504    }
1505}
1506
1507impl<'de, const CHECKED: bool> de::Deserializer<'de> for &mut Decoder<'de, CHECKED> {
1508    type Error = DeError;
1509
1510    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, DeError>
1511    where
1512        V: Visitor<'de>,
1513    {
1514        match self.peek_kind().map_err(DeError::from)? {
1515            CborKind::Null => self.deserialize_unit(visitor),
1516            CborKind::Bool => self.deserialize_bool(visitor),
1517            CborKind::Integer => {
1518                let value: i128 = CborDecode::decode(self).map_err(DeError::from)?;
1519                visitor.visit_i128(value)
1520            }
1521            CborKind::Float => self.deserialize_f64(visitor),
1522            CborKind::Bytes => {
1523                let value: &'de [u8] = CborDecode::decode(self).map_err(DeError::from)?;
1524                visitor.visit_borrowed_bytes(value)
1525            }
1526            CborKind::Text => {
1527                let value: &'de str = CborDecode::decode(self).map_err(DeError::from)?;
1528                visitor.visit_borrowed_str(value)
1529            }
1530            CborKind::Array => self.deserialize_seq(visitor),
1531            CborKind::Map => self.deserialize_map(visitor),
1532        }
1533    }
1534
1535    fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, DeError>
1536    where
1537        V: Visitor<'de>,
1538    {
1539        let value: bool = CborDecode::decode(self).map_err(DeError::from)?;
1540        visitor.visit_bool(value)
1541    }
1542
1543    fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value, DeError>
1544    where
1545        V: Visitor<'de>,
1546    {
1547        let value: i8 = CborDecode::decode(self).map_err(DeError::from)?;
1548        visitor.visit_i8(value)
1549    }
1550
1551    fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value, DeError>
1552    where
1553        V: Visitor<'de>,
1554    {
1555        let value: i16 = CborDecode::decode(self).map_err(DeError::from)?;
1556        visitor.visit_i16(value)
1557    }
1558
1559    fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value, DeError>
1560    where
1561        V: Visitor<'de>,
1562    {
1563        let value: i32 = CborDecode::decode(self).map_err(DeError::from)?;
1564        visitor.visit_i32(value)
1565    }
1566
1567    fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value, DeError>
1568    where
1569        V: Visitor<'de>,
1570    {
1571        let value: i64 = CborDecode::decode(self).map_err(DeError::from)?;
1572        visitor.visit_i64(value)
1573    }
1574
1575    fn deserialize_i128<V>(self, visitor: V) -> Result<V::Value, DeError>
1576    where
1577        V: Visitor<'de>,
1578    {
1579        let value: i128 = CborDecode::decode(self).map_err(DeError::from)?;
1580        visitor.visit_i128(value)
1581    }
1582
1583    fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value, DeError>
1584    where
1585        V: Visitor<'de>,
1586    {
1587        let value: u8 = CborDecode::decode(self).map_err(DeError::from)?;
1588        visitor.visit_u8(value)
1589    }
1590
1591    fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value, DeError>
1592    where
1593        V: Visitor<'de>,
1594    {
1595        let value: u16 = CborDecode::decode(self).map_err(DeError::from)?;
1596        visitor.visit_u16(value)
1597    }
1598
1599    fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value, DeError>
1600    where
1601        V: Visitor<'de>,
1602    {
1603        let value: u32 = CborDecode::decode(self).map_err(DeError::from)?;
1604        visitor.visit_u32(value)
1605    }
1606
1607    fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value, DeError>
1608    where
1609        V: Visitor<'de>,
1610    {
1611        let value: u64 = CborDecode::decode(self).map_err(DeError::from)?;
1612        visitor.visit_u64(value)
1613    }
1614
1615    fn deserialize_u128<V>(self, visitor: V) -> Result<V::Value, DeError>
1616    where
1617        V: Visitor<'de>,
1618    {
1619        let value: u128 = CborDecode::decode(self).map_err(DeError::from)?;
1620        visitor.visit_u128(value)
1621    }
1622
1623    fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value, DeError>
1624    where
1625        V: Visitor<'de>,
1626    {
1627        let value: f32 = CborDecode::decode(self).map_err(DeError::from)?;
1628        visitor.visit_f32(value)
1629    }
1630
1631    fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value, DeError>
1632    where
1633        V: Visitor<'de>,
1634    {
1635        let value: f64 = CborDecode::decode(self).map_err(DeError::from)?;
1636        visitor.visit_f64(value)
1637    }
1638
1639    fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, DeError>
1640    where
1641        V: Visitor<'de>,
1642    {
1643        let value: &'de str = CborDecode::decode(self).map_err(DeError::from)?;
1644        let mut chars = value.chars();
1645        let ch = chars
1646            .next()
1647            .ok_or_else(|| DeError::new(ErrorCode::ExpectedText, self.position()))?;
1648        if chars.next().is_some() {
1649            return Err(DeError::new(ErrorCode::ExpectedText, self.position()));
1650        }
1651        visitor.visit_char(ch)
1652    }
1653
1654    fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, DeError>
1655    where
1656        V: Visitor<'de>,
1657    {
1658        let value: &'de str = CborDecode::decode(self).map_err(DeError::from)?;
1659        visitor.visit_borrowed_str(value)
1660    }
1661
1662    fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, DeError>
1663    where
1664        V: Visitor<'de>,
1665    {
1666        let value: String = CborDecode::decode(self).map_err(DeError::from)?;
1667        visitor.visit_string(value)
1668    }
1669
1670    fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, DeError>
1671    where
1672        V: Visitor<'de>,
1673    {
1674        let value: &'de [u8] = CborDecode::decode(self).map_err(DeError::from)?;
1675        visitor.visit_borrowed_bytes(value)
1676    }
1677
1678    fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, DeError>
1679    where
1680        V: Visitor<'de>,
1681    {
1682        let value: Vec<u8> = CborDecode::decode(self).map_err(DeError::from)?;
1683        visitor.visit_byte_buf(value)
1684    }
1685
1686    fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, DeError>
1687    where
1688        V: Visitor<'de>,
1689    {
1690        if matches!(self.peek_kind().map_err(DeError::from)?, CborKind::Null) {
1691            let _: () = CborDecode::decode(self).map_err(DeError::from)?;
1692            visitor.visit_none()
1693        } else {
1694            visitor.visit_some(self)
1695        }
1696    }
1697
1698    fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, DeError>
1699    where
1700        V: Visitor<'de>,
1701    {
1702        let _: () = CborDecode::decode(self).map_err(DeError::from)?;
1703        visitor.visit_unit()
1704    }
1705
1706    fn deserialize_unit_struct<V>(
1707        self,
1708        _name: &'static str,
1709        visitor: V,
1710    ) -> Result<V::Value, DeError>
1711    where
1712        V: Visitor<'de>,
1713    {
1714        self.deserialize_unit(visitor)
1715    }
1716
1717    fn deserialize_newtype_struct<V>(
1718        self,
1719        name: &'static str,
1720        visitor: V,
1721    ) -> Result<V::Value, DeError>
1722    where
1723        V: Visitor<'de>,
1724    {
1725        if name == RAW_VALUE_MARKER {
1726            let start = self.position();
1727            self.skip_value().map_err(DeError::from)?;
1728            let end = self.position();
1729            let raw = &self.data()[start..end];
1730            return visitor.visit_borrowed_bytes(raw);
1731        }
1732        visitor.visit_newtype_struct(self)
1733    }
1734
1735    fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, DeError>
1736    where
1737        V: Visitor<'de>,
1738    {
1739        let array = self.array().map_err(DeError::from)?;
1740        visitor.visit_seq(ArrayAccess { array })
1741    }
1742
1743    fn deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value, DeError>
1744    where
1745        V: Visitor<'de>,
1746    {
1747        let off = self.position();
1748        let array = self.array().map_err(DeError::from)?;
1749        if array.remaining() != len {
1750            return Err(DeError::new(ErrorCode::ArrayLenMismatch, off));
1751        }
1752        visitor.visit_seq(ArrayAccess { array })
1753    }
1754
1755    fn deserialize_tuple_struct<V>(
1756        self,
1757        _name: &'static str,
1758        len: usize,
1759        visitor: V,
1760    ) -> Result<V::Value, DeError>
1761    where
1762        V: Visitor<'de>,
1763    {
1764        self.deserialize_tuple(len, visitor)
1765    }
1766
1767    fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, DeError>
1768    where
1769        V: Visitor<'de>,
1770    {
1771        let map = self.map().map_err(DeError::from)?;
1772        visitor.visit_map(MapAccessImpl { map })
1773    }
1774
1775    fn deserialize_struct<V>(
1776        self,
1777        _name: &'static str,
1778        _fields: &'static [&'static str],
1779        visitor: V,
1780    ) -> Result<V::Value, DeError>
1781    where
1782        V: Visitor<'de>,
1783    {
1784        self.deserialize_map(visitor)
1785    }
1786
1787    fn deserialize_enum<V>(
1788        self,
1789        _name: &'static str,
1790        _variants: &'static [&'static str],
1791        visitor: V,
1792    ) -> Result<V::Value, DeError>
1793    where
1794        V: Visitor<'de>,
1795    {
1796        let off = self.position();
1797        match self.peek_kind().map_err(DeError::from)? {
1798            CborKind::Text => {
1799                let key: &'de str = CborDecode::decode(self).map_err(DeError::from)?;
1800                visitor.visit_enum(EnumAccessImpl {
1801                    key,
1802                    payload: EnumPayload::<CHECKED>::Unit,
1803                    offset: off,
1804                })
1805            }
1806            CborKind::Map => {
1807                let mut map = self.map().map_err(DeError::from)?;
1808                if map.remaining() != 1 {
1809                    return Err(DeError::new(ErrorCode::MapLenMismatch, off));
1810                }
1811                let Some(key) = map.next_key().map_err(DeError::from)? else {
1812                    return Err(DeError::new(ErrorCode::MapLenMismatch, off));
1813                };
1814                visitor.visit_enum(EnumAccessImpl {
1815                    key,
1816                    payload: EnumPayload::Map(map),
1817                    offset: off,
1818                })
1819            }
1820            _ => Err(DeError::new(ErrorCode::ExpectedEnum, off)),
1821        }
1822    }
1823
1824    fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, DeError>
1825    where
1826        V: Visitor<'de>,
1827    {
1828        self.deserialize_str(visitor)
1829    }
1830
1831    fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, DeError>
1832    where
1833        V: Visitor<'de>,
1834    {
1835        self.skip_value().map_err(DeError::from)?;
1836        visitor.visit_unit()
1837    }
1838}
1839
1840/// Deserialize `T` with zero-copy borrows, validating during parsing.
1841///
1842/// # Errors
1843///
1844/// Returns an error if validation fails or if deserialization fails.
1845#[cfg_attr(docsrs, doc(cfg(feature = "serde")))]
1846pub fn from_slice_borrowed<'de, T>(bytes: &'de [u8], limits: DecodeLimits) -> Result<T, CborError>
1847where
1848    T: Deserialize<'de>,
1849{
1850    let mut decoder = Decoder::<true>::new_checked(bytes, limits)?;
1851    let value = T::deserialize(&mut decoder).map_err(DeError::into_cbor_error)?;
1852    if decoder.position() != bytes.len() {
1853        return Err(CborError::new(ErrorCode::TrailingBytes, decoder.position()));
1854    }
1855    Ok(value)
1856}
1857
1858/// Deserialize `T` from validated canonical bytes without re-checking canonical encodings.
1859///
1860/// This assumes `canon` was produced by `validate_canonical`.
1861///
1862/// # Errors
1863///
1864/// Returns an error if deserialization fails or if trailing bytes are found.
1865#[cfg_attr(docsrs, doc(cfg(feature = "serde")))]
1866pub fn from_canonical_bytes_ref<'de, T>(canon: CanonicalCborRef<'de>) -> Result<T, CborError>
1867where
1868    T: Deserialize<'de>,
1869{
1870    let limits = DecodeLimits::for_bytes(canon.len());
1871    let mut decoder = Decoder::<false>::new_trusted(canon, limits)?;
1872    let value = T::deserialize(&mut decoder).map_err(DeError::into_cbor_error)?;
1873    if decoder.position() != canon.len() {
1874        return Err(CborError::new(ErrorCode::TrailingBytes, decoder.position()));
1875    }
1876    Ok(value)
1877}
1878
1879/// Deserialize `T` from owned canonical bytes without re-checking canonical encodings.
1880///
1881/// This assumes `canon` was produced by `CanonicalCbor::from_slice` or `CanonicalCbor::from_vec`.
1882///
1883/// # Errors
1884///
1885/// Returns an error if deserialization fails or if trailing bytes are found.
1886#[cfg_attr(docsrs, doc(cfg(feature = "serde")))]
1887pub fn from_canonical_bytes<'de, T>(canon: &'de CanonicalCbor) -> Result<T, CborError>
1888where
1889    T: Deserialize<'de>,
1890{
1891    from_canonical_bytes_ref(canon.as_ref())
1892}
1893
1894impl<'de> Deserialize<'de> for CborValueRef<'de> {
1895    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
1896    where
1897        D: de::Deserializer<'de>,
1898    {
1899        struct RawCborValueVisitor;
1900
1901        impl<'de> Visitor<'de> for RawCborValueVisitor {
1902            type Value = CborValueRef<'de>;
1903
1904            fn expecting(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1905                f.write_str("a raw CBOR value")
1906            }
1907
1908            fn visit_borrowed_bytes<E>(self, v: &'de [u8]) -> Result<Self::Value, E>
1909            where
1910                E: de::Error,
1911            {
1912                Ok(CborValueRef::new(v, 0, v.len()))
1913            }
1914        }
1915
1916        deserializer.deserialize_newtype_struct(RAW_VALUE_MARKER, RawCborValueVisitor)
1917    }
1918}