1 // SPDX-License-Identifier: Apache-2.0
2
3 //! Serde deserialization support for CBOR
4
5 mod error;
6
7 pub use error::Error;
8
9 use alloc::{string::String, vec::Vec};
10
11 use ciborium_io::Read;
12 use ciborium_ll::*;
13 use serde::{de, de::Deserializer as _, forward_to_deserialize_any};
14
15 trait Expected<E: de::Error> {
expected(self, kind: &'static str) -> E16 fn expected(self, kind: &'static str) -> E;
17 }
18
19 impl<E: de::Error> Expected<E> for Header {
20 #[inline]
expected(self, kind: &'static str) -> E21 fn expected(self, kind: &'static str) -> E {
22 de::Error::invalid_type(
23 match self {
24 Header::Positive(x) => de::Unexpected::Unsigned(x),
25 Header::Negative(x) => de::Unexpected::Signed(x as i64 ^ !0),
26 Header::Bytes(..) => de::Unexpected::Other("bytes"),
27 Header::Text(..) => de::Unexpected::Other("string"),
28
29 Header::Array(..) => de::Unexpected::Seq,
30 Header::Map(..) => de::Unexpected::Map,
31
32 Header::Tag(..) => de::Unexpected::Other("tag"),
33
34 Header::Simple(simple::FALSE) => de::Unexpected::Bool(false),
35 Header::Simple(simple::TRUE) => de::Unexpected::Bool(true),
36 Header::Simple(simple::NULL) => de::Unexpected::Other("null"),
37 Header::Simple(simple::UNDEFINED) => de::Unexpected::Other("undefined"),
38 Header::Simple(..) => de::Unexpected::Other("simple"),
39
40 Header::Float(x) => de::Unexpected::Float(x),
41 Header::Break => de::Unexpected::Other("break"),
42 },
43 &kind,
44 )
45 }
46 }
47
48 struct Deserializer<'b, R: Read> {
49 decoder: Decoder<R>,
50 scratch: &'b mut [u8],
51 recurse: usize,
52 }
53
54 impl<'a, R: Read> Deserializer<'a, R>
55 where
56 R::Error: core::fmt::Debug,
57 {
58 #[inline]
recurse<V, F: FnOnce(&mut Self) -> Result<V, Error<R::Error>>>( &mut self, func: F, ) -> Result<V, Error<R::Error>>59 fn recurse<V, F: FnOnce(&mut Self) -> Result<V, Error<R::Error>>>(
60 &mut self,
61 func: F,
62 ) -> Result<V, Error<R::Error>> {
63 if self.recurse == 0 {
64 return Err(Error::RecursionLimitExceeded);
65 }
66
67 self.recurse -= 1;
68 let result = func(self);
69 self.recurse += 1;
70 result
71 }
72
73 #[inline]
integer(&mut self, mut header: Option<Header>) -> Result<(bool, u128), Error<R::Error>>74 fn integer(&mut self, mut header: Option<Header>) -> Result<(bool, u128), Error<R::Error>> {
75 loop {
76 let header = match header.take() {
77 Some(h) => h,
78 None => self.decoder.pull()?,
79 };
80
81 let neg = match header {
82 Header::Positive(x) => return Ok((false, x.into())),
83 Header::Negative(x) => return Ok((true, x.into())),
84 Header::Tag(tag::BIGPOS) => false,
85 Header::Tag(tag::BIGNEG) => true,
86 Header::Tag(..) => continue,
87 header => return Err(header.expected("integer")),
88 };
89
90 let mut buffer = [0u8; 16];
91 let mut value = [0u8; 16];
92 let mut index = 0usize;
93
94 return match self.decoder.pull()? {
95 Header::Bytes(len) => {
96 let mut segments = self.decoder.bytes(len);
97 while let Some(mut segment) = segments.pull()? {
98 while let Some(chunk) = segment.pull(&mut buffer)? {
99 for b in chunk {
100 match index {
101 16 => return Err(de::Error::custom("bigint too large")),
102 0 if *b == 0 => continue, // Skip leading zeros
103 _ => value[index] = *b,
104 }
105
106 index += 1;
107 }
108 }
109 }
110
111 value[..index].reverse();
112 Ok((neg, u128::from_le_bytes(value)))
113 }
114
115 h => Err(h.expected("bytes")),
116 };
117 }
118 }
119 }
120
121 impl<'de, 'a, 'b, R: Read> de::Deserializer<'de> for &'a mut Deserializer<'b, R>
122 where
123 R::Error: core::fmt::Debug,
124 {
125 type Error = Error<R::Error>;
126
127 #[inline]
deserialize_any<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error>128 fn deserialize_any<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
129 let header = self.decoder.pull()?;
130 self.decoder.push(header);
131
132 match header {
133 Header::Positive(..) => self.deserialize_u64(visitor),
134 Header::Negative(x) => match i64::try_from(x) {
135 Ok(..) => self.deserialize_i64(visitor),
136 Err(..) => self.deserialize_i128(visitor),
137 },
138
139 Header::Bytes(len) => match len {
140 Some(len) if len <= self.scratch.len() => self.deserialize_bytes(visitor),
141 _ => self.deserialize_byte_buf(visitor),
142 },
143
144 Header::Text(len) => match len {
145 Some(len) if len <= self.scratch.len() => self.deserialize_str(visitor),
146 _ => self.deserialize_string(visitor),
147 },
148
149 Header::Array(..) => self.deserialize_seq(visitor),
150 Header::Map(..) => self.deserialize_map(visitor),
151
152 Header::Tag(tag) => {
153 let _: Header = self.decoder.pull()?;
154
155 // Peek at the next item.
156 let header = self.decoder.pull()?;
157 self.decoder.push(header);
158
159 // If it is bytes, capture the length.
160 let len = match header {
161 Header::Bytes(x) => x,
162 _ => None,
163 };
164
165 match (tag, len) {
166 (tag::BIGPOS, Some(len)) | (tag::BIGNEG, Some(len)) if len <= 16 => {
167 let result = match self.integer(Some(Header::Tag(tag)))? {
168 (false, raw) => return visitor.visit_u128(raw),
169 (true, raw) => i128::try_from(raw).map(|x| x ^ !0),
170 };
171
172 match result {
173 Ok(x) => visitor.visit_i128(x),
174 Err(..) => Err(de::Error::custom("integer too large")),
175 }
176 }
177
178 _ => self.recurse(|me| {
179 let access = crate::tag::TagAccess::new(me, Some(tag));
180 visitor.visit_enum(access)
181 }),
182 }
183 }
184
185 Header::Float(..) => self.deserialize_f64(visitor),
186
187 Header::Simple(simple::FALSE) => self.deserialize_bool(visitor),
188 Header::Simple(simple::TRUE) => self.deserialize_bool(visitor),
189 Header::Simple(simple::NULL) => self.deserialize_option(visitor),
190 Header::Simple(simple::UNDEFINED) => self.deserialize_option(visitor),
191 h @ Header::Simple(..) => Err(h.expected("known simple value")),
192
193 h @ Header::Break => Err(h.expected("non-break")),
194 }
195 }
196
197 #[inline]
deserialize_bool<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error>198 fn deserialize_bool<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
199 loop {
200 let offset = self.decoder.offset();
201
202 return match self.decoder.pull()? {
203 Header::Tag(..) => continue,
204 Header::Simple(simple::FALSE) => visitor.visit_bool(false),
205 Header::Simple(simple::TRUE) => visitor.visit_bool(true),
206 _ => Err(Error::semantic(offset, "expected bool")),
207 };
208 }
209 }
210
211 #[inline]
deserialize_f32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error>212 fn deserialize_f32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
213 self.deserialize_f64(visitor)
214 }
215
216 #[inline]
deserialize_f64<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error>217 fn deserialize_f64<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
218 loop {
219 return match self.decoder.pull()? {
220 Header::Tag(..) => continue,
221 Header::Float(x) => visitor.visit_f64(x),
222 h => Err(h.expected("float")),
223 };
224 }
225 }
226
deserialize_i8<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error>227 fn deserialize_i8<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
228 self.deserialize_i64(visitor)
229 }
230
deserialize_i16<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error>231 fn deserialize_i16<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
232 self.deserialize_i64(visitor)
233 }
234
deserialize_i32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error>235 fn deserialize_i32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
236 self.deserialize_i64(visitor)
237 }
238
deserialize_i64<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error>239 fn deserialize_i64<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
240 let result = match self.integer(None)? {
241 (false, raw) => i64::try_from(raw),
242 (true, raw) => i64::try_from(raw).map(|x| x ^ !0),
243 };
244
245 match result {
246 Ok(x) => visitor.visit_i64(x),
247 Err(..) => Err(de::Error::custom("integer too large")),
248 }
249 }
250
deserialize_i128<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error>251 fn deserialize_i128<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
252 let result = match self.integer(None)? {
253 (false, raw) => i128::try_from(raw),
254 (true, raw) => i128::try_from(raw).map(|x| x ^ !0),
255 };
256
257 match result {
258 Ok(x) => visitor.visit_i128(x),
259 Err(..) => Err(de::Error::custom("integer too large")),
260 }
261 }
262
deserialize_u8<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error>263 fn deserialize_u8<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
264 self.deserialize_u64(visitor)
265 }
266
deserialize_u16<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error>267 fn deserialize_u16<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
268 self.deserialize_u64(visitor)
269 }
270
deserialize_u32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error>271 fn deserialize_u32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
272 self.deserialize_u64(visitor)
273 }
274
deserialize_u64<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error>275 fn deserialize_u64<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
276 let result = match self.integer(None)? {
277 (false, raw) => u64::try_from(raw),
278 (true, ..) => return Err(de::Error::custom("unexpected negative integer")),
279 };
280
281 match result {
282 Ok(x) => visitor.visit_u64(x),
283 Err(..) => Err(de::Error::custom("integer too large")),
284 }
285 }
286
deserialize_u128<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error>287 fn deserialize_u128<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
288 match self.integer(None)? {
289 (false, raw) => visitor.visit_u128(raw),
290 (true, ..) => Err(de::Error::custom("unexpected negative integer")),
291 }
292 }
293
deserialize_char<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error>294 fn deserialize_char<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
295 loop {
296 let offset = self.decoder.offset();
297 let header = self.decoder.pull()?;
298
299 return match header {
300 Header::Tag(..) => continue,
301
302 Header::Text(Some(len)) if len <= 4 => {
303 let mut buf = [0u8; 4];
304 self.decoder.read_exact(&mut buf[..len])?;
305
306 match core::str::from_utf8(&buf[..len]) {
307 Ok(s) => match s.chars().count() {
308 1 => visitor.visit_char(s.chars().next().unwrap()),
309 _ => Err(header.expected("char")),
310 },
311 Err(..) => Err(Error::Syntax(offset)),
312 }
313 }
314
315 _ => Err(header.expected("char")),
316 };
317 }
318 }
319
deserialize_str<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error>320 fn deserialize_str<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
321 loop {
322 let offset = self.decoder.offset();
323
324 return match self.decoder.pull()? {
325 Header::Tag(..) => continue,
326
327 Header::Text(Some(len)) if len <= self.scratch.len() => {
328 self.decoder.read_exact(&mut self.scratch[..len])?;
329
330 match core::str::from_utf8(&self.scratch[..len]) {
331 Ok(s) => visitor.visit_str(s),
332 Err(..) => Err(Error::Syntax(offset)),
333 }
334 }
335
336 header => Err(header.expected("str")),
337 };
338 }
339 }
340
deserialize_string<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error>341 fn deserialize_string<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
342 loop {
343 return match self.decoder.pull()? {
344 Header::Tag(..) => continue,
345
346 Header::Text(len) => {
347 let mut buffer = String::new();
348
349 let mut segments = self.decoder.text(len);
350 while let Some(mut segment) = segments.pull()? {
351 while let Some(chunk) = segment.pull(self.scratch)? {
352 buffer.push_str(chunk);
353 }
354 }
355
356 visitor.visit_string(buffer)
357 }
358
359 header => Err(header.expected("string")),
360 };
361 }
362 }
363
deserialize_bytes<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error>364 fn deserialize_bytes<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
365 loop {
366 return match self.decoder.pull()? {
367 Header::Tag(..) => continue,
368
369 Header::Bytes(Some(len)) if len <= self.scratch.len() => {
370 self.decoder.read_exact(&mut self.scratch[..len])?;
371 visitor.visit_bytes(&self.scratch[..len])
372 }
373
374 Header::Array(len) => self.recurse(|me| {
375 let access = Access(me, len);
376 visitor.visit_seq(access)
377 }),
378
379 header => Err(header.expected("bytes")),
380 };
381 }
382 }
383
deserialize_byte_buf<V: de::Visitor<'de>>( self, visitor: V, ) -> Result<V::Value, Self::Error>384 fn deserialize_byte_buf<V: de::Visitor<'de>>(
385 self,
386 visitor: V,
387 ) -> Result<V::Value, Self::Error> {
388 loop {
389 return match self.decoder.pull()? {
390 Header::Tag(..) => continue,
391
392 Header::Bytes(len) => {
393 let mut buffer = Vec::new();
394
395 let mut segments = self.decoder.bytes(len);
396 while let Some(mut segment) = segments.pull()? {
397 while let Some(chunk) = segment.pull(self.scratch)? {
398 buffer.extend_from_slice(chunk);
399 }
400 }
401
402 visitor.visit_byte_buf(buffer)
403 }
404
405 Header::Array(len) => self.recurse(|me| {
406 let access = Access(me, len);
407 visitor.visit_seq(access)
408 }),
409
410 header => Err(header.expected("byte buffer")),
411 };
412 }
413 }
414
deserialize_seq<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error>415 fn deserialize_seq<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
416 loop {
417 return match self.decoder.pull()? {
418 Header::Tag(..) => continue,
419
420 Header::Array(len) => self.recurse(|me| {
421 let access = Access(me, len);
422 visitor.visit_seq(access)
423 }),
424
425 Header::Bytes(len) => {
426 let mut buffer = Vec::new();
427
428 let mut segments = self.decoder.bytes(len);
429 while let Some(mut segment) = segments.pull()? {
430 while let Some(chunk) = segment.pull(self.scratch)? {
431 buffer.extend_from_slice(chunk);
432 }
433 }
434
435 visitor.visit_seq(BytesAccess::<R>(0, buffer, core::marker::PhantomData))
436 }
437
438 header => Err(header.expected("array")),
439 };
440 }
441 }
442
deserialize_map<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error>443 fn deserialize_map<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
444 loop {
445 return match self.decoder.pull()? {
446 Header::Tag(..) => continue,
447
448 Header::Map(len) => self.recurse(|me| {
449 let access = Access(me, len);
450 visitor.visit_map(access)
451 }),
452
453 header => Err(header.expected("map")),
454 };
455 }
456 }
457
deserialize_struct<V: de::Visitor<'de>>( self, _name: &'static str, _fields: &'static [&'static str], visitor: V, ) -> Result<V::Value, Self::Error>458 fn deserialize_struct<V: de::Visitor<'de>>(
459 self,
460 _name: &'static str,
461 _fields: &'static [&'static str],
462 visitor: V,
463 ) -> Result<V::Value, Self::Error> {
464 self.deserialize_map(visitor)
465 }
466
deserialize_tuple<V: de::Visitor<'de>>( self, _len: usize, visitor: V, ) -> Result<V::Value, Self::Error>467 fn deserialize_tuple<V: de::Visitor<'de>>(
468 self,
469 _len: usize,
470 visitor: V,
471 ) -> Result<V::Value, Self::Error> {
472 self.deserialize_seq(visitor)
473 }
474
deserialize_tuple_struct<V: de::Visitor<'de>>( self, _name: &'static str, _len: usize, visitor: V, ) -> Result<V::Value, Self::Error>475 fn deserialize_tuple_struct<V: de::Visitor<'de>>(
476 self,
477 _name: &'static str,
478 _len: usize,
479 visitor: V,
480 ) -> Result<V::Value, Self::Error> {
481 self.deserialize_seq(visitor)
482 }
483
deserialize_identifier<V: de::Visitor<'de>>( self, visitor: V, ) -> Result<V::Value, Self::Error>484 fn deserialize_identifier<V: de::Visitor<'de>>(
485 self,
486 visitor: V,
487 ) -> Result<V::Value, Self::Error> {
488 loop {
489 let offset = self.decoder.offset();
490
491 return match self.decoder.pull()? {
492 Header::Tag(..) => continue,
493
494 Header::Text(Some(len)) if len <= self.scratch.len() => {
495 self.decoder.read_exact(&mut self.scratch[..len])?;
496
497 match core::str::from_utf8(&self.scratch[..len]) {
498 Ok(s) => visitor.visit_str(s),
499 Err(..) => Err(Error::Syntax(offset)),
500 }
501 }
502 Header::Bytes(Some(len)) if len <= self.scratch.len() => {
503 self.decoder.read_exact(&mut self.scratch[..len])?;
504 visitor.visit_bytes(&self.scratch[..len])
505 }
506
507 header => Err(header.expected("str or bytes")),
508 };
509 }
510 }
511
deserialize_ignored_any<V: de::Visitor<'de>>( self, visitor: V, ) -> Result<V::Value, Self::Error>512 fn deserialize_ignored_any<V: de::Visitor<'de>>(
513 self,
514 visitor: V,
515 ) -> Result<V::Value, Self::Error> {
516 self.deserialize_any(visitor)
517 }
518
519 #[inline]
deserialize_option<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error>520 fn deserialize_option<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
521 match self.decoder.pull()? {
522 Header::Simple(simple::UNDEFINED) => visitor.visit_none(),
523 Header::Simple(simple::NULL) => visitor.visit_none(),
524 header => {
525 self.decoder.push(header);
526 visitor.visit_some(self)
527 }
528 }
529 }
530
531 #[inline]
deserialize_unit<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error>532 fn deserialize_unit<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
533 loop {
534 return match self.decoder.pull()? {
535 Header::Simple(simple::UNDEFINED) => visitor.visit_unit(),
536 Header::Simple(simple::NULL) => visitor.visit_unit(),
537 Header::Tag(..) => continue,
538 header => Err(header.expected("unit")),
539 };
540 }
541 }
542
543 #[inline]
deserialize_unit_struct<V: de::Visitor<'de>>( self, _name: &'static str, visitor: V, ) -> Result<V::Value, Self::Error>544 fn deserialize_unit_struct<V: de::Visitor<'de>>(
545 self,
546 _name: &'static str,
547 visitor: V,
548 ) -> Result<V::Value, Self::Error> {
549 self.deserialize_unit(visitor)
550 }
551
552 #[inline]
deserialize_newtype_struct<V: de::Visitor<'de>>( self, _name: &'static str, visitor: V, ) -> Result<V::Value, Self::Error>553 fn deserialize_newtype_struct<V: de::Visitor<'de>>(
554 self,
555 _name: &'static str,
556 visitor: V,
557 ) -> Result<V::Value, Self::Error> {
558 visitor.visit_newtype_struct(self)
559 }
560
561 #[inline]
deserialize_enum<V: de::Visitor<'de>>( self, name: &'static str, _variants: &'static [&'static str], visitor: V, ) -> Result<V::Value, Self::Error>562 fn deserialize_enum<V: de::Visitor<'de>>(
563 self,
564 name: &'static str,
565 _variants: &'static [&'static str],
566 visitor: V,
567 ) -> Result<V::Value, Self::Error> {
568 if name == "@@TAG@@" {
569 let tag = match self.decoder.pull()? {
570 Header::Tag(x) => Some(x),
571 header => {
572 self.decoder.push(header);
573 None
574 }
575 };
576
577 return self.recurse(|me| {
578 let access = crate::tag::TagAccess::new(me, tag);
579 visitor.visit_enum(access)
580 });
581 }
582
583 loop {
584 match self.decoder.pull()? {
585 Header::Tag(..) => continue,
586 Header::Map(Some(1)) => (),
587 header @ Header::Text(..) => self.decoder.push(header),
588 header => return Err(header.expected("enum")),
589 }
590
591 return self.recurse(|me| {
592 let access = Access(me, Some(0));
593 visitor.visit_enum(access)
594 });
595 }
596 }
597
598 #[inline]
is_human_readable(&self) -> bool599 fn is_human_readable(&self) -> bool {
600 false
601 }
602 }
603
604 struct Access<'a, 'b, R: Read>(&'a mut Deserializer<'b, R>, Option<usize>);
605
606 impl<'de, 'a, 'b, R: Read> de::SeqAccess<'de> for Access<'a, 'b, R>
607 where
608 R::Error: core::fmt::Debug,
609 {
610 type Error = Error<R::Error>;
611
612 #[inline]
next_element_seed<U: de::DeserializeSeed<'de>>( &mut self, seed: U, ) -> Result<Option<U::Value>, Self::Error>613 fn next_element_seed<U: de::DeserializeSeed<'de>>(
614 &mut self,
615 seed: U,
616 ) -> Result<Option<U::Value>, Self::Error> {
617 match self.1 {
618 Some(0) => return Ok(None),
619 Some(x) => self.1 = Some(x - 1),
620 None => match self.0.decoder.pull()? {
621 Header::Break => return Ok(None),
622 header => self.0.decoder.push(header),
623 },
624 }
625
626 seed.deserialize(&mut *self.0).map(Some)
627 }
628
629 #[inline]
size_hint(&self) -> Option<usize>630 fn size_hint(&self) -> Option<usize> {
631 self.1
632 }
633 }
634
635 impl<'de, 'a, 'b, R: Read> de::MapAccess<'de> for Access<'a, 'b, R>
636 where
637 R::Error: core::fmt::Debug,
638 {
639 type Error = Error<R::Error>;
640
641 #[inline]
next_key_seed<K: de::DeserializeSeed<'de>>( &mut self, seed: K, ) -> Result<Option<K::Value>, Self::Error>642 fn next_key_seed<K: de::DeserializeSeed<'de>>(
643 &mut self,
644 seed: K,
645 ) -> Result<Option<K::Value>, Self::Error> {
646 match self.1 {
647 Some(0) => return Ok(None),
648 Some(x) => self.1 = Some(x - 1),
649 None => match self.0.decoder.pull()? {
650 Header::Break => return Ok(None),
651 header => self.0.decoder.push(header),
652 },
653 }
654
655 seed.deserialize(&mut *self.0).map(Some)
656 }
657
658 #[inline]
next_value_seed<V: de::DeserializeSeed<'de>>( &mut self, seed: V, ) -> Result<V::Value, Self::Error>659 fn next_value_seed<V: de::DeserializeSeed<'de>>(
660 &mut self,
661 seed: V,
662 ) -> Result<V::Value, Self::Error> {
663 seed.deserialize(&mut *self.0)
664 }
665
666 #[inline]
size_hint(&self) -> Option<usize>667 fn size_hint(&self) -> Option<usize> {
668 self.1
669 }
670 }
671
672 impl<'de, 'a, 'b, R: Read> de::EnumAccess<'de> for Access<'a, 'b, R>
673 where
674 R::Error: core::fmt::Debug,
675 {
676 type Error = Error<R::Error>;
677 type Variant = Self;
678
679 #[inline]
variant_seed<V: de::DeserializeSeed<'de>>( self, seed: V, ) -> Result<(V::Value, Self::Variant), Self::Error>680 fn variant_seed<V: de::DeserializeSeed<'de>>(
681 self,
682 seed: V,
683 ) -> Result<(V::Value, Self::Variant), Self::Error> {
684 let variant = seed.deserialize(&mut *self.0)?;
685 Ok((variant, self))
686 }
687 }
688
689 impl<'de, 'a, 'b, R: Read> de::VariantAccess<'de> for Access<'a, 'b, R>
690 where
691 R::Error: core::fmt::Debug,
692 {
693 type Error = Error<R::Error>;
694
695 #[inline]
unit_variant(self) -> Result<(), Self::Error>696 fn unit_variant(self) -> Result<(), Self::Error> {
697 Ok(())
698 }
699
700 #[inline]
newtype_variant_seed<U: de::DeserializeSeed<'de>>( self, seed: U, ) -> Result<U::Value, Self::Error>701 fn newtype_variant_seed<U: de::DeserializeSeed<'de>>(
702 self,
703 seed: U,
704 ) -> Result<U::Value, Self::Error> {
705 seed.deserialize(&mut *self.0)
706 }
707
708 #[inline]
tuple_variant<V: de::Visitor<'de>>( self, _len: usize, visitor: V, ) -> Result<V::Value, Self::Error>709 fn tuple_variant<V: de::Visitor<'de>>(
710 self,
711 _len: usize,
712 visitor: V,
713 ) -> Result<V::Value, Self::Error> {
714 self.0.deserialize_any(visitor)
715 }
716
717 #[inline]
struct_variant<V: de::Visitor<'de>>( self, _fields: &'static [&'static str], visitor: V, ) -> Result<V::Value, Self::Error>718 fn struct_variant<V: de::Visitor<'de>>(
719 self,
720 _fields: &'static [&'static str],
721 visitor: V,
722 ) -> Result<V::Value, Self::Error> {
723 self.0.deserialize_any(visitor)
724 }
725 }
726
727 struct BytesAccess<R: Read>(usize, Vec<u8>, core::marker::PhantomData<R>);
728
729 impl<'de, R: Read> de::SeqAccess<'de> for BytesAccess<R>
730 where
731 R::Error: core::fmt::Debug,
732 {
733 type Error = Error<R::Error>;
734
735 #[inline]
next_element_seed<U: de::DeserializeSeed<'de>>( &mut self, seed: U, ) -> Result<Option<U::Value>, Self::Error>736 fn next_element_seed<U: de::DeserializeSeed<'de>>(
737 &mut self,
738 seed: U,
739 ) -> Result<Option<U::Value>, Self::Error> {
740 use de::IntoDeserializer;
741
742 if self.0 < self.1.len() {
743 let byte = self.1[self.0];
744 self.0 += 1;
745 seed.deserialize(byte.into_deserializer()).map(Some)
746 } else {
747 Ok(None)
748 }
749 }
750
751 #[inline]
size_hint(&self) -> Option<usize>752 fn size_hint(&self) -> Option<usize> {
753 Some(self.1.len() - self.0)
754 }
755 }
756
757 struct TagAccess<'a, 'b, R: Read>(&'a mut Deserializer<'b, R>, usize);
758
759 impl<'de, 'a, 'b, R: Read> de::Deserializer<'de> for &mut TagAccess<'a, 'b, R>
760 where
761 R::Error: core::fmt::Debug,
762 {
763 type Error = Error<R::Error>;
764
765 #[inline]
deserialize_any<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error>766 fn deserialize_any<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value, Self::Error> {
767 let offset = self.0.decoder.offset();
768
769 match self.0.decoder.pull()? {
770 Header::Tag(x) => visitor.visit_u64(x),
771 _ => Err(Error::semantic(offset, "expected tag")),
772 }
773 }
774
775 forward_to_deserialize_any! {
776 i8 i16 i32 i64 i128
777 u8 u16 u32 u64 u128
778 bool f32 f64
779 char str string
780 bytes byte_buf
781 seq map
782 struct tuple tuple_struct
783 identifier ignored_any
784 option unit unit_struct newtype_struct enum
785 }
786 }
787
788 impl<'de, 'a, 'b, R: Read> de::SeqAccess<'de> for TagAccess<'a, 'b, R>
789 where
790 R::Error: core::fmt::Debug,
791 {
792 type Error = Error<R::Error>;
793
794 #[inline]
next_element_seed<U: de::DeserializeSeed<'de>>( &mut self, seed: U, ) -> Result<Option<U::Value>, Self::Error>795 fn next_element_seed<U: de::DeserializeSeed<'de>>(
796 &mut self,
797 seed: U,
798 ) -> Result<Option<U::Value>, Self::Error> {
799 self.1 += 1;
800
801 match self.1 {
802 1 => seed.deserialize(self).map(Some),
803 2 => seed.deserialize(&mut *self.0).map(Some),
804 _ => Ok(None),
805 }
806 }
807
808 #[inline]
size_hint(&self) -> Option<usize>809 fn size_hint(&self) -> Option<usize> {
810 Some(match self.1 {
811 0 => 2,
812 1 => 1,
813 _ => 0,
814 })
815 }
816 }
817
818 /// Deserializes as CBOR from a type with [`impl
819 /// ciborium_io::Read`](ciborium_io::Read) using a 4KB buffer on the stack.
820 ///
821 /// If you want to deserialize faster at the cost of more memory, consider using
822 /// [`from_reader_with_buffer`](from_reader_with_buffer) with a larger buffer,
823 /// for example 64KB.
824 #[inline]
from_reader<T: de::DeserializeOwned, R: Read>(reader: R) -> Result<T, Error<R::Error>> where R::Error: core::fmt::Debug,825 pub fn from_reader<T: de::DeserializeOwned, R: Read>(reader: R) -> Result<T, Error<R::Error>>
826 where
827 R::Error: core::fmt::Debug,
828 {
829 let mut scratch = [0; 4096];
830 from_reader_with_buffer(reader, &mut scratch)
831 }
832
833 /// Deserializes as CBOR from a type with [`impl
834 /// ciborium_io::Read`](ciborium_io::Read), using a caller-specific buffer as a
835 /// temporary scratch space.
836 #[inline]
from_reader_with_buffer<T: de::DeserializeOwned, R: Read>( reader: R, scratch_buffer: &mut [u8], ) -> Result<T, Error<R::Error>> where R::Error: core::fmt::Debug,837 pub fn from_reader_with_buffer<T: de::DeserializeOwned, R: Read>(
838 reader: R,
839 scratch_buffer: &mut [u8],
840 ) -> Result<T, Error<R::Error>>
841 where
842 R::Error: core::fmt::Debug,
843 {
844 let mut reader = Deserializer {
845 decoder: reader.into(),
846 scratch: scratch_buffer,
847 recurse: 256,
848 };
849
850 T::deserialize(&mut reader)
851 }
852
853 /// Deserializes as CBOR from a type with [`impl ciborium_io::Read`](ciborium_io::Read), with
854 /// a specified maximum recursion limit. Inputs that are nested beyond the specified limit
855 /// will result in [`Error::RecursionLimitExceeded`] .
856 ///
857 /// Set a high recursion limit at your own risk (of stack exhaustion)!
858 #[inline]
from_reader_with_recursion_limit<T: de::DeserializeOwned, R: Read>( reader: R, recurse_limit: usize, ) -> Result<T, Error<R::Error>> where R::Error: core::fmt::Debug,859 pub fn from_reader_with_recursion_limit<T: de::DeserializeOwned, R: Read>(
860 reader: R,
861 recurse_limit: usize,
862 ) -> Result<T, Error<R::Error>>
863 where
864 R::Error: core::fmt::Debug,
865 {
866 let mut scratch = [0; 4096];
867
868 let mut reader = Deserializer {
869 decoder: reader.into(),
870 scratch: &mut scratch,
871 recurse: recurse_limit,
872 };
873
874 T::deserialize(&mut reader)
875 }
876