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
48pub 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
61pub 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
79pub 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#[cfg_attr(docsrs, doc(cfg(feature = "serde")))]
1304#[derive(Debug, Clone, Copy, PartialEq, Eq)]
1305pub struct DeError {
1306 pub code: ErrorCode,
1308 pub offset: usize,
1310}
1311
1312impl DeError {
1313 #[inline]
1314 #[must_use]
1315 pub const fn new(code: ErrorCode, offset: usize) -> Self {
1317 Self { code, offset }
1318 }
1319
1320 #[inline]
1321 #[must_use]
1322 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#[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#[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#[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}