1use 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#[derive(Clone, Debug, PartialEq, Eq)]
114pub struct Config {
115 pub max_len_array: usize,
117 pub max_len_bytes: usize,
119 pub max_len_text: usize,
121 pub max_size_map: usize,
123 pub max_nesting: usize,
125 pub skip_tags: bool,
127 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 pub fn default() -> Config { DEFAULT_CONFIG }
152}
153
154pub type DecodeResult<A> = Result<A, DecodeError>;
157
158#[derive(Debug)]
159pub enum DecodeError {
160 DuplicateKey(Key),
162 IntOverflow(u64),
164 InvalidKey(Value),
166 InvalidTag(Value),
168 InvalidUtf8(Utf8Error),
170 IoError(io::Error),
172 TooLong { max: usize, actual: u64 },
174 TooNested,
176 UnexpectedEOF,
178 UnexpectedType { datatype: Type, info: u8 },
180 UnexpectedBreak,
183 Other(Box<Error + Send + Sync>)
185}
186
187pub 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
197pub 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
206pub 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
311macro_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
328macro_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
343macro_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
357pub type TypeInfo = (Type, u8);
360
361pub 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 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 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 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 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 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
612mod 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
630pub 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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
1072pub 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
1091pub 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
1108pub 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 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) => { 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) => { 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) => { 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) => { 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#[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 assert_eq!(Some(1363896240), decoder("c11a514b67b0").u32().ok());
1591 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}