cbor/
decoder.rs

1// This Source Code Form is subject to the terms of
2// the Mozilla Public License, v. 2.0. If a copy of
3// the MPL was not distributed with this file, You
4// can obtain one at http://mozilla.org/MPL/2.0/.
5
6//! CBOR ([RFC 7049](http://tools.ietf.org/html/rfc7049))
7//! decoder implementation supporting the following features:
8//!
9//! - Generic decoding using an intermediate representation
10//! - Tag validation
11//! - Resource limits (e.g. maximum nesting level)
12//! - Direct decoding into Rust types
13//! - Indefinite sized bytes, strings, arrays and objects
14//!
15//! The module is structured as follows:
16//!
17//! 1. `Kernel` contains the basic decoding functionality, capable of
18//! decoding simple unstructured types.
19//! 2. `Decoder` directly decodes into native Rust types.
20//! 3. `GenericDecoder` handles arbitrary CBOR items and decodes them
21//! into an `Value` AST.
22//!
23//! # Example 1: Direct decoding
24//!
25//! ```
26//! use cbor::{Config, Decoder};
27//! use std::io::Cursor;
28//!
29//! let mut d = Decoder::new(Config::default(), Cursor::new(vec![0u8]));
30//! assert_eq!(Some(0), d.u64().ok())
31//! ```
32//!
33//! # Example 2: Direct decoding (nested array)
34//!
35//! ```
36//! extern crate cbor;
37//! extern crate rustc_serialize;
38//!
39//! use cbor::{Config, Decoder};
40//! use rustc_serialize::hex::FromHex;
41//! use std::io::Cursor;
42//!
43//! fn main() {
44//!     let input   = Cursor::new("828301020383010203".from_hex().unwrap());
45//!     let mut dec = Decoder::new(Config::default(), input);
46//!     let mut res = Vec::new();
47//!     for _ in 0 .. dec.array().unwrap() {
48//!         let mut vec = Vec::new();
49//!         for _ in 0 .. dec.array().unwrap() {
50//!             vec.push(dec.u8().unwrap())
51//!         }
52//!         res.push(vec)
53//!     }
54//!     assert_eq!(vec![vec![1, 2, 3], vec![1, 2, 3]], res)
55//! }
56//! ```
57//!
58//! # Example 3: Generic decoding
59//!
60//! ```
61//! extern crate cbor;
62//! extern crate rustc_serialize;
63//!
64//! use cbor::{Config, GenericDecoder};
65//! use cbor::value::{self, Key};
66//! use rustc_serialize::hex::FromHex;
67//! use std::io::Cursor;
68//!
69//! fn main() {
70//!     let input = Cursor::new("a2616101028103".from_hex().unwrap());
71//!     let mut d = GenericDecoder::new(Config::default(), input);
72//!     let value = d.value().unwrap();
73//!     let     c = value::Cursor::new(&value);
74//!     assert_eq!(Some(1), c.field("a").u8());
75//!     assert_eq!(Some(3), c.get(Key::u64(2)).at(0).u8())
76//! }
77//! ```
78//!
79//! # Example 4: Direct decoding (optional value)
80//!
81//! ```
82//! use cbor::{opt, Config, Decoder};
83//! use std::io::Cursor;
84//!
85//! let mut d = Decoder::new(Config::default(), Cursor::new(vec![0xF6]));
86//! assert_eq!(None, opt(d.u8()).unwrap())
87//! ```
88
89use byteorder::{BigEndian, ReadBytesExt};
90use slice::{ReadSlice, ReadSliceError};
91use std::collections::{BTreeMap, LinkedList};
92use std::str::{from_utf8, Utf8Error};
93use std::error::Error;
94use std::f32;
95use std::fmt;
96use std::{i8, i16, i32, i64};
97use std::io;
98use std::string;
99use skip::Skip;
100use types::{Tag, Type};
101use value::{self, Int, Bytes, Key, Simple, Text, Value};
102
103// Decoder Configuration ////////////////////////////////////////////////////
104
105/// `Config` contains various settings which limit resource consumption
106/// or enable certain validation options. Please note that the various
107/// maximum length/size values apply to an individual element only.
108///
109/// This is mainly to prevent attackers from providing CBOR values whose
110/// length is larger than the available memory. In combination the memory
111/// consumption can still become large and it is best to limit the incoming
112/// bytes to a specific upper bound, e.g. by using `std::io::Take`.
113#[derive(Clone, Debug, PartialEq, Eq)]
114pub struct Config {
115    /// Maximum number of array elements
116    pub max_len_array: usize,
117    /// Maximum length of a byte string
118    pub max_len_bytes: usize,
119    /// Maximum length of a string
120    pub max_len_text: usize,
121    /// Maximum number of object fields
122    pub max_size_map: usize,
123    /// Maximum recursion steps when decoder `Value`s
124    pub max_nesting: usize,
125    /// Ignore `Tag`s when decoding `Value`s
126    pub skip_tags: bool,
127    /// Validate `Value` type matches `Tag`.
128    pub check_tags: bool
129}
130
131const DEFAULT_CONFIG: Config = Config
132    { max_len_array: 1000
133    , max_len_bytes: 0x500000
134    , max_len_text: 0x500000
135    , max_size_map: 1000
136    , max_nesting: 16
137    , skip_tags: false
138    , check_tags: true
139    };
140
141impl Config {
142    /// Create default configuration with
143    ///
144    /// - `max_len_array` = 1000
145    /// - `max_len_bytes` = 5 MB
146    /// - `max_len_text` = 5 MB
147    /// - `max_size_map` = 1000
148    /// - `max_nesting` = 16
149    /// - `skip_tags` = false
150    /// - `check_tags` = true
151    pub fn default() -> Config { DEFAULT_CONFIG }
152}
153
154// Decode Error Type ////////////////////////////////////////////////////////
155
156pub type DecodeResult<A> = Result<A, DecodeError>;
157
158#[derive(Debug)]
159pub enum DecodeError {
160    /// An object contains the same key multiple times
161    DuplicateKey(Key),
162    /// The signed integer is greater that its max value
163    IntOverflow(u64),
164    /// The decoded `Value` can not serve as a `Key` in an object
165    InvalidKey(Value),
166    /// The type of `Value` is not what is expected for a `Tag`
167    InvalidTag(Value),
168    /// The string is not encoded in UTF-8
169    InvalidUtf8(Utf8Error),
170    /// Some I/O error
171    IoError(io::Error),
172    /// The maximum configured length is exceeded
173    TooLong { max: usize, actual: u64 },
174    /// `Value`s are nested deeper than the configured maximum
175    TooNested,
176    /// The end of file has been encountered unexpectedly
177    UnexpectedEOF,
178    /// And unexpected type has been encountered
179    UnexpectedType { datatype: Type, info: u8 },
180    /// A break was encountered at some unexpected point while
181    /// decoding an indefinite object.
182    UnexpectedBreak,
183    /// Some other error.
184    Other(Box<Error + Send + Sync>)
185}
186
187/// When decoding an optional item, i.e. a `Null` value has to be
188/// considered, this function will map `Null` to `None` and any
189/// other value to `Some(value)`.
190pub fn opt<A>(r: DecodeResult<A>) -> DecodeResult<Option<A>> {
191    match r {
192        Ok(x)  => Ok(Some(x)),
193        Err(e) => if is_null(&e) { Ok(None) } else { Err(e) }
194    }
195}
196
197/// When decoding an item which may be `Undefined` this function
198/// will map `Undefined` to `None` and any other value to `Some(value)`.
199pub fn maybe<A>(r: DecodeResult<A>) -> DecodeResult<Option<A>> {
200    match r {
201        Ok(x)  => Ok(Some(x)),
202        Err(e) => if is_undefined(&e) { Ok(None) } else { Err(e) }
203    }
204}
205
206/// When decoding an indefinite item, every element item can be a `Break`
207/// value. By wrapping it in `or_break`, this case can be handled more
208/// conveniently.
209pub fn or_break<A>(r: DecodeResult<A>) -> DecodeResult<Option<A>> {
210    match r {
211        Ok(x)  => Ok(Some(x)),
212        Err(e) => if is_break(&e) { Ok(None) } else { Err(e) }
213    }
214}
215
216fn is_break(e: &DecodeError) -> bool {
217    match *e {
218        DecodeError::UnexpectedType { datatype: Type::Break, .. } => true,
219        _ => false
220    }
221}
222
223fn is_null(e: &DecodeError) -> bool {
224    match *e {
225        DecodeError::UnexpectedType { datatype: Type::Null, .. } => true,
226        _ => false
227    }
228}
229
230fn is_undefined(e: &DecodeError) -> bool {
231    match *e {
232        DecodeError::UnexpectedType { datatype: Type::Undefined, .. } => true,
233        _ => false
234    }
235}
236
237impl fmt::Display for DecodeError {
238    fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
239        match *self {
240            DecodeError::DuplicateKey(ref k) => write!(f, "DecodeError: duplicate key: {:?}", *k),
241            DecodeError::IntOverflow(n)      => write!(f, "DecodeError: integer overflow: {}", n),
242            DecodeError::InvalidKey(ref k)   => write!(f, "DecodeError: unsuitable map key: {:?}", *k),
243            DecodeError::InvalidTag(ref v)   => write!(f, "DecodeError: value does not match tag: {:?}", *v),
244            DecodeError::InvalidUtf8(ref e)  => write!(f, "DecodeError: Invalid UTF-8 encoding: {}", *e),
245            DecodeError::IoError(ref e)      => write!(f, "DecodeError: I/O error: {}", *e),
246            DecodeError::TooNested           => write!(f, "DecodeError: value is too nested"),
247            DecodeError::UnexpectedEOF       => write!(f, "DecodeError: unexpected end-of-file"),
248            DecodeError::UnexpectedBreak     => write!(f, "DecodeError: unexpected break"),
249            DecodeError::Other(ref e)        => write!(f, "DecodeError: other: {:?}", e),
250            DecodeError::TooLong{max:m, actual:a} => write!(f, "DecodeError: value is too long {} (max={})", a, m),
251            DecodeError::UnexpectedType{datatype:t, info:i} => write!(f, "DecodeError: unexpected type {:?} (info={})", t, i)
252        }
253    }
254}
255
256impl Error for DecodeError {
257    fn description(&self) -> &str {
258        match *self {
259            DecodeError::DuplicateKey(_)    => "duplicate key in objects",
260            DecodeError::IntOverflow(_)     => "integer overflow",
261            DecodeError::InvalidKey(_)      => "invalid object key",
262            DecodeError::InvalidTag(_)      => "invalid tag",
263            DecodeError::InvalidUtf8(_)     => "invalid utf-8",
264            DecodeError::IoError(_)         => "i/o error",
265            DecodeError::TooNested          => "too deeply nested objects/arrays",
266            DecodeError::UnexpectedEOF      => "unexpected eof",
267            DecodeError::UnexpectedBreak    => "unexpected break",
268            DecodeError::Other(_)           => "other error",
269            DecodeError::TooLong{..}        => "value is too long",
270            DecodeError::UnexpectedType{..} => "unexpected type"
271        }
272    }
273
274    fn cause(&self) -> Option<&Error> {
275        match *self {
276            DecodeError::IoError(ref e)     => Some(e),
277            DecodeError::InvalidUtf8(ref e) => Some(e),
278            DecodeError::Other(ref e)       => Some(&**e),
279            _                               => None
280        }
281    }
282}
283
284impl From<io::Error> for DecodeError {
285    fn from(e: io::Error) -> DecodeError {
286        DecodeError::IoError(e)
287    }
288}
289
290impl From<string::FromUtf8Error> for DecodeError {
291    fn from(e: string::FromUtf8Error) -> DecodeError {
292        DecodeError::InvalidUtf8(e.utf8_error())
293    }
294}
295
296impl From<Utf8Error> for DecodeError {
297    fn from(e: Utf8Error) -> DecodeError {
298        DecodeError::InvalidUtf8(e)
299    }
300}
301
302impl From<ReadSliceError> for DecodeError {
303    fn from(e: ReadSliceError) -> DecodeError {
304        match e {
305            ReadSliceError::InsufficientData => DecodeError::UnexpectedEOF,
306            ReadSliceError::IoError(e)       => DecodeError::IoError(e)
307        }
308    }
309}
310
311// Macros ///////////////////////////////////////////////////////////////////
312
313// Like `read_signed` but always using `read_u8`
314macro_rules! read_signed_byte {
315    ($this: ident, $from_type: ty, $to: ident, $to_type: ty) => ({
316        $this.reader.read_u8()
317            .map_err(From::from)
318            .and_then(|n| {
319                if n > $to::MAX as $from_type {
320                    Err(DecodeError::IntOverflow(n as u64))
321                } else {
322                    Ok(-1 - n as $to_type)
323                }
324            })
325    });
326}
327
328// Read from reader, check value range and map to negative integer.
329macro_rules! read_signed {
330    ($this: ident, $from: ident, $from_type: ty, $to: ident, $to_type: ty) => ({
331        $this.reader.$from::<BigEndian>()
332            .map_err(From::from)
333            .and_then(|n| {
334                if n > $to::MAX as $from_type {
335                    Err(DecodeError::IntOverflow(n as u64))
336                } else {
337                    Ok(-1 - n as $to_type)
338                }
339            })
340    });
341}
342
343// Read unsigned integer, check value range and cast to target type.
344macro_rules! cast_unsigned {
345    ($this: ident, $from: ident, $info: ident, $from_type: ty, $to: ident, $to_type: ty) => ({
346        $this.$from($info)
347            .and_then(|n| {
348                if n > $to::MAX as $from_type {
349                    Err(DecodeError::IntOverflow(n as u64))
350                } else {
351                    Ok(n as $to_type)
352                }
353            })
354    });
355}
356
357// Decoder Kernel ///////////////////////////////////////////////////////////
358
359pub type TypeInfo = (Type, u8);
360
361/// This decoding kernel reads from an underlying `std::io::Read` type
362/// primitive CBOR values such as unsigned and signed integers as well
363/// as raw bytes.
364/// It forms the basis on which `Decoder` and `GenericDecoder` add logic
365/// for handling `Tag`s, heterogenous data and generic value decoding.
366pub struct Kernel<R> {
367    reader: R
368}
369
370impl<R: ReadBytesExt> Kernel<R> {
371    pub fn new(r: R) -> Kernel<R> {
372        Kernel { reader: r }
373    }
374
375    pub fn into_reader(self) -> R {
376        self.reader
377    }
378
379    pub fn typeinfo(&mut self) -> DecodeResult<TypeInfo> {
380        Type::read(&mut self.reader).map_err(From::from)
381    }
382
383    pub fn simple(&mut self, ti: &TypeInfo) -> DecodeResult<Simple> {
384        match ti.0 {
385            Type::Unassigned { major: 7, info: a } => Ok(Simple::Unassigned(a)),
386            Type::Reserved   { major: 7, info: a } => Ok(Simple::Reserved(a)),
387            _                                      => unexpected_type(ti)
388        }
389    }
390
391    pub fn bool(&mut self, ti: &TypeInfo) -> DecodeResult<bool> {
392        match *ti {
393            (Type::Bool, 20) => Ok(false),
394            (Type::Bool, 21) => Ok(true),
395            _                => unexpected_type(ti)
396        }
397    }
398
399    pub fn u8(&mut self, ti: &TypeInfo) -> DecodeResult<u8> {
400        match *ti {
401            (Type::UInt8, n @ 0...23) => Ok(n),
402            (Type::UInt8, 24) => self.reader.read_u8().map_err(From::from),
403            _                 => unexpected_type(ti)
404        }
405    }
406
407    pub fn u16(&mut self, ti: &TypeInfo) -> DecodeResult<u16> {
408        match *ti {
409            (Type::UInt8, n @ 0...23) => Ok(n as u16),
410            (Type::UInt8, 24)  => self.reader.read_u8().map(|n| n as u16).map_err(From::from),
411            (Type::UInt16, 25) => self.reader.read_u16::<BigEndian>().map_err(From::from),
412            _                  => unexpected_type(ti)
413        }
414    }
415
416    pub fn u32(&mut self, ti: &TypeInfo) -> DecodeResult<u32> {
417        match *ti {
418            (Type::UInt8, n @ 0...23) => Ok(n as u32),
419            (Type::UInt8, 24)  => self.reader.read_u8().map(|n| n as u32).map_err(From::from),
420            (Type::UInt16, 25) => self.reader.read_u16::<BigEndian>().map(|n| n as u32).map_err(From::from),
421            (Type::UInt32, 26) => self.reader.read_u32::<BigEndian>().map_err(From::from),
422            _                  => unexpected_type(ti)
423        }
424    }
425
426    pub fn u64(&mut self, ti: &TypeInfo) -> DecodeResult<u64> {
427        match *ti {
428            (Type::UInt8, n @ 0...23) => Ok(n as u64),
429            (Type::UInt8, 24)  => self.reader.read_u8().map(|n| n as u64).map_err(From::from),
430            (Type::UInt16, 25) => self.reader.read_u16::<BigEndian>().map(|n| n as u64).map_err(From::from),
431            (Type::UInt32, 26) => self.reader.read_u32::<BigEndian>().map(|n| n as u64).map_err(From::from),
432            (Type::UInt64, 27) => self.reader.read_u64::<BigEndian>().map_err(From::from),
433            _                  => unexpected_type(ti)
434        }
435    }
436
437    pub fn i8(&mut self, ti: &TypeInfo) -> DecodeResult<i8> {
438        match *ti {
439            (Type::Int8, n @ 0...23) => Ok(-1 - n as i8),
440            (Type::Int8, 24)         => read_signed_byte!(self, u8, i8, i8),
441            (Type::UInt8, _)         => cast_unsigned!(self, u8, ti, u8, i8, i8),
442            _                        => unexpected_type(ti)
443        }
444    }
445
446    pub fn i16(&mut self, ti: &TypeInfo) -> DecodeResult<i16> {
447        match *ti {
448            (Type::Int8, n @ 0...23) => Ok(-1 - n as i16),
449            (Type::Int8, 24)         => read_signed_byte!(self, u8, i16, i16),
450            (Type::Int16, 25)        => read_signed!(self, read_u16, u16, i16, i16),
451            (Type::UInt8, _)         => cast_unsigned!(self, u8, ti, u8, i16, i16),
452            (Type::UInt16, _)        => cast_unsigned!(self, u16, ti, u16, i16, i16),
453            _                        => unexpected_type(ti)
454        }
455    }
456
457    pub fn i32(&mut self, ti: &TypeInfo) -> DecodeResult<i32> {
458        match *ti {
459            (Type::Int8, n @ 0...23) => Ok(-1 - n as i32),
460            (Type::Int8, 24)         => read_signed_byte!(self, u8, i32, i32),
461            (Type::Int16, 25)        => read_signed!(self, read_u16, u16, i32, i32),
462            (Type::Int32, 26)        => read_signed!(self, read_u32, u32, i32, i32),
463            (Type::UInt8, _)         => cast_unsigned!(self, u8, ti, u8, i32, i32),
464            (Type::UInt16, _)        => cast_unsigned!(self, u16, ti, u16, i32, i32),
465            (Type::UInt32, _)        => cast_unsigned!(self, u32, ti, u32, i32, i32),
466            _                        => unexpected_type(ti)
467        }
468    }
469
470    pub fn i64(&mut self, ti: &TypeInfo) -> DecodeResult<i64> {
471        match *ti {
472            (Type::Int8, n @ 0...23) => Ok(-1 - n as i64),
473            (Type::Int8, 24)         => read_signed_byte!(self, u8, i64, i64),
474            (Type::Int16, 25)        => read_signed!(self, read_u16, u16, i64, i64),
475            (Type::Int32, 26)        => read_signed!(self, read_u32, u32, i64, i64),
476            (Type::Int64, 27)        => read_signed!(self, read_u64, u64, i64, i64),
477            (Type::UInt8, _)         => cast_unsigned!(self, u8, ti, u8, i64, i64),
478            (Type::UInt16, _)        => cast_unsigned!(self, u16, ti, u16, i64, i64),
479            (Type::UInt32, _)        => cast_unsigned!(self, u32, ti, u32, i64, i64),
480            (Type::UInt64, _)        => cast_unsigned!(self, u64, ti, u64, i64, i64),
481            _                        => unexpected_type(ti)
482        }
483    }
484
485    pub fn int(&mut self, ti: &TypeInfo) -> DecodeResult<Int> {
486        match *ti {
487              (Type::Int8, a)
488            | (Type::Int16, a)
489            | (Type::Int32, a)
490            | (Type::Int64, a) =>
491                self.unsigned(a).map(Int::Neg),
492
493              (Type::UInt8, a)
494            | (Type::UInt16, a)
495            | (Type::UInt32, a)
496            | (Type::UInt64, a) =>
497                self.unsigned(a).map(Int::Pos),
498
499            _ => unexpected_type(ti)
500        }
501    }
502
503    pub fn f16(&mut self, ti: &TypeInfo) -> DecodeResult<f32> {
504        match ti.0 {
505            Type::Float16 => {
506                // Copied from RFC 7049 Appendix D:
507                let half  = self.reader.read_u16::<BigEndian>()?;
508                let exp   = half >> 10 & 0x1F;
509                let mant  = half & 0x3FF;
510                let value = match exp {
511                    0  => ffi::c_ldexpf(mant as f32, -24),
512                    31 => if mant == 0 { f32::INFINITY } else { f32::NAN },
513                    _  => ffi::c_ldexpf(mant as f32 + 1024.0, exp as isize - 25)
514                };
515                Ok(if half & 0x8000 == 0 { value } else { - value })
516            }
517            _ => unexpected_type(ti)
518        }
519    }
520
521    pub fn f32(&mut self, ti: &TypeInfo) -> DecodeResult<f32> {
522        match ti.0 {
523            Type::Float32 => self.reader.read_f32::<BigEndian>().map_err(From::from),
524            _             => unexpected_type(ti)
525        }
526    }
527
528    pub fn f64(&mut self, ti: &TypeInfo) -> DecodeResult<f64> {
529        match ti.0 {
530            Type::Float64 => self.reader.read_f64::<BigEndian>().map_err(From::from),
531            _             => unexpected_type(ti)
532        }
533    }
534
535    /// Decode `first` and potentially the following bytes as an
536    /// unsigned value following the rules of major type 0.
537    pub fn unsigned(&mut self, first: u8) -> DecodeResult<u64> {
538        match first {
539            n @ 0...23 => Ok(n as u64),
540            24 => self.reader.read_u8().map(|n| n as u64).map_err(From::from),
541            25 => self.reader.read_u16::<BigEndian>().map(|n| n as u64).map_err(From::from),
542            26 => self.reader.read_u32::<BigEndian>().map(|n| n as u64).map_err(From::from),
543            27 => self.reader.read_u64::<BigEndian>().map_err(From::from),
544            _  => unexpected_type(&(Type::UInt64, first))
545        }
546    }
547
548    /// Read `begin` as the length and return that many raw bytes.
549    ///
550    /// If length is greater than the given `max_len`, `DecodeError::TooLong`
551    /// is returned instead.
552    pub fn raw_data(&mut self, begin: u8, max_len: usize) -> DecodeResult<Vec<u8>> {
553        let len = self.unsigned(begin)?;
554        if len > max_len as u64 {
555            return Err(DecodeError::TooLong { max: max_len, actual: len })
556        }
557        let n = len as usize;
558        let mut v = vec![0u8; n];
559        let mut i = 0;
560        while i < n {
561            match self.reader.read(&mut v[i..]) {
562                Ok(0)  => return Err(DecodeError::UnexpectedEOF),
563                Ok(j)  => i += j,
564                Err(e) =>
565                    if e.kind() != io::ErrorKind::Interrupted {
566                        return Err(DecodeError::IoError(e))
567                    }
568            }
569        }
570        Ok(v)
571    }
572
573    /// Read `begin` as the length and read that many raw bytes into `buf`.
574    ///
575    /// If length is greater than the given buffer, `DecodeError::TooLong`
576    /// is returned instead.
577    pub fn read_raw_data(&mut self, begin: u8, buf: &mut [u8]) -> DecodeResult<usize> {
578        let len = self.unsigned(begin)?;
579        if len > buf.len() as u64 {
580            return Err(DecodeError::TooLong { max: buf.len(), actual: len })
581        }
582        let n = len as usize;
583        let mut i = 0;
584        while i < n {
585            match self.reader.read(&mut buf[i..]) {
586                Ok(0)  => return Err(DecodeError::UnexpectedEOF),
587                Ok(j)  => i += j,
588                Err(e) =>
589                    if e.kind() != io::ErrorKind::Interrupted {
590                        return Err(DecodeError::IoError(e))
591                    }
592            }
593        }
594        Ok(n)
595    }
596}
597
598impl<R: ReadBytesExt + ReadSlice> Kernel<R> {
599    /// Read `begin` as the length and return that many raw bytes as a slice.
600    ///
601    /// If length is greater than the given `max_len`, `DecodeError::TooLong`
602    /// is returned instead.
603    pub fn raw_slice(&mut self, begin: u8, max_len: usize) -> DecodeResult<&[u8]> {
604        let len = self.unsigned(begin)?;
605        if len > max_len as u64 {
606            return Err(DecodeError::TooLong { max: max_len, actual: len })
607        }
608        self.reader.read_slice(len as usize).map_err(From::from)
609    }
610}
611
612// Workaround to not require the currently unstable `f32::ldexp`:
613mod ffi {
614    use libc::c_int;
615
616    extern {
617        pub fn ldexpf(x: f32, exp: c_int) -> f32;
618    }
619
620    #[inline]
621    pub fn c_ldexpf(x: f32, exp: isize) -> f32 {
622        unsafe { ldexpf(x, exp as c_int) }
623    }
624}
625
626fn unexpected_type<A>(ti: &TypeInfo) -> DecodeResult<A> {
627    Err(DecodeError::UnexpectedType { datatype: ti.0, info: ti.1 })
628}
629
630// Decoder //////////////////////////////////////////////////////////////////
631
632/// The actual decoder type definition
633pub struct Decoder<R> {
634    kernel: Kernel<R>,
635    config: Config
636}
637
638impl<R: ReadBytesExt> Decoder<R> {
639    pub fn new(c: Config, r: R) -> Decoder<R> {
640        Decoder { kernel: Kernel::new(r), config: c }
641    }
642
643    pub fn into_reader(self) -> R {
644        self.kernel.into_reader()
645    }
646
647    pub fn kernel(&mut self) -> &mut Kernel<R> {
648        &mut self.kernel
649    }
650
651    pub fn simple(&mut self) -> DecodeResult<Simple> {
652        self.typeinfo().and_then(|ti| self.kernel.simple(&ti))
653    }
654
655    pub fn bool(&mut self) -> DecodeResult<bool> {
656        self.typeinfo().and_then(|ti| self.kernel.bool(&ti))
657    }
658
659    pub fn u8(&mut self) -> DecodeResult<u8> {
660        self.typeinfo().and_then(|ti| self.kernel.u8(&ti))
661    }
662
663    pub fn u16(&mut self) -> DecodeResult<u16> {
664        self.typeinfo().and_then(|ti| self.kernel.u16(&ti))
665    }
666
667    pub fn u32(&mut self) -> DecodeResult<u32> {
668        self.typeinfo().and_then(|ti| self.kernel.u32(&ti))
669    }
670
671    pub fn u64(&mut self) -> DecodeResult<u64> {
672        self.typeinfo().and_then(|ti| self.kernel.u64(&ti))
673    }
674
675    pub fn i8(&mut self) -> DecodeResult<i8> {
676        self.typeinfo().and_then(|ti| self.kernel.i8(&ti))
677    }
678
679    pub fn i16(&mut self) -> DecodeResult<i16> {
680        self.typeinfo().and_then(|ti| self.kernel.i16(&ti))
681    }
682
683    pub fn i32(&mut self) -> DecodeResult<i32> {
684        self.typeinfo().and_then(|ti| self.kernel.i32(&ti))
685    }
686
687    pub fn i64(&mut self) -> DecodeResult<i64> {
688        self.typeinfo().and_then(|ti| self.kernel.i64(&ti))
689    }
690
691    pub fn int(&mut self) -> DecodeResult<Int> {
692        self.typeinfo().and_then(|ti| self.kernel.int(&ti))
693    }
694
695    pub fn f16(&mut self) -> DecodeResult<f32> {
696        self.typeinfo().and_then(|ti| self.kernel.f16(&ti))
697    }
698
699    pub fn f32(&mut self) -> DecodeResult<f32> {
700        self.typeinfo().and_then(|ti| self.kernel.f32(&ti))
701    }
702
703    pub fn f64(&mut self) -> DecodeResult<f64> {
704        self.typeinfo().and_then(|ti| self.kernel.f64(&ti))
705    }
706
707    /// Decode a single byte string into the given buffer.
708    ///
709    /// The provided buffer must be large enough to hold the entire
710    /// byte string, otherwise an error is returned.
711    ///
712    /// Please note that indefinite byte strings are not supported by this
713    /// method (Consider using `Decoder::bytes_iter()` for this use-case).
714    pub fn read_bytes(&mut self, b: &mut [u8]) -> DecodeResult<usize> {
715        match self.typeinfo()? {
716            (Type::Bytes, 31) => unexpected_type(&(Type::Bytes, 31)),
717            (Type::Bytes,  i) => self.kernel.read_raw_data(i, b),
718            ti                => unexpected_type(&ti)
719        }
720    }
721
722    /// Decode a single byte string.
723    ///
724    /// Please note that indefinite byte strings are not supported by this
725    /// method (Consider using `Decoder::bytes_iter()` for this use-case).
726    pub fn bytes(&mut self) -> DecodeResult<Vec<u8>> {
727        match self.typeinfo()? {
728            (Type::Bytes, 31) => unexpected_type(&(Type::Bytes, 31)),
729            (Type::Bytes,  i) => {
730                let max = self.config.max_len_bytes;
731                self.kernel.raw_data(i, max)
732            }
733            ti => unexpected_type(&ti)
734        }
735    }
736
737    /// Decode an indefinite byte string.
738    pub fn bytes_iter(&mut self) -> DecodeResult<BytesIter<R>> {
739        match self.typeinfo()? {
740            (Type::Bytes, 31) => Ok(BytesIter { decoder: self }),
741            ti                => unexpected_type(&ti)
742        }
743    }
744
745    /// Decode a single UTF-8 encoded String.
746    ///
747    /// Please note that indefinite strings are not supported by this method
748    /// (Consider using `Decoder::text_iter()` for this use-case).
749    pub fn text(&mut self) -> DecodeResult<String> {
750        match self.typeinfo()? {
751            (Type::Text, 31) => unexpected_type(&(Type::Text, 31)),
752            (Type::Text,  i) => {
753                let max  = self.config.max_len_text;
754                let data = self.kernel.raw_data(i, max)?;
755                String::from_utf8(data).map_err(From::from)
756            }
757            ti => unexpected_type(&ti)
758        }
759    }
760
761    /// Decode an indefinite string.
762    pub fn text_iter(&mut self) -> DecodeResult<TextIter<R>> {
763        match self.typeinfo()? {
764            (Type::Text, 31) => Ok(TextIter { decoder: self }),
765            ti               => unexpected_type(&ti)
766        }
767    }
768
769    /// Decode a `Tag`.
770    /// If no tag is found an `UnexpectedType` error is returned.
771    pub fn tag(&mut self) -> DecodeResult<Tag> {
772        match self.kernel.typeinfo()? {
773            (Type::Tagged, i) => self.kernel.unsigned(i).map(Tag::of),
774            ti                => unexpected_type(&ti)
775        }
776    }
777
778    /// Decode the begin of an array. The length is returned unless it
779    /// exceeds the configured maximum.
780    ///
781    /// Please note that indefinite arrays are not supported by this method
782    /// (Consider using `Decoder::array_begin()` for this use-case).
783    pub fn array(&mut self) -> DecodeResult<usize> {
784        match self.typeinfo()? {
785            (Type::Array, 31) => unexpected_type(&(Type::Array, 31)),
786            (Type::Array,  a) => {
787                let len = self.kernel.unsigned(a)?;
788                if len > self.config.max_len_array as u64 {
789                    return Err(DecodeError::TooLong { max: self.config.max_len_array, actual: len })
790                }
791                Ok(len as usize)
792            }
793            ti => unexpected_type(&ti)
794        }
795    }
796
797    /// Decode the begin of an indefinite array.
798    /// After this one can continue decoding items, but a `Break` value
799    /// will be encountered at some unknown point.
800    ///
801    /// (Consider using `or_break` around every decoding step within an
802    /// indefinite array to handle this case).
803    pub fn array_begin(&mut self) -> DecodeResult<()> {
804        match self.typeinfo()? {
805            (Type::Array, 31) => Ok(()),
806            ti                => unexpected_type(&ti)
807        }
808    }
809
810    /// Decode the begin of an object. The size (number of key-value pairs)
811    /// is returned unless it exceeds the configured maximum.
812    ///
813    /// Please note that indefinite objects are not supported by this method
814    /// (Consider using `Decoder::object_begin` for this use-case).
815    pub fn object(&mut self) -> DecodeResult<usize> {
816        match self.typeinfo()? {
817            (Type::Object, 31) => unexpected_type(&(Type::Object, 31)),
818            (Type::Object,  a) => {
819                let len = self.kernel.unsigned(a)?;
820                if len > self.config.max_size_map as u64 {
821                    return Err(DecodeError::TooLong { max: self.config.max_size_map, actual: len })
822                }
823                Ok(len as usize)
824            }
825            ti => unexpected_type(&ti)
826        }
827    }
828
829    /// Decode the begin of an indefinite object.
830    /// After this one can continue decoding items, but a `Break` value
831    /// will be encountered at some unknown point.
832    ///
833    /// (Consider using `or_break` around every decoding step within an
834    /// indefinite object to handle this case).
835    pub fn object_begin(&mut self) -> DecodeResult<()> {
836        match self.typeinfo()? {
837            (Type::Object, 31) => Ok(()),
838            ti                 => unexpected_type(&ti)
839        }
840    }
841
842    // Decode type information while skipping tags
843    fn typeinfo(&mut self) -> DecodeResult<TypeInfo> {
844        fn go<A: ReadBytesExt>(d: &mut Decoder<A>, level: usize) -> DecodeResult<TypeInfo> {
845            if level == 0 {
846                return Err(DecodeError::TooNested)
847            }
848            match d.kernel.typeinfo()? {
849                (Type::Tagged, i) => d.kernel.unsigned(i).and(go(d, level - 1)),
850                ti                => Ok(ti)
851            }
852        }
853        let start = self.config.max_nesting;
854        go(self, start)
855    }
856}
857
858impl<R: ReadBytesExt + Skip> Decoder<R> {
859    /// Skip over a single CBOR value.
860    ///
861    /// Please note that this function does not validate the value hence
862    /// it might not even be well-formed CBOR. Instead `skip` is an
863    /// optimisation over `GenericDecoder::value()` and generally only
864    /// determines as much information as necessary to safely skip a value
865    /// without keeping all of it in memory.
866    pub fn skip(&mut self) -> DecodeResult<()> {
867        let start = self.config.max_nesting;
868        self.skip_value(start).and(Ok(()))
869    }
870
871    fn skip_value(&mut self, level: usize) -> DecodeResult<bool> {
872        if level == 0 {
873            return Err(DecodeError::TooNested)
874        }
875        match self.typeinfo()? {
876            (Type::UInt8, n)     => self.kernel.unsigned(n).and(Ok(true)),
877            (Type::UInt16, n)    => self.kernel.unsigned(n).and(Ok(true)),
878            (Type::UInt32, n)    => self.kernel.unsigned(n).and(Ok(true)),
879            (Type::UInt64, n)    => self.kernel.unsigned(n).and(Ok(true)),
880            (Type::Int8, n)      => self.kernel.unsigned(n).and(Ok(true)),
881            (Type::Int16, n)     => self.kernel.unsigned(n).and(Ok(true)),
882            (Type::Int32, n)     => self.kernel.unsigned(n).and(Ok(true)),
883            (Type::Int64, n)     => self.kernel.unsigned(n).and(Ok(true)),
884            (Type::Bool, _)      => Ok(true),
885            (Type::Null, _)      => Ok(true),
886            (Type::Undefined, _) => Ok(true),
887            (Type::Break, _)     => Ok(false),
888            (Type::Float16, _)   => {
889                self.kernel.reader.skip(2)?;
890                Ok(true)
891            }
892            (Type::Float32, _) => {
893                self.kernel.reader.skip(4)?;
894                Ok(true)
895            }
896            (Type::Float64, _) => {
897                self.kernel.reader.skip(8)?;
898                Ok(true)
899            }
900            (Type::Bytes, 31) => self.skip_until_break(Type::Bytes).and(Ok(true)),
901            (Type::Bytes, a)  => {
902                let n = self.kernel.unsigned(a)?;
903                self.kernel.reader.skip(n)?;
904                Ok(true)
905            }
906            (Type::Text, 31) => self.skip_until_break(Type::Text).and(Ok(true)),
907            (Type::Text, a)  => {
908                let n = self.kernel.unsigned(a)?;
909                self.kernel.reader.skip(n)?;
910                Ok(true)
911            }
912            (Type::Array, 31) => {
913                while self.skip_value(level - 1)? {}
914                Ok(true)
915            }
916            (Type::Object, 31) => {
917                while self.skip_value(level - 1)? {}
918                Ok(true)
919            }
920            (Type::Array, a) => {
921                let n = self.kernel.unsigned(a)?;
922                for _ in 0 .. n {
923                    self.skip_value(level - 1)?;
924                }
925                Ok(true)
926            }
927            (Type::Object, a) => {
928                let n = self.kernel.unsigned(a)?;
929                // n == number of fields => need to skip over keys and values.
930                // Instead of doubling n we loop twice in order to avoid
931                // overflowing n.
932                for _ in 0 .. n {
933                    self.skip_value(level - 1)?;
934                }
935                for _ in 0 .. n {
936                    self.skip_value(level - 1)?;
937                }
938                Ok(true)
939            }
940            (Type::Unassigned {..}, _) => Ok(true),
941            (Type::Reserved {..}, _)   => Ok(true),
942            ti@(Type::Tagged, _)       => unexpected_type(&ti),
943            ti@(Type::Unknown {..}, _) => unexpected_type(&ti)
944        }
945    }
946
947    // Skip over `Text` or `Bytes` until a `Break` is encountered.
948    fn skip_until_break(&mut self, ty: Type) -> DecodeResult<()> {
949        loop {
950            let (t, a) = self.typeinfo()?;
951            if t == Type::Break {
952                break
953            }
954            if t != ty || a == 31 {
955                return unexpected_type(&(t, a))
956            }
957            let n = self.kernel.unsigned(a)?;
958            self.kernel.reader.skip(n)?
959        }
960        Ok(())
961    }
962}
963
964impl<R: ReadBytesExt + ReadSlice> Decoder<R> {
965    /// Decode a single UTF-8 encoded String and borrow it from underlying
966    /// buffer instead of allocating.
967    ///
968    /// Please note that indefinite strings are not supported by this method.
969    pub fn text_borrow(&mut self) -> DecodeResult<&str> {
970        match self.typeinfo()? {
971            (Type::Text, 31) => unexpected_type(&(Type::Text, 31)),
972            (Type::Text,  i) => {
973                let max  = self.config.max_len_text;
974                let data = self.kernel.raw_slice(i, max)?;
975                from_utf8(data).map_err(From::from)
976            }
977            ti => unexpected_type(&ti)
978        }
979    }
980
981    /// Decode a single byte string and borrow it from underlying
982    /// buffer instead of allocating.
983    ///
984    /// Please note that indefinite byte strings are not supported by this
985    /// method.
986    pub fn bytes_borrow(&mut self) -> DecodeResult<&[u8]> {
987        match self.typeinfo()? {
988            (Type::Bytes, 31) => unexpected_type(&(Type::Bytes, 31)),
989            (Type::Bytes,  i) => {
990                let max = self.config.max_len_bytes;
991                self.kernel.raw_slice(i, max)
992            }
993            ti => unexpected_type(&ti)
994        }
995    }
996}
997
998// Iterators ////////////////////////////////////////////////////////////////
999
1000/// Iterator over the chunks of an indefinite bytes item.
1001pub struct BytesIter<'r, R: 'r> {
1002    decoder: &'r mut Decoder<R>
1003}
1004
1005impl<'r, R: 'r + ReadBytesExt> Iterator for BytesIter<'r, R> {
1006    type Item = DecodeResult<Vec<u8>>;
1007
1008    fn next(&mut self) -> Option<DecodeResult<Vec<u8>>> {
1009        match or_break(self.decoder.bytes()) {
1010            Ok(None)    => None,
1011            Ok(Some(b)) => Some(Ok(b)),
1012            Err(e)      => Some(Err(e))
1013        }
1014    }
1015}
1016
1017/// Iterator over the chunks of an indefinite text item.
1018pub struct TextIter<'r, R: 'r> {
1019    decoder: &'r mut Decoder<R>
1020}
1021
1022impl<'r, R: 'r + ReadBytesExt> Iterator for TextIter<'r, R> {
1023    type Item = DecodeResult<String>;
1024
1025    fn next(&mut self) -> Option<DecodeResult<String>> {
1026        match or_break(self.decoder.text()) {
1027            Ok(None)    => None,
1028            Ok(Some(b)) => Some(Ok(b)),
1029            Err(e)      => Some(Err(e))
1030        }
1031    }
1032}
1033
1034// Generic Decoder //////////////////////////////////////////////////////////
1035
1036/// A generic decoder decodes arbitrary CBOR into a `Value` AST.
1037pub struct GenericDecoder<R> {
1038    decoder: Decoder<R>
1039}
1040
1041impl<R: ReadBytesExt> GenericDecoder<R> {
1042    pub fn new(c: Config, r: R) -> GenericDecoder<R> {
1043        GenericDecoder { decoder: Decoder::new(c, r) }
1044    }
1045
1046    pub fn from_decoder(d: Decoder<R>) -> GenericDecoder<R> {
1047        GenericDecoder { decoder: d }
1048    }
1049
1050    pub fn into_inner(self) -> Decoder<R> {
1051        self.decoder
1052    }
1053
1054    pub fn borrow_mut(&mut self) -> &mut Decoder<R> {
1055        &mut self.decoder
1056    }
1057
1058    /// Decode into a `Value`, i.e. an intermediate representation which
1059    /// can be further deconstructed using a `Cursor`.
1060    /// This supports indefinite decoding as well as tag validation
1061    /// (if not disabled).
1062    pub fn value(&mut self) -> DecodeResult<Value> {
1063        let start = self.decoder.config.max_nesting;
1064        self.decode_value(start)
1065    }
1066
1067    fn decode_value(&mut self, level: usize) -> DecodeResult<Value> {
1068        if level == 0 {
1069            return Err(DecodeError::TooNested)
1070        }
1071        match self.decoder.kernel.typeinfo()? {
1072            ti@(Type::UInt8, _)   => self.decoder.kernel.u8(&ti).map(Value::U8),
1073            ti@(Type::UInt16, _)  => self.decoder.kernel.u16(&ti).map(Value::U16),
1074            ti@(Type::UInt32, _)  => self.decoder.kernel.u32(&ti).map(Value::U32),
1075            ti@(Type::UInt64, _)  => self.decoder.kernel.u64(&ti).map(Value::U64),
1076            ti@(Type::Int8, _)    =>
1077                self.decoder.kernel.i16(&ti)
1078                    .map(|n| {
1079                        if n > i8::MAX as i16 || n < i8::MIN as i16 {
1080                            Value::I16(n)
1081                        } else {
1082                            Value::I8(n as i8)
1083                        }
1084                    }),
1085            ti@(Type::Int16, _) =>
1086                self.decoder.kernel.i32(&ti)
1087                    .map(|n| {
1088                        if n > i16::MAX as i32 || n < i16::MIN as i32 {
1089                            Value::I32(n)
1090                        } else {
1091                            Value::I16(n as i16)
1092                        }
1093                    }),
1094            ti@(Type::Int32, _) =>
1095                self.decoder.kernel.i64(&ti)
1096                    .map(|n| {
1097                        if n > i32::MAX as i64 || n < i32::MIN as i64 {
1098                            Value::I64(n)
1099                        } else {
1100                            Value::I32(n as i32)
1101                        }
1102                    }),
1103            (Type::Int64, a) =>
1104                self.decoder.kernel.unsigned(a)
1105                    .map(|n| {
1106                        if n > i64::MAX as u64 {
1107                            Value::Int(Int::Neg(n))
1108                        } else {
1109                            Value::I64(-1 - n as i64)
1110                        }
1111                    }),
1112            ti@(Type::Float16, _) => self.decoder.kernel.f16(&ti).map(Value::F32),
1113            ti@(Type::Float32, _) => self.decoder.kernel.f32(&ti).map(Value::F32),
1114            ti@(Type::Float64, _) => self.decoder.kernel.f64(&ti).map(Value::F64),
1115            ti@(Type::Bool, _)    => self.decoder.kernel.bool(&ti).map(Value::Bool),
1116            (Type::Null, _)       => Ok(Value::Null),
1117            (Type::Undefined, _)  => Ok(Value::Undefined),
1118            (Type::Break, _)      => Ok(Value::Break),
1119            (Type::Bytes, 31)     => { // indefinite byte string
1120                let mut i = 0u64;
1121                let mut v = LinkedList::new();
1122                loop {
1123                    match self.decoder.bytes() {
1124                        Ok(chunk) => {
1125                            i += chunk.len() as u64;
1126                            if i > self.decoder.config.max_len_bytes as u64 {
1127                                return Err(DecodeError::TooLong { max: self.decoder.config.max_len_bytes, actual: i })
1128                            }
1129                            v.push_back(chunk)
1130                        }
1131                        Err(ref e) if is_break(e) => break,
1132                        Err(e)                    => return Err(e)
1133                    }
1134                }
1135                Ok(Value::Bytes(Bytes::Chunks(v)))
1136            }
1137            (Type::Bytes, a) => {
1138                let max = self.decoder.config.max_len_bytes;
1139                self.decoder.kernel.raw_data(a, max).map(|x| Value::Bytes(Bytes::Bytes(x)))
1140            }
1141            (Type::Text, 31) => { // indefinite string
1142                let mut i = 0u64;
1143                let mut v = LinkedList::new();
1144                loop {
1145                    match self.decoder.text() {
1146                        Ok(chunk) => {
1147                            i += chunk.len() as u64;
1148                            if i > self.decoder.config.max_len_text as u64 {
1149                                return Err(DecodeError::TooLong { max: self.decoder.config.max_len_text, actual: i })
1150                            }
1151                            v.push_back(chunk)
1152                        }
1153                        Err(ref e) if is_break(e) => break,
1154                        Err(e)                    => return Err(e)
1155                    }
1156                }
1157                Ok(Value::Text(Text::Chunks(v)))
1158            }
1159            (Type::Text, a) => {
1160                let max  = self.decoder.config.max_len_text;
1161                let data = self.decoder.kernel.raw_data(a, max)?;
1162                String::from_utf8(data).map(|x| Value::Text(Text::Text(x))).map_err(From::from)
1163            }
1164            (Type::Array, 31) => { // indefinite length array
1165                let mut i = 0u64;
1166                let mut v = Vec::new();
1167                loop {
1168                    i += 1;
1169                    if i > self.decoder.config.max_len_array as u64 {
1170                        return Err(DecodeError::TooLong { max: self.decoder.config.max_len_array, actual: i })
1171                    }
1172                    match self.decode_value(level - 1) {
1173                        Ok(Value::Break) => break,
1174                        Ok(x)            => v.push(x),
1175                        e                => return e
1176                    }
1177                }
1178                Ok(Value::Array(v))
1179            }
1180            (Type::Array, a) => {
1181                let len = self.decoder.kernel.unsigned(a)?;
1182                if len > self.decoder.config.max_len_array as u64 {
1183                    return Err(DecodeError::TooLong { max: self.decoder.config.max_len_array, actual: len })
1184                }
1185                let n = len as usize;
1186                let mut v = Vec::with_capacity(n);
1187                for _ in 0 .. n {
1188                    v.push(self.decode_value(level - 1)?);
1189                }
1190                Ok(Value::Array(v))
1191            }
1192            (Type::Object, 31) => { // indefinite size object
1193                let mut i = 0u64;
1194                let mut m = BTreeMap::new();
1195                loop {
1196                    i += 1;
1197                    if i > self.decoder.config.max_size_map as u64 {
1198                        return Err(DecodeError::TooLong { max: self.decoder.config.max_size_map, actual: i })
1199                    }
1200                    match self.decode_key(level - 1) {
1201                        Ok(key) => {
1202                            if m.contains_key(&key) {
1203                                return Err(DecodeError::DuplicateKey(key))
1204                            }
1205                            match self.decode_value(level - 1)? {
1206                                Value::Break => return Err(DecodeError::UnexpectedBreak),
1207                                value        => { m.insert(key, value); }
1208                            }
1209                        }
1210                        Err(DecodeError::InvalidKey(Value::Break)) => break,
1211                        Err(e) => return Err(e)
1212                    }
1213                }
1214                Ok(Value::Map(m))
1215            }
1216            (Type::Object, a) => {
1217                let len = self.decoder.kernel.unsigned(a)?;
1218                if len > self.decoder.config.max_size_map as u64 {
1219                    return Err(DecodeError::TooLong { max: self.decoder.config.max_size_map, actual: len })
1220                }
1221                let n = len as usize;
1222                let mut m = BTreeMap::new();
1223                for _ in 0 .. n {
1224                    let key = self.decode_key(level - 1)?;
1225                    if m.contains_key(&key) {
1226                        return Err(DecodeError::DuplicateKey(key))
1227                    }
1228                    m.insert(key, self.decode_value(level - 1)?);
1229                }
1230                Ok(Value::Map(m))
1231            }
1232            (Type::Tagged, a) => {
1233                let tag = self.decoder.kernel.unsigned(a).map(Tag::of)?;
1234                if self.decoder.config.skip_tags {
1235                    return self.decode_value(level - 1)
1236                }
1237                let val = self.decode_value(level - 1).map(|v| Value::Tagged(tag, Box::new(v)))?;
1238                if self.decoder.config.check_tags && !value::check(&val) {
1239                    return Err(DecodeError::InvalidTag(val))
1240                }
1241                Ok(val)
1242            }
1243            (Type::Unassigned { major: 7, info: a }, _) => Ok(Value::Simple(Simple::Unassigned(a))),
1244            (Type::Reserved { major: 7, info: a }, _)   => Ok(Value::Simple(Simple::Reserved(a))),
1245            ti => unexpected_type(&ti)
1246        }
1247    }
1248
1249    fn decode_key(&mut self, level: usize) -> DecodeResult<Key> {
1250        match self.decode_value(level)? {
1251            Value::Bool(x)  => Ok(Key::Bool(x)),
1252            Value::Bytes(x) => Ok(Key::Bytes(x)),
1253            Value::Text(x)  => Ok(Key::Text(x)),
1254            Value::I8(x)    => Ok(Key::i64(x as i64)),
1255            Value::I16(x)   => Ok(Key::i64(x as i64)),
1256            Value::I32(x)   => Ok(Key::i64(x as i64)),
1257            Value::I64(x)   => Ok(Key::i64(x)),
1258            Value::U8(x)    => Ok(Key::u64(x as u64)),
1259            Value::U16(x)   => Ok(Key::u64(x as u64)),
1260            Value::U32(x)   => Ok(Key::u64(x as u64)),
1261            Value::U64(x)   => Ok(Key::u64(x)),
1262            Value::Int(x)   => Ok(Key::Int(x)),
1263            other           => Err(DecodeError::InvalidKey(other))
1264        }
1265    }
1266
1267}
1268
1269// Tests ////////////////////////////////////////////////////////////////////
1270
1271#[cfg(test)]
1272mod tests {
1273    use rustc_serialize::hex::FromHex;
1274    use std::{f32, f64, u64};
1275    use std::collections::BTreeMap;
1276    use std::io::Cursor;
1277    use super::*;
1278    use types::Tag;
1279    use value::{self, Int, Key, Simple, Value};
1280
1281    #[test]
1282    fn unsigned() {
1283        assert_eq!(Some(0), decoder("00").u8().ok());
1284        assert_eq!(Some(1), decoder("01").u8().ok());
1285        assert_eq!(Some(10), decoder("0a").u8().ok());
1286        assert_eq!(Some(23), decoder("17").u8().ok());
1287        assert_eq!(Some(24), decoder("1818").u8().ok());
1288        assert_eq!(Some(25), decoder("1819").u8().ok());
1289        assert_eq!(Some(100), decoder("1864").u8().ok());
1290        assert_eq!(Some(1000), decoder("1903e8").u16().ok());
1291        assert_eq!(Some(1000000), decoder("1a000f4240").u32().ok());
1292        assert_eq!(Some(1000000000000), decoder("1b000000e8d4a51000").u64().ok());
1293        assert_eq!(Some(18446744073709551615), decoder("1bffffffffffffffff").u64().ok());
1294    }
1295
1296    #[test]
1297    fn signed() {
1298        assert_eq!(Some(-1), decoder("20").i8().ok());
1299        assert_eq!(Some(-10), decoder("29").i8().ok());
1300        assert_eq!(Some(-100), decoder("3863").i8().ok());
1301        assert_eq!(Some(-500), decoder("3901f3").i16().ok());
1302        assert_eq!(Some(-1000), decoder("3903e7").i16().ok());
1303        assert_eq!(Some(-343434), decoder("3a00053d89").i32().ok());
1304        assert_eq!(Some(-23764523654), decoder("3b000000058879da85").i64().ok())
1305    }
1306
1307    #[test]
1308    fn mixed() {
1309        assert_eq!(Some(0), decoder("00").i8().ok());
1310        assert_eq!(Some(1), decoder("01").i8().ok());
1311        assert_eq!(Some(10), decoder("0a").i8().ok());
1312        assert_eq!(Some(23), decoder("17").i8().ok());
1313        assert_eq!(Some(24), decoder("1818").i8().ok());
1314        assert_eq!(Some(25), decoder("1819").i8().ok());
1315        assert_eq!(Some(100), decoder("1864").i8().ok());
1316        assert_eq!(Some(1000), decoder("1903e8").i16().ok());
1317        assert_eq!(Some(1000000), decoder("1a000f4240").i32().ok());
1318    }
1319
1320    #[test]
1321    fn int() {
1322        assert_eq!(Some(Some(0)), decoder("00").int().ok().map(|n| n.i64()));
1323        assert_eq!(Some(Some(1)), decoder("01").int().ok().map(|n| n.i64()));
1324        assert_eq!(Some(Some(10)), decoder("0a").int().ok().map(|n| n.i64()));
1325        assert_eq!(Some(Some(23)), decoder("17").int().ok().map(|n| n.i64()));
1326        assert_eq!(Some(Some(24)), decoder("1818").int().ok().map(|n| n.i64()));
1327        assert_eq!(Some(Some(25)), decoder("1819").int().ok().map(|n| n.i64()));
1328        assert_eq!(Some(Some(100)), decoder("1864").int().ok().map(|n| n.i64()));
1329        assert_eq!(Some(Some(1000)), decoder("1903e8").int().ok().map(|n| n.i64()));
1330        assert_eq!(Some(Some(1000000)), decoder("1a000f4240").int().ok().map(|n| n.i64()));
1331        assert_eq!(Some(Some(1000000000000)), decoder("1b000000e8d4a51000").int().ok().map(|n| n.i64()));
1332        assert_eq!(Some(None), decoder("1bffffffffffffffff").int().ok().map(|n| n.i64()));
1333        assert_eq!(Some(Some(0xffffffffffffffff)), decoder("1bffffffffffffffff").int().ok().map(|n| n.u64()));
1334        assert_eq!(Some(Some(0x7fffffffffffffff)), decoder("1b7fffffffffffffff").int().ok().map(|n| n.i64()));
1335        assert_eq!(Some(Some(-9223372036854775808)), decoder("3b7fffffffffffffff").int().ok().map(|n| n.i64()));
1336        assert_eq!(Some(Int::Neg(u64::MAX)), decoder("3bffffffffffffffff").int().ok());
1337        assert_eq!(Some(Some(-1)), decoder("20").int().ok().map(|n| n.i64()));
1338        assert_eq!(Some(Some(-10)), decoder("29").int().ok().map(|n| n.i64()));
1339        assert_eq!(Some(Some(-100)), decoder("3863").int().ok().map(|n| n.i64()));
1340        assert_eq!(Some(Some(-500)), decoder("3901f3").int().ok().map(|n| n.i64()));
1341        assert_eq!(Some(Some(-1000)), decoder("3903e7").int().ok().map(|n| n.i64()));
1342        assert_eq!(Some(Some(-343434)), decoder("3a00053d89").int().ok().map(|n| n.i64()));
1343        assert_eq!(Some(Some(-23764523654)), decoder("3b000000058879da85").int().ok().map(|n| n.i64()));
1344        assert_eq!(Some(Value::Int(Int::Neg(u64::MAX))), gen_decoder("3bffffffffffffffff").value().ok())
1345    }
1346
1347    #[test]
1348    fn float() {
1349        assert_eq!(Some(0.0), decoder("f90000").f16().ok());
1350        assert_eq!(Some(-0.0), decoder("f98000").f16().ok());
1351        assert_eq!(Some(1.0), decoder("f93c00").f16().ok());
1352        assert_eq!(Some(1.5), decoder("f93e00").f16().ok());
1353        assert_eq!(Some(65504.0), decoder("f97bff").f16().ok());
1354        assert_eq!(Some(f32::INFINITY), decoder("f97c00").f16().ok());
1355        assert_eq!(Some(-f32::INFINITY), decoder("f9fc00").f16().ok());
1356        assert!(decoder("f97e00").f16().ok().unwrap().is_nan());
1357
1358        assert_eq!(Some(100000.0), decoder("fa47c35000").f32().ok());
1359        assert_eq!(Some(3.4028234663852886e+38), decoder("fa7f7fffff").f32().ok());
1360        assert_eq!(Some(-4.1), decoder("fbc010666666666666").f64().ok());
1361
1362        assert_eq!(Some(f32::INFINITY), decoder("fa7f800000").f32().ok());
1363        assert_eq!(Some(-f32::INFINITY), decoder("faff800000").f32().ok());
1364        assert!(decoder("fa7fc00000").f32().ok().unwrap().is_nan());
1365
1366        assert_eq!(Some(1.0e+300), decoder("fb7e37e43c8800759c").f64().ok());
1367        assert_eq!(Some(f64::INFINITY), decoder("fb7ff0000000000000").f64().ok());
1368        assert_eq!(Some(-f64::INFINITY), decoder("fbfff0000000000000").f64().ok());
1369        assert!(decoder("fb7ff8000000000000").f64().ok().unwrap().is_nan())
1370    }
1371
1372    #[test]
1373    fn bool() {
1374        assert_eq!(Some(false), decoder("f4").bool().ok());
1375        assert_eq!(Some(true), decoder("f5").bool().ok());
1376    }
1377
1378    #[test]
1379    fn simple() {
1380        assert_eq!(Some(Simple::Unassigned(16)), decoder("f0").simple().ok());
1381        assert_eq!(Some(Simple::Reserved(24)), decoder("f818").simple().ok());
1382        assert_eq!(Some(Simple::Unassigned(255)), decoder("f8ff").simple().ok())
1383    }
1384
1385    #[test]
1386    fn bytes() {
1387        assert_eq!(Some(vec![1,2,3,4]), decoder("4401020304").bytes().ok())
1388    }
1389
1390    #[test]
1391    fn read_bytes() {
1392        let mut buf = [0u8; 4];
1393        assert_eq!(Some(4), decoder("4401020304").read_bytes(&mut buf).ok());
1394        assert_eq!([1,2,3,4], buf)
1395    }
1396
1397    #[test]
1398    fn text() {
1399        let expected1 = String::from("dfsdfsdf\r\nsdf\r\nhello\r\nsdfsfsdfs");
1400        assert_eq!(Some(expected1), decoder("781f64667364667364660d0a7364660d0a68656c6c6f0d0a736466736673646673").text().ok());
1401
1402        let expected2 = String::from("\u{00fc}");
1403        assert_eq!(Some(expected2), decoder("62c3bc").text().ok());
1404
1405        let mut r = Vec::new();
1406        let mut d = decoder("7f657374726561646d696e67ff");
1407        for t in d.text_iter().unwrap() {
1408            r.push(t.unwrap())
1409        }
1410        assert_eq!(vec![String::from("strea"), String::from("ming")], r);
1411    }
1412
1413    #[test]
1414    fn text_borrow() {
1415        let expected1 = "dfsdfsdf\r\nsdf\r\nhello\r\nsdfsfsdfs";
1416        assert_eq!(Some(expected1), decoder("781f64667364667364660d0a7364660d0a68656c6c6f0d0a736466736673646673").text_borrow().ok());
1417    }
1418
1419    #[test]
1420    fn bytes_borrow() {
1421        let expected1 = &b"dfsdfsdf\r\nsdf\r\nhello\r\nsdfsfsdfs"[..];
1422        assert_eq!(Some(expected1), decoder("581f64667364667364660d0a7364660d0a68656c6c6f0d0a736466736673646673").bytes_borrow().ok());
1423    }
1424
1425    #[test]
1426    fn option() {
1427        let none: Option<u8> = None;
1428        let some: Option<u8> = Some(1);
1429        assert_eq!(Some(none), opt(decoder("f6").u8()).ok());
1430        assert_eq!(Some(some), opt(decoder("01").u8()).ok())
1431    }
1432
1433    #[test]
1434    fn undefined() {
1435        let undef: Option<u8> = None;
1436        let def: Option<u8> = Some(1);
1437        assert_eq!(Some(undef), maybe(decoder("f7").u8()).ok());
1438        assert_eq!(Some(def), maybe(decoder("01").u8()).ok())
1439    }
1440
1441    #[test]
1442    fn empty_arrays() {
1443        assert_eq!(Some(Value::Array(vec![])), gen_decoder("9fff").value().ok());
1444
1445        let mut d = decoder("9fff");
1446        d.array_begin().unwrap();
1447        or_break(d.u8()).unwrap();
1448    }
1449
1450    #[test]
1451    fn array() {
1452        let mut d = decoder("83010203");
1453        assert_eq!(3, d.array().unwrap());
1454        assert_eq!(Some(1u32), d.u32().ok());
1455        assert_eq!(Some(2u32), d.u32().ok());
1456        assert_eq!(Some(3u32), d.u32().ok());
1457    }
1458
1459    #[test]
1460    fn object() {
1461        let mut map = BTreeMap::new();
1462        map.insert(String::from("a"), 1u8);
1463        map.insert(String::from("b"), 2u8);
1464        map.insert(String::from("c"), 3u8);
1465        let mut d = decoder("a3616101616202616303");
1466        let mut x = BTreeMap::new();
1467        for _ in 0 .. d.object().unwrap() {
1468            x.insert(d.text().unwrap(), d.u8().unwrap());
1469        }
1470        assert_eq!(map, x);
1471    }
1472
1473    #[test]
1474    fn skip() {
1475        let mut d = decoder("a66161016162820203616382040561647f657374726561646d696e67ff61659f070405ff61666568656c6c6f");
1476        for _ in 0 .. d.object().unwrap() {
1477            match d.text().unwrap().as_ref() {
1478                "a" => { d.u8().unwrap(); }
1479                "b" => for _ in 0 .. d.array().unwrap() { d.u8().unwrap(); },
1480                "c" => d.skip().unwrap(),
1481                "d" => d.skip().unwrap(),
1482                "e" => d.skip().unwrap(),
1483                "f" => d.skip().unwrap(),
1484                key => panic!("unexpected key: {}", key)
1485            }
1486        }
1487    }
1488
1489    #[test]
1490    fn array_of_array() {
1491        let mut d = decoder("828301020383010203");
1492        let outer = d.array().unwrap();
1493        let mut v = Vec::with_capacity(outer);
1494        for _ in 0 .. outer {
1495            let inner = d.array().unwrap();
1496            let mut w = Vec::with_capacity(inner);
1497            for _ in 0 .. inner {
1498                w.push(d.u8().unwrap())
1499            }
1500            v.push(w)
1501        }
1502        assert_eq!(vec![vec![1, 2, 3], vec![1, 2, 3]], v)
1503    }
1504
1505    #[test]
1506    fn object_value() {
1507        let v = gen_decoder("a2616101028103").value().ok().unwrap();
1508        let d = value::Cursor::new(&v);
1509        assert_eq!(Some(1), d.field("a").u8());
1510        assert_eq!(Some(3), d.get(Key::u64(2)).at(0).u8())
1511    }
1512
1513    #[test]
1514    fn tagged() {
1515        // by default, tags are ignored
1516        assert_eq!(Some(1363896240), decoder("c11a514b67b0").u32().ok());
1517        // but can be extracted if desired
1518        let mut d = decoder("c11a514b67b0");
1519        assert_eq!(Some(Tag::Timestamp), d.tag().ok());
1520        assert_eq!(Some(1363896240), d.u32().ok())
1521    }
1522
1523    #[test]
1524    fn tagged_value() {
1525        match gen_decoder("c11a514b67b0").value().ok() {
1526            Some(Value::Tagged(Tag::Timestamp, ref v)) if **v == Value::U32(1363896240) => (),
1527            other => panic!("impossible tagged value: {:?}", other)
1528        }
1529        match gen_decoder("c1fb41d452d9ec200000").value().ok() {
1530            Some(Value::Tagged(Tag::Timestamp, ref v)) if **v == Value::F64(1363896240.5) => (),
1531            other => panic!("impossible tagged value: {:?}", other)
1532        }
1533    }
1534
1535    fn decoder(s: &str) -> Decoder<Cursor<Vec<u8>>> {
1536        Decoder::new(Config::default(), Cursor::new(s.from_hex().unwrap()))
1537    }
1538
1539    fn gen_decoder(s: &str) -> GenericDecoder<Cursor<Vec<u8>>> {
1540        GenericDecoder::from_decoder(decoder(s))
1541    }
1542}