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::{LittleEndian, 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    /// An 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::<LittleEndian>()
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::<LittleEndian>().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::<LittleEndian>().map(|n| n as u32).map_err(From::from),
421            (Type::UInt32, 26) => self.reader.read_u32::<LittleEndian>().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::<LittleEndian>().map(|n| n as u64).map_err(From::from),
431            (Type::UInt32, 26) => self.reader.read_u32::<LittleEndian>().map(|n| n as u64).map_err(From::from),
432            (Type::UInt64, 27) => self.reader.read_u64::<LittleEndian>().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::<LittleEndian>()?;
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::<LittleEndian>().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::<LittleEndian>().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::<LittleEndian>().map(|n| n as u64).map_err(From::from),
542            26 => self.reader.read_u32::<LittleEndian>().map(|n| n as u64).map_err(From::from),
543            27 => self.reader.read_u64::<LittleEndian>().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 _bool(&mut self, ti: &TypeInfo) -> DecodeResult<bool> {
660        self.kernel.bool(&ti)
661    }
662
663    pub fn u8(&mut self) -> DecodeResult<u8> {
664        self.typeinfo().and_then(|ti| self.kernel.u8(&ti))
665    }
666
667    pub fn _u8(&mut self, ti: &TypeInfo) -> DecodeResult<u8> {
668        self.kernel.u8(&ti)
669    }
670
671    pub fn u16(&mut self) -> DecodeResult<u16> {
672        self.typeinfo().and_then(|ti| self.kernel.u16(&ti))
673    }
674
675    pub fn _u16(&mut self, ti: &TypeInfo) -> DecodeResult<u16> {
676        self.kernel.u16(&ti)
677    }
678
679    pub fn u32(&mut self) -> DecodeResult<u32> {
680        self.typeinfo().and_then(|ti| self.kernel.u32(&ti))
681    }
682    pub fn _u32(&mut self, ti: &TypeInfo) -> DecodeResult<u32> {
683        self.kernel.u32(&ti)
684    }
685
686    pub fn u64(&mut self) -> DecodeResult<u64> {
687        self.typeinfo().and_then(|ti| self.kernel.u64(&ti))
688    }
689
690    pub fn _u64(&mut self, ti: &TypeInfo) -> DecodeResult<u64> {
691        self.kernel.u64(&ti)
692    }
693
694    pub fn i8(&mut self) -> DecodeResult<i8> {
695        self.typeinfo().and_then(|ti| self.kernel.i8(&ti))
696    }
697
698    pub fn _i8(&mut self, ti: &TypeInfo) -> DecodeResult<i8> {
699        self.kernel.i8(&ti)
700    }
701
702    pub fn i16(&mut self) -> DecodeResult<i16> {
703        self.typeinfo().and_then(|ti| self.kernel.i16(&ti))
704    }
705
706    pub fn _i16(&mut self, ti: &TypeInfo) -> DecodeResult<i16> {
707        self.kernel.i16(&ti)
708    }
709
710    pub fn i32(&mut self) -> DecodeResult<i32> {
711        self.typeinfo().and_then(|ti| self.kernel.i32(&ti))
712    }
713
714    pub fn _i32(&mut self, ti: &TypeInfo) -> DecodeResult<i32> {
715        self.kernel.i32(&ti)
716    }
717
718    pub fn i64(&mut self) -> DecodeResult<i64> {
719        self.typeinfo().and_then(|ti| self.kernel.i64(&ti))
720    }
721
722    pub fn _i64(&mut self, ti: &TypeInfo) -> DecodeResult<i64> {
723        self.kernel.i64(&ti)
724    }
725
726    pub fn int(&mut self) -> DecodeResult<Int> {
727        self.typeinfo().and_then(|ti| self.kernel.int(&ti))
728    }
729
730    pub fn f16(&mut self) -> DecodeResult<f32> {
731        self.typeinfo().and_then(|ti| self.kernel.f16(&ti))
732    }
733
734    pub fn f32(&mut self) -> DecodeResult<f32> {
735        self.typeinfo().and_then(|ti| self.kernel.f32(&ti))
736    }
737
738    pub fn f64(&mut self) -> DecodeResult<f64> {
739        self.typeinfo().and_then(|ti| self.kernel.f64(&ti))
740    }
741
742    /// Decode a single byte string into the given buffer.
743    ///
744    /// The provided buffer must be large enough to hold the entire
745    /// byte string, otherwise an error is returned.
746    ///
747    /// Please note that indefinite byte strings are not supported by this
748    /// method (Consider using `Decoder::bytes_iter()` for this use-case).
749    pub fn read_bytes(&mut self, b: &mut [u8]) -> DecodeResult<usize> {
750        match self.typeinfo()? {
751            (Type::Bytes, 31) => unexpected_type(&(Type::Bytes, 31)),
752            (Type::Bytes,  i) => self.kernel.read_raw_data(i, b),
753            ti                => unexpected_type(&ti)
754        }
755    }
756
757    /// Decode a single byte string.
758    ///
759    /// Please note that indefinite byte strings are not supported by this
760    /// method (Consider using `Decoder::bytes_iter()` for this use-case).
761    pub fn bytes(&mut self) -> DecodeResult<Vec<u8>> {
762        match self.typeinfo()? {
763            (Type::Bytes, 31) => unexpected_type(&(Type::Bytes, 31)),
764            (Type::Bytes,  i) => {
765                let max = self.config.max_len_bytes;
766                self.kernel.raw_data(i, max)
767            }
768            ti => unexpected_type(&ti)
769        }
770    }
771
772    /// Decode an indefinite byte string.
773    pub fn bytes_iter(&mut self) -> DecodeResult<BytesIter<R>> {
774        match self.typeinfo()? {
775            (Type::Bytes, 31) => Ok(BytesIter { decoder: self }),
776            ti                => unexpected_type(&ti)
777        }
778    }
779
780    /// Decode a single UTF-8 encoded String.
781    ///
782    /// Please note that indefinite strings are not supported by this method
783    /// (Consider using `Decoder::text_iter()` for this use-case).
784    pub fn text(&mut self) -> DecodeResult<String> {
785        match self.typeinfo()? {
786            (Type::Text, 31) => unexpected_type(&(Type::Text, 31)),
787            (Type::Text,  i) => {
788                let max  = self.config.max_len_text;
789                let data = self.kernel.raw_data(i, max)?;
790                String::from_utf8(data).map_err(From::from)
791            }
792            ti => unexpected_type(&ti)
793        }
794    }
795
796    pub fn _text(&mut self, ti: &TypeInfo) -> DecodeResult<String> {
797        let max  = self.config.max_len_text;
798        let data = self.kernel.raw_data(ti.1, max)?;
799                let res = String::from_utf8_lossy(&data);
800                return Ok(res.to_string());
801     }
802
803
804    /// Decode an indefinite string.
805    pub fn text_iter(&mut self) -> DecodeResult<TextIter<R>> {
806        match self.typeinfo()? {
807            (Type::Text, 31) => Ok(TextIter { decoder: self }),
808            ti               => unexpected_type(&ti)
809        }
810    }
811
812    /// Decode a `Tag`.
813    /// If no tag is found an `UnexpectedType` error is returned.
814    pub fn tag(&mut self) -> DecodeResult<Tag> {
815        match self.kernel.typeinfo()? {
816            (Type::Tagged, i) => self.kernel.unsigned(i).map(Tag::of),
817            ti                => unexpected_type(&ti)
818        }
819    }
820
821    /// Decode the begin of an array. The length is returned unless it
822    /// exceeds the configured maximum.
823    ///
824    /// Please note that indefinite arrays are not supported by this method
825    /// (Consider using `Decoder::array_begin()` for this use-case).
826    pub fn array(&mut self) -> DecodeResult<usize> {
827        match self.typeinfo()? {
828            (Type::Array, 31) => unexpected_type(&(Type::Array, 31)),
829            (Type::Array,  a) => {
830                let len = self.kernel.unsigned(a)?;
831                if len > self.config.max_len_array as u64 {
832                    return Err(DecodeError::TooLong { max: self.config.max_len_array, actual: len })
833                }
834                Ok(len as usize)
835            }
836            ti => unexpected_type(&ti)
837        }
838    }
839    pub fn _array(&mut self, ti: &TypeInfo) -> DecodeResult<usize> {
840                let len = self.kernel.unsigned(ti.1)?;
841                if len > self.config.max_len_array as u64 {
842                    return Err(DecodeError::TooLong { max: self.config.max_len_array, actual: len })
843                }
844                Ok(len as usize)
845    }
846
847    /// Decode the begin of an indefinite array.
848    /// After this one can continue decoding items, but a `Break` value
849    /// will be encountered at some unknown point.
850    ///
851    /// (Consider using `or_break` around every decoding step within an
852    /// indefinite array to handle this case).
853    pub fn array_begin(&mut self) -> DecodeResult<()> {
854        match self.typeinfo()? {
855            (Type::Array, 31) => Ok(()),
856            ti                => unexpected_type(&ti)
857        }
858    }
859
860    /// Decode the begin of an object. The size (number of key-value pairs)
861    /// is returned unless it exceeds the configured maximum.
862    ///
863    /// Please note that indefinite objects are not supported by this method
864    /// (Consider using `Decoder::object_begin` for this use-case).
865    pub fn object(&mut self) -> DecodeResult<usize> {
866        match self.typeinfo()? {
867            (Type::Object, 31) => unexpected_type(&(Type::Object, 31)),
868            (Type::Object,  a) => {
869                let len = self.kernel.unsigned(a)?;
870                if len > self.config.max_size_map as u64 {
871                    return Err(DecodeError::TooLong { max: self.config.max_size_map, actual: len })
872                }
873                Ok(len as usize)
874            }
875            ti => unexpected_type(&ti)
876        }
877    }
878
879    /// Decode the begin of an indefinite object.
880    /// After this one can continue decoding items, but a `Break` value
881    /// will be encountered at some unknown point.
882    ///
883    /// (Consider using `or_break` around every decoding step within an
884    /// indefinite object to handle this case).
885    pub fn object_begin(&mut self) -> DecodeResult<()> {
886        match self.typeinfo()? {
887            (Type::Object, 31) => Ok(()),
888            ti                 => unexpected_type(&ti)
889        }
890    }
891
892    // Decode type information while skipping tags
893    pub fn typeinfo(&mut self) -> DecodeResult<TypeInfo> {
894        fn go<A: ReadBytesExt>(d: &mut Decoder<A>, level: usize) -> DecodeResult<TypeInfo> {
895            if level == 0 {
896                return Err(DecodeError::TooNested)
897            }
898            match d.kernel.typeinfo()? {
899                (Type::Tagged, i) => d.kernel.unsigned(i).and(go(d, level - 1)),
900                ti                => Ok(ti)
901            }
902        }
903        let start = self.config.max_nesting;
904        go(self, start)
905    }
906
907
908    pub fn typeinfo_and_tag(&mut self) -> DecodeResult<(TypeInfo, u64)> {
909        fn go<A: ReadBytesExt>(d: &mut Decoder<A>, level: usize, in_tag: u64) -> DecodeResult<(TypeInfo, u64)> {
910            if level == 0 {
911                return Err(DecodeError::TooNested)
912            }
913            match d.kernel.typeinfo()? {
914                (Type::Tagged, i) => {
915                    match d.kernel.unsigned(i) {
916                        Ok(tag) => {
917                                return go(d, level - 1, tag);
918                            },
919                        Err(e) => Err(e)
920                    }
921                },
922                ti=> Ok((ti, in_tag))
923            }
924        }
925        let start = self.config.max_nesting;
926        go(self, start, 255)
927    }
928
929}
930
931
932impl<R: ReadBytesExt + Skip> Decoder<R> {
933    /// Skip over a single CBOR value.
934    ///
935    /// Please note that this function does not validate the value hence
936    /// it might not even be well-formed CBOR. Instead `skip` is an
937    /// optimisation over `GenericDecoder::value()` and generally only
938    /// determines as much information as necessary to safely skip a value
939    /// without keeping all of it in memory.
940    pub fn skip(&mut self) -> DecodeResult<()> {
941        let start = self.config.max_nesting;
942        self.skip_value(start).and(Ok(()))
943    }
944
945    fn skip_value(&mut self, level: usize) -> DecodeResult<bool> {
946        if level == 0 {
947            return Err(DecodeError::TooNested)
948        }
949        match self.typeinfo()? {
950            (Type::UInt8, n)     => self.kernel.unsigned(n).and(Ok(true)),
951            (Type::UInt16, n)    => self.kernel.unsigned(n).and(Ok(true)),
952            (Type::UInt32, n)    => self.kernel.unsigned(n).and(Ok(true)),
953            (Type::UInt64, n)    => self.kernel.unsigned(n).and(Ok(true)),
954            (Type::Int8, n)      => self.kernel.unsigned(n).and(Ok(true)),
955            (Type::Int16, n)     => self.kernel.unsigned(n).and(Ok(true)),
956            (Type::Int32, n)     => self.kernel.unsigned(n).and(Ok(true)),
957            (Type::Int64, n)     => self.kernel.unsigned(n).and(Ok(true)),
958            (Type::Bool, _)      => Ok(true),
959            (Type::Null, _)      => Ok(true),
960            (Type::Undefined, _) => Ok(true),
961            (Type::Break, _)     => Ok(false),
962            (Type::Float16, _)   => {
963                self.kernel.reader.skip(2)?;
964                Ok(true)
965            }
966            (Type::Float32, _) => {
967                self.kernel.reader.skip(4)?;
968                Ok(true)
969            }
970            (Type::Float64, _) => {
971                self.kernel.reader.skip(8)?;
972                Ok(true)
973            }
974            (Type::Bytes, 31) => self.skip_until_break(Type::Bytes).and(Ok(true)),
975            (Type::Bytes, a)  => {
976                let n = self.kernel.unsigned(a)?;
977                self.kernel.reader.skip(n)?;
978                Ok(true)
979            }
980            (Type::Text, 31) => self.skip_until_break(Type::Text).and(Ok(true)),
981            (Type::Text, a)  => {
982                let n = self.kernel.unsigned(a)?;
983                self.kernel.reader.skip(n)?;
984                Ok(true)
985            }
986            (Type::Array, 31) => {
987                while self.skip_value(level - 1)? {}
988                Ok(true)
989            }
990            (Type::Object, 31) => {
991                while self.skip_value(level - 1)? {}
992                Ok(true)
993            }
994            (Type::Array, a) => {
995                let n = self.kernel.unsigned(a)?;
996                for _ in 0 .. n {
997                    self.skip_value(level - 1)?;
998                }
999                Ok(true)
1000            }
1001            (Type::Object, a) => {
1002                let n = self.kernel.unsigned(a)?;
1003                // n == number of fields => need to skip over keys and values.
1004                // Instead of doubling n we loop twice in order to avoid
1005                // overflowing n.
1006                for _ in 0 .. n {
1007                    self.skip_value(level - 1)?;
1008                }
1009                for _ in 0 .. n {
1010                    self.skip_value(level - 1)?;
1011                }
1012                Ok(true)
1013            }
1014            (Type::Unassigned {..}, _) => Ok(true),
1015            (Type::Reserved {..}, _)   => Ok(true),
1016            ti@(Type::Tagged, _)       => unexpected_type(&ti),
1017            ti@(Type::Unknown {..}, _) => unexpected_type(&ti)
1018        }
1019    }
1020
1021    // Skip over `Text` or `Bytes` until a `Break` is encountered.
1022    fn skip_until_break(&mut self, ty: Type) -> DecodeResult<()> {
1023        loop {
1024            let (t, a) = self.typeinfo()?;
1025            if t == Type::Break {
1026                break
1027            }
1028            if t != ty || a == 31 {
1029                return unexpected_type(&(t, a))
1030            }
1031            let n = self.kernel.unsigned(a)?;
1032            self.kernel.reader.skip(n)?
1033        }
1034        Ok(())
1035    }
1036}
1037
1038impl<R: ReadBytesExt + ReadSlice> Decoder<R> {
1039    /// Decode a single UTF-8 encoded String and borrow it from underlying
1040    /// buffer instead of allocating.
1041    ///
1042    /// Please note that indefinite strings are not supported by this method.
1043    pub fn text_borrow(&mut self) -> DecodeResult<&str> {
1044        match self.typeinfo()? {
1045            (Type::Text, 31) => unexpected_type(&(Type::Text, 31)),
1046            (Type::Text,  i) => {
1047                let max  = self.config.max_len_text;
1048                let data = self.kernel.raw_slice(i, max)?;
1049                from_utf8(data).map_err(From::from)
1050            }
1051            ti => unexpected_type(&ti)
1052        }
1053    }
1054
1055    /// Decode a single byte string and borrow it from underlying
1056    /// buffer instead of allocating.
1057    ///
1058    /// Please note that indefinite byte strings are not supported by this
1059    /// method.
1060    pub fn bytes_borrow(&mut self) -> DecodeResult<&[u8]> {
1061        match self.typeinfo()? {
1062            (Type::Bytes, 31) => unexpected_type(&(Type::Bytes, 31)),
1063            (Type::Bytes,  i) => {
1064                let max = self.config.max_len_bytes;
1065                self.kernel.raw_slice(i, max)
1066            }
1067            ti => unexpected_type(&ti)
1068        }
1069    }
1070}
1071
1072// Iterators ////////////////////////////////////////////////////////////////
1073
1074/// Iterator over the chunks of an indefinite bytes item.
1075pub struct BytesIter<'r, R: 'r> {
1076    decoder: &'r mut Decoder<R>
1077}
1078
1079impl<'r, R: 'r + ReadBytesExt> Iterator for BytesIter<'r, R> {
1080    type Item = DecodeResult<Vec<u8>>;
1081
1082    fn next(&mut self) -> Option<DecodeResult<Vec<u8>>> {
1083        match or_break(self.decoder.bytes()) {
1084            Ok(None)    => None,
1085            Ok(Some(b)) => Some(Ok(b)),
1086            Err(e)      => Some(Err(e))
1087        }
1088    }
1089}
1090
1091/// Iterator over the chunks of an indefinite text item.
1092pub struct TextIter<'r, R: 'r> {
1093    decoder: &'r mut Decoder<R>
1094}
1095
1096impl<'r, R: 'r + ReadBytesExt> Iterator for TextIter<'r, R> {
1097    type Item = DecodeResult<String>;
1098
1099    fn next(&mut self) -> Option<DecodeResult<String>> {
1100        match or_break(self.decoder.text()) {
1101            Ok(None)    => None,
1102            Ok(Some(b)) => Some(Ok(b)),
1103            Err(e)      => Some(Err(e))
1104        }
1105    }
1106}
1107
1108// Generic Decoder //////////////////////////////////////////////////////////
1109
1110/// A generic decoder decodes arbitrary CBOR into a `Value` AST.
1111pub struct GenericDecoder<R> {
1112    decoder: Decoder<R>
1113}
1114
1115impl<R: ReadBytesExt> GenericDecoder<R> {
1116    pub fn new(c: Config, r: R) -> GenericDecoder<R> {
1117        GenericDecoder { decoder: Decoder::new(c, r) }
1118    }
1119
1120    pub fn from_decoder(d: Decoder<R>) -> GenericDecoder<R> {
1121        GenericDecoder { decoder: d }
1122    }
1123
1124    pub fn into_inner(self) -> Decoder<R> {
1125        self.decoder
1126    }
1127
1128    pub fn borrow_mut(&mut self) -> &mut Decoder<R> {
1129        &mut self.decoder
1130    }
1131
1132    /// Decode into a `Value`, i.e. an intermediate representation which
1133    /// can be further deconstructed using a `Cursor`.
1134    /// This supports indefinite decoding as well as tag validation
1135    /// (if not disabled).
1136    pub fn value(&mut self) -> DecodeResult<Value> {
1137        let start = self.decoder.config.max_nesting;
1138        self.decode_value(start)
1139    }
1140
1141    fn decode_value(&mut self, level: usize) -> DecodeResult<Value> {
1142        if level == 0 {
1143            return Err(DecodeError::TooNested)
1144        }
1145        match self.decoder.kernel.typeinfo()? {
1146            ti@(Type::UInt8, _)   => self.decoder.kernel.u8(&ti).map(Value::U8),
1147            ti@(Type::UInt16, _)  => self.decoder.kernel.u16(&ti).map(Value::U16),
1148            ti@(Type::UInt32, _)  => self.decoder.kernel.u32(&ti).map(Value::U32),
1149            ti@(Type::UInt64, _)  => self.decoder.kernel.u64(&ti).map(Value::U64),
1150            ti@(Type::Int8, _)    =>
1151                self.decoder.kernel.i16(&ti)
1152                    .map(|n| {
1153                        if n > i8::MAX as i16 || n < i8::MIN as i16 {
1154                            Value::I16(n)
1155                        } else {
1156                            Value::I8(n as i8)
1157                        }
1158                    }),
1159            ti@(Type::Int16, _) =>
1160                self.decoder.kernel.i32(&ti)
1161                    .map(|n| {
1162                        if n > i16::MAX as i32 || n < i16::MIN as i32 {
1163                            Value::I32(n)
1164                        } else {
1165                            Value::I16(n as i16)
1166                        }
1167                    }),
1168            ti@(Type::Int32, _) =>
1169                self.decoder.kernel.i64(&ti)
1170                    .map(|n| {
1171                        if n > i32::MAX as i64 || n < i32::MIN as i64 {
1172                            Value::I64(n)
1173                        } else {
1174                            Value::I32(n as i32)
1175                        }
1176                    }),
1177            (Type::Int64, a) =>
1178                self.decoder.kernel.unsigned(a)
1179                    .map(|n| {
1180                        if n > i64::MAX as u64 {
1181                            Value::Int(Int::Neg(n))
1182                        } else {
1183                            Value::I64(-1 - n as i64)
1184                        }
1185                    }),
1186            ti@(Type::Float16, _) => self.decoder.kernel.f16(&ti).map(Value::F32),
1187            ti@(Type::Float32, _) => self.decoder.kernel.f32(&ti).map(Value::F32),
1188            ti@(Type::Float64, _) => self.decoder.kernel.f64(&ti).map(Value::F64),
1189            ti@(Type::Bool, _)    => self.decoder.kernel.bool(&ti).map(Value::Bool),
1190            (Type::Null, _)       => Ok(Value::Null),
1191            (Type::Undefined, _)  => Ok(Value::Undefined),
1192            (Type::Break, _)      => Ok(Value::Break),
1193            (Type::Bytes, 31)     => { // indefinite byte string
1194                let mut i = 0u64;
1195                let mut v = LinkedList::new();
1196                loop {
1197                    match self.decoder.bytes() {
1198                        Ok(chunk) => {
1199                            i += chunk.len() as u64;
1200                            if i > self.decoder.config.max_len_bytes as u64 {
1201                                return Err(DecodeError::TooLong { max: self.decoder.config.max_len_bytes, actual: i })
1202                            }
1203                            v.push_back(chunk)
1204                        }
1205                        Err(ref e) if is_break(e) => break,
1206                        Err(e)                    => return Err(e)
1207                    }
1208                }
1209                Ok(Value::Bytes(Bytes::Chunks(v)))
1210            }
1211            (Type::Bytes, a) => {
1212                let max = self.decoder.config.max_len_bytes;
1213                self.decoder.kernel.raw_data(a, max).map(|x| Value::Bytes(Bytes::Bytes(x)))
1214            }
1215            (Type::Text, 31) => { // indefinite string
1216                let mut i = 0u64;
1217                let mut v = LinkedList::new();
1218                loop {
1219                    match self.decoder.text() {
1220                        Ok(chunk) => {
1221                            i += chunk.len() as u64;
1222                            if i > self.decoder.config.max_len_text as u64 {
1223                                return Err(DecodeError::TooLong { max: self.decoder.config.max_len_text, actual: i })
1224                            }
1225                            v.push_back(chunk)
1226                        }
1227                        Err(ref e) if is_break(e) => break,
1228                        Err(e)                    => return Err(e)
1229                    }
1230                }
1231                Ok(Value::Text(Text::Chunks(v)))
1232            }
1233            (Type::Text, a) => {
1234                let max  = self.decoder.config.max_len_text;
1235                let data = self.decoder.kernel.raw_data(a, max)?;
1236                String::from_utf8(data).map(|x| Value::Text(Text::Text(x))).map_err(From::from)
1237            }
1238            (Type::Array, 31) => { // indefinite length array
1239                let mut i = 0u64;
1240                let mut v = Vec::new();
1241                loop {
1242                    i += 1;
1243                    if i > self.decoder.config.max_len_array as u64 {
1244                        return Err(DecodeError::TooLong { max: self.decoder.config.max_len_array, actual: i })
1245                    }
1246                    match self.decode_value(level - 1) {
1247                        Ok(Value::Break) => break,
1248                        Ok(x)            => v.push(x),
1249                        e                => return e
1250                    }
1251                }
1252                Ok(Value::Array(v))
1253            }
1254            (Type::Array, a) => {
1255                let len = self.decoder.kernel.unsigned(a)?;
1256                if len > self.decoder.config.max_len_array as u64 {
1257                    return Err(DecodeError::TooLong { max: self.decoder.config.max_len_array, actual: len })
1258                }
1259                let n = len as usize;
1260                let mut v = Vec::with_capacity(n);
1261                for _ in 0 .. n {
1262                    v.push(self.decode_value(level - 1)?);
1263                }
1264                Ok(Value::Array(v))
1265            }
1266            (Type::Object, 31) => { // indefinite size object
1267                let mut i = 0u64;
1268                let mut m = BTreeMap::new();
1269                loop {
1270                    i += 1;
1271                    if i > self.decoder.config.max_size_map as u64 {
1272                        return Err(DecodeError::TooLong { max: self.decoder.config.max_size_map, actual: i })
1273                    }
1274                    match self.decode_key(level - 1) {
1275                        Ok(key) => {
1276                            if m.contains_key(&key) {
1277                                return Err(DecodeError::DuplicateKey(key))
1278                            }
1279                            match self.decode_value(level - 1)? {
1280                                Value::Break => return Err(DecodeError::UnexpectedBreak),
1281                                value        => { m.insert(key, value); }
1282                            }
1283                        }
1284                        Err(DecodeError::InvalidKey(Value::Break)) => break,
1285                        Err(e) => return Err(e)
1286                    }
1287                }
1288                Ok(Value::Map(m))
1289            }
1290            (Type::Object, a) => {
1291                let len = self.decoder.kernel.unsigned(a)?;
1292                if len > self.decoder.config.max_size_map as u64 {
1293                    return Err(DecodeError::TooLong { max: self.decoder.config.max_size_map, actual: len })
1294                }
1295                let n = len as usize;
1296                let mut m = BTreeMap::new();
1297                for _ in 0 .. n {
1298                    let key = self.decode_key(level - 1)?;
1299                    if m.contains_key(&key) {
1300                        return Err(DecodeError::DuplicateKey(key))
1301                    }
1302                    m.insert(key, self.decode_value(level - 1)?);
1303                }
1304                Ok(Value::Map(m))
1305            }
1306            (Type::Tagged, a) => {
1307                let tag = self.decoder.kernel.unsigned(a).map(Tag::of)?;
1308                if self.decoder.config.skip_tags {
1309                    return self.decode_value(level - 1)
1310                }
1311                let val = self.decode_value(level - 1).map(|v| Value::Tagged(tag, Box::new(v)))?;
1312                if self.decoder.config.check_tags && !value::check(&val) {
1313                    return Err(DecodeError::InvalidTag(val))
1314                }
1315                Ok(val)
1316            }
1317            (Type::Unassigned { major: 7, info: a }, _) => Ok(Value::Simple(Simple::Unassigned(a))),
1318            (Type::Reserved { major: 7, info: a }, _)   => Ok(Value::Simple(Simple::Reserved(a))),
1319            ti => unexpected_type(&ti)
1320        }
1321    }
1322
1323    fn decode_key(&mut self, level: usize) -> DecodeResult<Key> {
1324        match self.decode_value(level)? {
1325            Value::Bool(x)  => Ok(Key::Bool(x)),
1326            Value::Bytes(x) => Ok(Key::Bytes(x)),
1327            Value::Text(x)  => Ok(Key::Text(x)),
1328            Value::I8(x)    => Ok(Key::i64(x as i64)),
1329            Value::I16(x)   => Ok(Key::i64(x as i64)),
1330            Value::I32(x)   => Ok(Key::i64(x as i64)),
1331            Value::I64(x)   => Ok(Key::i64(x)),
1332            Value::U8(x)    => Ok(Key::u64(x as u64)),
1333            Value::U16(x)   => Ok(Key::u64(x as u64)),
1334            Value::U32(x)   => Ok(Key::u64(x as u64)),
1335            Value::U64(x)   => Ok(Key::u64(x)),
1336            Value::Int(x)   => Ok(Key::Int(x)),
1337            other           => Err(DecodeError::InvalidKey(other))
1338        }
1339    }
1340
1341}
1342
1343// Tests ////////////////////////////////////////////////////////////////////
1344
1345#[cfg(test)]
1346mod tests {
1347    use rustc_serialize::hex::FromHex;
1348    use std::{f32, f64, u64};
1349    use std::collections::BTreeMap;
1350    use std::io::Cursor;
1351    use super::*;
1352    use types::Tag;
1353    use value::{self, Int, Key, Simple, Value};
1354
1355    #[test]
1356    fn unsigned() {
1357        assert_eq!(Some(0), decoder("00").u8().ok());
1358        assert_eq!(Some(1), decoder("01").u8().ok());
1359        assert_eq!(Some(10), decoder("0a").u8().ok());
1360        assert_eq!(Some(23), decoder("17").u8().ok());
1361        assert_eq!(Some(24), decoder("1818").u8().ok());
1362        assert_eq!(Some(25), decoder("1819").u8().ok());
1363        assert_eq!(Some(100), decoder("1864").u8().ok());
1364        assert_eq!(Some(1000), decoder("1903e8").u16().ok());
1365        assert_eq!(Some(1000000), decoder("1a000f4240").u32().ok());
1366        assert_eq!(Some(1000000000000), decoder("1b000000e8d4a51000").u64().ok());
1367        assert_eq!(Some(18446744073709551615), decoder("1bffffffffffffffff").u64().ok());
1368    }
1369
1370    #[test]
1371    fn signed() {
1372        assert_eq!(Some(-1), decoder("20").i8().ok());
1373        assert_eq!(Some(-10), decoder("29").i8().ok());
1374        assert_eq!(Some(-100), decoder("3863").i8().ok());
1375        assert_eq!(Some(-500), decoder("3901f3").i16().ok());
1376        assert_eq!(Some(-1000), decoder("3903e7").i16().ok());
1377        assert_eq!(Some(-343434), decoder("3a00053d89").i32().ok());
1378        assert_eq!(Some(-23764523654), decoder("3b000000058879da85").i64().ok())
1379    }
1380
1381    #[test]
1382    fn mixed() {
1383        assert_eq!(Some(0), decoder("00").i8().ok());
1384        assert_eq!(Some(1), decoder("01").i8().ok());
1385        assert_eq!(Some(10), decoder("0a").i8().ok());
1386        assert_eq!(Some(23), decoder("17").i8().ok());
1387        assert_eq!(Some(24), decoder("1818").i8().ok());
1388        assert_eq!(Some(25), decoder("1819").i8().ok());
1389        assert_eq!(Some(100), decoder("1864").i8().ok());
1390        assert_eq!(Some(1000), decoder("1903e8").i16().ok());
1391        assert_eq!(Some(1000000), decoder("1a000f4240").i32().ok());
1392    }
1393
1394    #[test]
1395    fn int() {
1396        assert_eq!(Some(Some(0)), decoder("00").int().ok().map(|n| n.i64()));
1397        assert_eq!(Some(Some(1)), decoder("01").int().ok().map(|n| n.i64()));
1398        assert_eq!(Some(Some(10)), decoder("0a").int().ok().map(|n| n.i64()));
1399        assert_eq!(Some(Some(23)), decoder("17").int().ok().map(|n| n.i64()));
1400        assert_eq!(Some(Some(24)), decoder("1818").int().ok().map(|n| n.i64()));
1401        assert_eq!(Some(Some(25)), decoder("1819").int().ok().map(|n| n.i64()));
1402        assert_eq!(Some(Some(100)), decoder("1864").int().ok().map(|n| n.i64()));
1403        assert_eq!(Some(Some(1000)), decoder("1903e8").int().ok().map(|n| n.i64()));
1404        assert_eq!(Some(Some(1000000)), decoder("1a000f4240").int().ok().map(|n| n.i64()));
1405        assert_eq!(Some(Some(1000000000000)), decoder("1b000000e8d4a51000").int().ok().map(|n| n.i64()));
1406        assert_eq!(Some(None), decoder("1bffffffffffffffff").int().ok().map(|n| n.i64()));
1407        assert_eq!(Some(Some(0xffffffffffffffff)), decoder("1bffffffffffffffff").int().ok().map(|n| n.u64()));
1408        assert_eq!(Some(Some(0x7fffffffffffffff)), decoder("1b7fffffffffffffff").int().ok().map(|n| n.i64()));
1409        assert_eq!(Some(Some(-9223372036854775808)), decoder("3b7fffffffffffffff").int().ok().map(|n| n.i64()));
1410        assert_eq!(Some(Int::Neg(u64::MAX)), decoder("3bffffffffffffffff").int().ok());
1411        assert_eq!(Some(Some(-1)), decoder("20").int().ok().map(|n| n.i64()));
1412        assert_eq!(Some(Some(-10)), decoder("29").int().ok().map(|n| n.i64()));
1413        assert_eq!(Some(Some(-100)), decoder("3863").int().ok().map(|n| n.i64()));
1414        assert_eq!(Some(Some(-500)), decoder("3901f3").int().ok().map(|n| n.i64()));
1415        assert_eq!(Some(Some(-1000)), decoder("3903e7").int().ok().map(|n| n.i64()));
1416        assert_eq!(Some(Some(-343434)), decoder("3a00053d89").int().ok().map(|n| n.i64()));
1417        assert_eq!(Some(Some(-23764523654)), decoder("3b000000058879da85").int().ok().map(|n| n.i64()));
1418        assert_eq!(Some(Value::Int(Int::Neg(u64::MAX))), gen_decoder("3bffffffffffffffff").value().ok())
1419    }
1420
1421    #[test]
1422    fn float() {
1423        assert_eq!(Some(0.0), decoder("f90000").f16().ok());
1424        assert_eq!(Some(-0.0), decoder("f98000").f16().ok());
1425        assert_eq!(Some(1.0), decoder("f93c00").f16().ok());
1426        assert_eq!(Some(1.5), decoder("f93e00").f16().ok());
1427        assert_eq!(Some(65504.0), decoder("f97bff").f16().ok());
1428        assert_eq!(Some(f32::INFINITY), decoder("f97c00").f16().ok());
1429        assert_eq!(Some(-f32::INFINITY), decoder("f9fc00").f16().ok());
1430        assert!(decoder("f97e00").f16().ok().unwrap().is_nan());
1431
1432        assert_eq!(Some(100000.0), decoder("fa47c35000").f32().ok());
1433        assert_eq!(Some(3.4028234663852886e+38), decoder("fa7f7fffff").f32().ok());
1434        assert_eq!(Some(-4.1), decoder("fbc010666666666666").f64().ok());
1435
1436        assert_eq!(Some(f32::INFINITY), decoder("fa7f800000").f32().ok());
1437        assert_eq!(Some(-f32::INFINITY), decoder("faff800000").f32().ok());
1438        assert!(decoder("fa7fc00000").f32().ok().unwrap().is_nan());
1439
1440        assert_eq!(Some(1.0e+300), decoder("fb7e37e43c8800759c").f64().ok());
1441        assert_eq!(Some(f64::INFINITY), decoder("fb7ff0000000000000").f64().ok());
1442        assert_eq!(Some(-f64::INFINITY), decoder("fbfff0000000000000").f64().ok());
1443        assert!(decoder("fb7ff8000000000000").f64().ok().unwrap().is_nan())
1444    }
1445
1446    #[test]
1447    fn bool() {
1448        assert_eq!(Some(false), decoder("f4").bool().ok());
1449        assert_eq!(Some(true), decoder("f5").bool().ok());
1450    }
1451
1452    #[test]
1453    fn simple() {
1454        assert_eq!(Some(Simple::Unassigned(16)), decoder("f0").simple().ok());
1455        assert_eq!(Some(Simple::Reserved(24)), decoder("f818").simple().ok());
1456        assert_eq!(Some(Simple::Unassigned(255)), decoder("f8ff").simple().ok())
1457    }
1458
1459    #[test]
1460    fn bytes() {
1461        assert_eq!(Some(vec![1,2,3,4]), decoder("4401020304").bytes().ok())
1462    }
1463
1464    #[test]
1465    fn read_bytes() {
1466        let mut buf = [0u8; 4];
1467        assert_eq!(Some(4), decoder("4401020304").read_bytes(&mut buf).ok());
1468        assert_eq!([1,2,3,4], buf)
1469    }
1470
1471    #[test]
1472    fn text() {
1473        let expected1 = String::from("dfsdfsdf\r\nsdf\r\nhello\r\nsdfsfsdfs");
1474        assert_eq!(Some(expected1), decoder("781f64667364667364660d0a7364660d0a68656c6c6f0d0a736466736673646673").text().ok());
1475
1476        let expected2 = String::from("\u{00fc}");
1477        assert_eq!(Some(expected2), decoder("62c3bc").text().ok());
1478
1479        let mut r = Vec::new();
1480        let mut d = decoder("7f657374726561646d696e67ff");
1481        for t in d.text_iter().unwrap() {
1482            r.push(t.unwrap())
1483        }
1484        assert_eq!(vec![String::from("strea"), String::from("ming")], r);
1485    }
1486
1487    #[test]
1488    fn text_borrow() {
1489        let expected1 = "dfsdfsdf\r\nsdf\r\nhello\r\nsdfsfsdfs";
1490        assert_eq!(Some(expected1), decoder("781f64667364667364660d0a7364660d0a68656c6c6f0d0a736466736673646673").text_borrow().ok());
1491    }
1492
1493    #[test]
1494    fn bytes_borrow() {
1495        let expected1 = &b"dfsdfsdf\r\nsdf\r\nhello\r\nsdfsfsdfs"[..];
1496        assert_eq!(Some(expected1), decoder("581f64667364667364660d0a7364660d0a68656c6c6f0d0a736466736673646673").bytes_borrow().ok());
1497    }
1498
1499    #[test]
1500    fn option() {
1501        let none: Option<u8> = None;
1502        let some: Option<u8> = Some(1);
1503        assert_eq!(Some(none), opt(decoder("f6").u8()).ok());
1504        assert_eq!(Some(some), opt(decoder("01").u8()).ok())
1505    }
1506
1507    #[test]
1508    fn undefined() {
1509        let undef: Option<u8> = None;
1510        let def: Option<u8> = Some(1);
1511        assert_eq!(Some(undef), maybe(decoder("f7").u8()).ok());
1512        assert_eq!(Some(def), maybe(decoder("01").u8()).ok())
1513    }
1514
1515    #[test]
1516    fn empty_arrays() {
1517        assert_eq!(Some(Value::Array(vec![])), gen_decoder("9fff").value().ok());
1518
1519        let mut d = decoder("9fff");
1520        d.array_begin().unwrap();
1521        or_break(d.u8()).unwrap();
1522    }
1523
1524    #[test]
1525    fn array() {
1526        let mut d = decoder("83010203");
1527        assert_eq!(3, d.array().unwrap());
1528        assert_eq!(Some(1u32), d.u32().ok());
1529        assert_eq!(Some(2u32), d.u32().ok());
1530        assert_eq!(Some(3u32), d.u32().ok());
1531    }
1532
1533    #[test]
1534    fn object() {
1535        let mut map = BTreeMap::new();
1536        map.insert(String::from("a"), 1u8);
1537        map.insert(String::from("b"), 2u8);
1538        map.insert(String::from("c"), 3u8);
1539        let mut d = decoder("a3616101616202616303");
1540        let mut x = BTreeMap::new();
1541        for _ in 0 .. d.object().unwrap() {
1542            x.insert(d.text().unwrap(), d.u8().unwrap());
1543        }
1544        assert_eq!(map, x);
1545    }
1546
1547    #[test]
1548    fn skip() {
1549        let mut d = decoder("a66161016162820203616382040561647f657374726561646d696e67ff61659f070405ff61666568656c6c6f");
1550        for _ in 0 .. d.object().unwrap() {
1551            match d.text().unwrap().as_ref() {
1552                "a" => { d.u8().unwrap(); }
1553                "b" => for _ in 0 .. d.array().unwrap() { d.u8().unwrap(); },
1554                "c" => d.skip().unwrap(),
1555                "d" => d.skip().unwrap(),
1556                "e" => d.skip().unwrap(),
1557                "f" => d.skip().unwrap(),
1558                key => panic!("unexpected key: {}", key)
1559            }
1560        }
1561    }
1562
1563    #[test]
1564    fn array_of_array() {
1565        let mut d = decoder("828301020383010203");
1566        let outer = d.array().unwrap();
1567        let mut v = Vec::with_capacity(outer);
1568        for _ in 0 .. outer {
1569            let inner = d.array().unwrap();
1570            let mut w = Vec::with_capacity(inner);
1571            for _ in 0 .. inner {
1572                w.push(d.u8().unwrap())
1573            }
1574            v.push(w)
1575        }
1576        assert_eq!(vec![vec![1, 2, 3], vec![1, 2, 3]], v)
1577    }
1578
1579    #[test]
1580    fn object_value() {
1581        let v = gen_decoder("a2616101028103").value().ok().unwrap();
1582        let d = value::Cursor::new(&v);
1583        assert_eq!(Some(1), d.field("a").u8());
1584        assert_eq!(Some(3), d.get(Key::u64(2)).at(0).u8())
1585    }
1586
1587    #[test]
1588    fn tagged() {
1589        // by default, tags are ignored
1590        assert_eq!(Some(1363896240), decoder("c11a514b67b0").u32().ok());
1591        // but can be extracted if desired
1592        let mut d = decoder("c11a514b67b0");
1593        assert_eq!(Some(Tag::Timestamp), d.tag().ok());
1594        assert_eq!(Some(1363896240), d.u32().ok())
1595    }
1596
1597    #[test]
1598    fn tagged_value() {
1599        match gen_decoder("c11a514b67b0").value().ok() {
1600            Some(Value::Tagged(Tag::Timestamp, ref v)) if **v == Value::U32(1363896240) => (),
1601            other => panic!("impossible tagged value: {:?}", other)
1602        }
1603        match gen_decoder("c1fb41d452d9ec200000").value().ok() {
1604            Some(Value::Tagged(Tag::Timestamp, ref v)) if **v == Value::F64(1363896240.5) => (),
1605            other => panic!("impossible tagged value: {:?}", other)
1606        }
1607    }
1608
1609    fn decoder(s: &str) -> Decoder<Cursor<Vec<u8>>> {
1610        Decoder::new(Config::default(), Cursor::new(s.from_hex().unwrap()))
1611    }
1612
1613    fn gen_decoder(s: &str) -> GenericDecoder<Cursor<Vec<u8>>> {
1614        GenericDecoder::from_decoder(decoder(s))
1615    }
1616}