1use byteorder::{BigEndian, ReadBytesExt};
90use slice::{ReadSlice, ReadSliceError};
91use std::collections::{BTreeMap, LinkedList};
92use std::str::{from_utf8, Utf8Error};
93use std::error::Error;
94use std::f32;
95use std::fmt;
96use std::{i8, i16, i32, i64};
97use std::io;
98use std::string;
99use skip::Skip;
100use types::{Tag, Type};
101use value::{self, Int, Bytes, Key, Simple, Text, Value};
102
103#[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::<BigEndian>()
332 .map_err(From::from)
333 .and_then(|n| {
334 if n > $to::MAX as $from_type {
335 Err(DecodeError::IntOverflow(n as u64))
336 } else {
337 Ok(-1 - n as $to_type)
338 }
339 })
340 });
341}
342
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::<BigEndian>().map_err(From::from),
412 _ => unexpected_type(ti)
413 }
414 }
415
416 pub fn u32(&mut self, ti: &TypeInfo) -> DecodeResult<u32> {
417 match *ti {
418 (Type::UInt8, n @ 0...23) => Ok(n as u32),
419 (Type::UInt8, 24) => self.reader.read_u8().map(|n| n as u32).map_err(From::from),
420 (Type::UInt16, 25) => self.reader.read_u16::<BigEndian>().map(|n| n as u32).map_err(From::from),
421 (Type::UInt32, 26) => self.reader.read_u32::<BigEndian>().map_err(From::from),
422 _ => unexpected_type(ti)
423 }
424 }
425
426 pub fn u64(&mut self, ti: &TypeInfo) -> DecodeResult<u64> {
427 match *ti {
428 (Type::UInt8, n @ 0...23) => Ok(n as u64),
429 (Type::UInt8, 24) => self.reader.read_u8().map(|n| n as u64).map_err(From::from),
430 (Type::UInt16, 25) => self.reader.read_u16::<BigEndian>().map(|n| n as u64).map_err(From::from),
431 (Type::UInt32, 26) => self.reader.read_u32::<BigEndian>().map(|n| n as u64).map_err(From::from),
432 (Type::UInt64, 27) => self.reader.read_u64::<BigEndian>().map_err(From::from),
433 _ => unexpected_type(ti)
434 }
435 }
436
437 pub fn i8(&mut self, ti: &TypeInfo) -> DecodeResult<i8> {
438 match *ti {
439 (Type::Int8, n @ 0...23) => Ok(-1 - n as i8),
440 (Type::Int8, 24) => read_signed_byte!(self, u8, i8, i8),
441 (Type::UInt8, _) => cast_unsigned!(self, u8, ti, u8, i8, i8),
442 _ => unexpected_type(ti)
443 }
444 }
445
446 pub fn i16(&mut self, ti: &TypeInfo) -> DecodeResult<i16> {
447 match *ti {
448 (Type::Int8, n @ 0...23) => Ok(-1 - n as i16),
449 (Type::Int8, 24) => read_signed_byte!(self, u8, i16, i16),
450 (Type::Int16, 25) => read_signed!(self, read_u16, u16, i16, i16),
451 (Type::UInt8, _) => cast_unsigned!(self, u8, ti, u8, i16, i16),
452 (Type::UInt16, _) => cast_unsigned!(self, u16, ti, u16, i16, i16),
453 _ => unexpected_type(ti)
454 }
455 }
456
457 pub fn i32(&mut self, ti: &TypeInfo) -> DecodeResult<i32> {
458 match *ti {
459 (Type::Int8, n @ 0...23) => Ok(-1 - n as i32),
460 (Type::Int8, 24) => read_signed_byte!(self, u8, i32, i32),
461 (Type::Int16, 25) => read_signed!(self, read_u16, u16, i32, i32),
462 (Type::Int32, 26) => read_signed!(self, read_u32, u32, i32, i32),
463 (Type::UInt8, _) => cast_unsigned!(self, u8, ti, u8, i32, i32),
464 (Type::UInt16, _) => cast_unsigned!(self, u16, ti, u16, i32, i32),
465 (Type::UInt32, _) => cast_unsigned!(self, u32, ti, u32, i32, i32),
466 _ => unexpected_type(ti)
467 }
468 }
469
470 pub fn i64(&mut self, ti: &TypeInfo) -> DecodeResult<i64> {
471 match *ti {
472 (Type::Int8, n @ 0...23) => Ok(-1 - n as i64),
473 (Type::Int8, 24) => read_signed_byte!(self, u8, i64, i64),
474 (Type::Int16, 25) => read_signed!(self, read_u16, u16, i64, i64),
475 (Type::Int32, 26) => read_signed!(self, read_u32, u32, i64, i64),
476 (Type::Int64, 27) => read_signed!(self, read_u64, u64, i64, i64),
477 (Type::UInt8, _) => cast_unsigned!(self, u8, ti, u8, i64, i64),
478 (Type::UInt16, _) => cast_unsigned!(self, u16, ti, u16, i64, i64),
479 (Type::UInt32, _) => cast_unsigned!(self, u32, ti, u32, i64, i64),
480 (Type::UInt64, _) => cast_unsigned!(self, u64, ti, u64, i64, i64),
481 _ => unexpected_type(ti)
482 }
483 }
484
485 pub fn int(&mut self, ti: &TypeInfo) -> DecodeResult<Int> {
486 match *ti {
487 (Type::Int8, a)
488 | (Type::Int16, a)
489 | (Type::Int32, a)
490 | (Type::Int64, a) =>
491 self.unsigned(a).map(Int::Neg),
492
493 (Type::UInt8, a)
494 | (Type::UInt16, a)
495 | (Type::UInt32, a)
496 | (Type::UInt64, a) =>
497 self.unsigned(a).map(Int::Pos),
498
499 _ => unexpected_type(ti)
500 }
501 }
502
503 pub fn f16(&mut self, ti: &TypeInfo) -> DecodeResult<f32> {
504 match ti.0 {
505 Type::Float16 => {
506 let half = self.reader.read_u16::<BigEndian>()?;
508 let exp = half >> 10 & 0x1F;
509 let mant = half & 0x3FF;
510 let value = match exp {
511 0 => ffi::c_ldexpf(mant as f32, -24),
512 31 => if mant == 0 { f32::INFINITY } else { f32::NAN },
513 _ => ffi::c_ldexpf(mant as f32 + 1024.0, exp as isize - 25)
514 };
515 Ok(if half & 0x8000 == 0 { value } else { - value })
516 }
517 _ => unexpected_type(ti)
518 }
519 }
520
521 pub fn f32(&mut self, ti: &TypeInfo) -> DecodeResult<f32> {
522 match ti.0 {
523 Type::Float32 => self.reader.read_f32::<BigEndian>().map_err(From::from),
524 _ => unexpected_type(ti)
525 }
526 }
527
528 pub fn f64(&mut self, ti: &TypeInfo) -> DecodeResult<f64> {
529 match ti.0 {
530 Type::Float64 => self.reader.read_f64::<BigEndian>().map_err(From::from),
531 _ => unexpected_type(ti)
532 }
533 }
534
535 pub fn unsigned(&mut self, first: u8) -> DecodeResult<u64> {
538 match first {
539 n @ 0...23 => Ok(n as u64),
540 24 => self.reader.read_u8().map(|n| n as u64).map_err(From::from),
541 25 => self.reader.read_u16::<BigEndian>().map(|n| n as u64).map_err(From::from),
542 26 => self.reader.read_u32::<BigEndian>().map(|n| n as u64).map_err(From::from),
543 27 => self.reader.read_u64::<BigEndian>().map_err(From::from),
544 _ => unexpected_type(&(Type::UInt64, first))
545 }
546 }
547
548 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 u8(&mut self) -> DecodeResult<u8> {
660 self.typeinfo().and_then(|ti| self.kernel.u8(&ti))
661 }
662
663 pub fn u16(&mut self) -> DecodeResult<u16> {
664 self.typeinfo().and_then(|ti| self.kernel.u16(&ti))
665 }
666
667 pub fn u32(&mut self) -> DecodeResult<u32> {
668 self.typeinfo().and_then(|ti| self.kernel.u32(&ti))
669 }
670
671 pub fn u64(&mut self) -> DecodeResult<u64> {
672 self.typeinfo().and_then(|ti| self.kernel.u64(&ti))
673 }
674
675 pub fn i8(&mut self) -> DecodeResult<i8> {
676 self.typeinfo().and_then(|ti| self.kernel.i8(&ti))
677 }
678
679 pub fn i16(&mut self) -> DecodeResult<i16> {
680 self.typeinfo().and_then(|ti| self.kernel.i16(&ti))
681 }
682
683 pub fn i32(&mut self) -> DecodeResult<i32> {
684 self.typeinfo().and_then(|ti| self.kernel.i32(&ti))
685 }
686
687 pub fn i64(&mut self) -> DecodeResult<i64> {
688 self.typeinfo().and_then(|ti| self.kernel.i64(&ti))
689 }
690
691 pub fn int(&mut self) -> DecodeResult<Int> {
692 self.typeinfo().and_then(|ti| self.kernel.int(&ti))
693 }
694
695 pub fn f16(&mut self) -> DecodeResult<f32> {
696 self.typeinfo().and_then(|ti| self.kernel.f16(&ti))
697 }
698
699 pub fn f32(&mut self) -> DecodeResult<f32> {
700 self.typeinfo().and_then(|ti| self.kernel.f32(&ti))
701 }
702
703 pub fn f64(&mut self) -> DecodeResult<f64> {
704 self.typeinfo().and_then(|ti| self.kernel.f64(&ti))
705 }
706
707 pub fn read_bytes(&mut self, b: &mut [u8]) -> DecodeResult<usize> {
715 match self.typeinfo()? {
716 (Type::Bytes, 31) => unexpected_type(&(Type::Bytes, 31)),
717 (Type::Bytes, i) => self.kernel.read_raw_data(i, b),
718 ti => unexpected_type(&ti)
719 }
720 }
721
722 pub fn bytes(&mut self) -> DecodeResult<Vec<u8>> {
727 match self.typeinfo()? {
728 (Type::Bytes, 31) => unexpected_type(&(Type::Bytes, 31)),
729 (Type::Bytes, i) => {
730 let max = self.config.max_len_bytes;
731 self.kernel.raw_data(i, max)
732 }
733 ti => unexpected_type(&ti)
734 }
735 }
736
737 pub fn bytes_iter(&mut self) -> DecodeResult<BytesIter<R>> {
739 match self.typeinfo()? {
740 (Type::Bytes, 31) => Ok(BytesIter { decoder: self }),
741 ti => unexpected_type(&ti)
742 }
743 }
744
745 pub fn text(&mut self) -> DecodeResult<String> {
750 match self.typeinfo()? {
751 (Type::Text, 31) => unexpected_type(&(Type::Text, 31)),
752 (Type::Text, i) => {
753 let max = self.config.max_len_text;
754 let data = self.kernel.raw_data(i, max)?;
755 String::from_utf8(data).map_err(From::from)
756 }
757 ti => unexpected_type(&ti)
758 }
759 }
760
761 pub fn text_iter(&mut self) -> DecodeResult<TextIter<R>> {
763 match self.typeinfo()? {
764 (Type::Text, 31) => Ok(TextIter { decoder: self }),
765 ti => unexpected_type(&ti)
766 }
767 }
768
769 pub fn tag(&mut self) -> DecodeResult<Tag> {
772 match self.kernel.typeinfo()? {
773 (Type::Tagged, i) => self.kernel.unsigned(i).map(Tag::of),
774 ti => unexpected_type(&ti)
775 }
776 }
777
778 pub fn array(&mut self) -> DecodeResult<usize> {
784 match self.typeinfo()? {
785 (Type::Array, 31) => unexpected_type(&(Type::Array, 31)),
786 (Type::Array, a) => {
787 let len = self.kernel.unsigned(a)?;
788 if len > self.config.max_len_array as u64 {
789 return Err(DecodeError::TooLong { max: self.config.max_len_array, actual: len })
790 }
791 Ok(len as usize)
792 }
793 ti => unexpected_type(&ti)
794 }
795 }
796
797 pub fn array_begin(&mut self) -> DecodeResult<()> {
804 match self.typeinfo()? {
805 (Type::Array, 31) => Ok(()),
806 ti => unexpected_type(&ti)
807 }
808 }
809
810 pub fn object(&mut self) -> DecodeResult<usize> {
816 match self.typeinfo()? {
817 (Type::Object, 31) => unexpected_type(&(Type::Object, 31)),
818 (Type::Object, a) => {
819 let len = self.kernel.unsigned(a)?;
820 if len > self.config.max_size_map as u64 {
821 return Err(DecodeError::TooLong { max: self.config.max_size_map, actual: len })
822 }
823 Ok(len as usize)
824 }
825 ti => unexpected_type(&ti)
826 }
827 }
828
829 pub fn object_begin(&mut self) -> DecodeResult<()> {
836 match self.typeinfo()? {
837 (Type::Object, 31) => Ok(()),
838 ti => unexpected_type(&ti)
839 }
840 }
841
842 fn typeinfo(&mut self) -> DecodeResult<TypeInfo> {
844 fn go<A: ReadBytesExt>(d: &mut Decoder<A>, level: usize) -> DecodeResult<TypeInfo> {
845 if level == 0 {
846 return Err(DecodeError::TooNested)
847 }
848 match d.kernel.typeinfo()? {
849 (Type::Tagged, i) => d.kernel.unsigned(i).and(go(d, level - 1)),
850 ti => Ok(ti)
851 }
852 }
853 let start = self.config.max_nesting;
854 go(self, start)
855 }
856}
857
858impl<R: ReadBytesExt + Skip> Decoder<R> {
859 pub fn skip(&mut self) -> DecodeResult<()> {
867 let start = self.config.max_nesting;
868 self.skip_value(start).and(Ok(()))
869 }
870
871 fn skip_value(&mut self, level: usize) -> DecodeResult<bool> {
872 if level == 0 {
873 return Err(DecodeError::TooNested)
874 }
875 match self.typeinfo()? {
876 (Type::UInt8, n) => self.kernel.unsigned(n).and(Ok(true)),
877 (Type::UInt16, n) => self.kernel.unsigned(n).and(Ok(true)),
878 (Type::UInt32, n) => self.kernel.unsigned(n).and(Ok(true)),
879 (Type::UInt64, n) => self.kernel.unsigned(n).and(Ok(true)),
880 (Type::Int8, n) => self.kernel.unsigned(n).and(Ok(true)),
881 (Type::Int16, n) => self.kernel.unsigned(n).and(Ok(true)),
882 (Type::Int32, n) => self.kernel.unsigned(n).and(Ok(true)),
883 (Type::Int64, n) => self.kernel.unsigned(n).and(Ok(true)),
884 (Type::Bool, _) => Ok(true),
885 (Type::Null, _) => Ok(true),
886 (Type::Undefined, _) => Ok(true),
887 (Type::Break, _) => Ok(false),
888 (Type::Float16, _) => {
889 self.kernel.reader.skip(2)?;
890 Ok(true)
891 }
892 (Type::Float32, _) => {
893 self.kernel.reader.skip(4)?;
894 Ok(true)
895 }
896 (Type::Float64, _) => {
897 self.kernel.reader.skip(8)?;
898 Ok(true)
899 }
900 (Type::Bytes, 31) => self.skip_until_break(Type::Bytes).and(Ok(true)),
901 (Type::Bytes, a) => {
902 let n = self.kernel.unsigned(a)?;
903 self.kernel.reader.skip(n)?;
904 Ok(true)
905 }
906 (Type::Text, 31) => self.skip_until_break(Type::Text).and(Ok(true)),
907 (Type::Text, a) => {
908 let n = self.kernel.unsigned(a)?;
909 self.kernel.reader.skip(n)?;
910 Ok(true)
911 }
912 (Type::Array, 31) => {
913 while self.skip_value(level - 1)? {}
914 Ok(true)
915 }
916 (Type::Object, 31) => {
917 while self.skip_value(level - 1)? {}
918 Ok(true)
919 }
920 (Type::Array, a) => {
921 let n = self.kernel.unsigned(a)?;
922 for _ in 0 .. n {
923 self.skip_value(level - 1)?;
924 }
925 Ok(true)
926 }
927 (Type::Object, a) => {
928 let n = self.kernel.unsigned(a)?;
929 for _ in 0 .. n {
933 self.skip_value(level - 1)?;
934 }
935 for _ in 0 .. n {
936 self.skip_value(level - 1)?;
937 }
938 Ok(true)
939 }
940 (Type::Unassigned {..}, _) => Ok(true),
941 (Type::Reserved {..}, _) => Ok(true),
942 ti@(Type::Tagged, _) => unexpected_type(&ti),
943 ti@(Type::Unknown {..}, _) => unexpected_type(&ti)
944 }
945 }
946
947 fn skip_until_break(&mut self, ty: Type) -> DecodeResult<()> {
949 loop {
950 let (t, a) = self.typeinfo()?;
951 if t == Type::Break {
952 break
953 }
954 if t != ty || a == 31 {
955 return unexpected_type(&(t, a))
956 }
957 let n = self.kernel.unsigned(a)?;
958 self.kernel.reader.skip(n)?
959 }
960 Ok(())
961 }
962}
963
964impl<R: ReadBytesExt + ReadSlice> Decoder<R> {
965 pub fn text_borrow(&mut self) -> DecodeResult<&str> {
970 match self.typeinfo()? {
971 (Type::Text, 31) => unexpected_type(&(Type::Text, 31)),
972 (Type::Text, i) => {
973 let max = self.config.max_len_text;
974 let data = self.kernel.raw_slice(i, max)?;
975 from_utf8(data).map_err(From::from)
976 }
977 ti => unexpected_type(&ti)
978 }
979 }
980
981 pub fn bytes_borrow(&mut self) -> DecodeResult<&[u8]> {
987 match self.typeinfo()? {
988 (Type::Bytes, 31) => unexpected_type(&(Type::Bytes, 31)),
989 (Type::Bytes, i) => {
990 let max = self.config.max_len_bytes;
991 self.kernel.raw_slice(i, max)
992 }
993 ti => unexpected_type(&ti)
994 }
995 }
996}
997
998pub struct BytesIter<'r, R: 'r> {
1002 decoder: &'r mut Decoder<R>
1003}
1004
1005impl<'r, R: 'r + ReadBytesExt> Iterator for BytesIter<'r, R> {
1006 type Item = DecodeResult<Vec<u8>>;
1007
1008 fn next(&mut self) -> Option<DecodeResult<Vec<u8>>> {
1009 match or_break(self.decoder.bytes()) {
1010 Ok(None) => None,
1011 Ok(Some(b)) => Some(Ok(b)),
1012 Err(e) => Some(Err(e))
1013 }
1014 }
1015}
1016
1017pub struct TextIter<'r, R: 'r> {
1019 decoder: &'r mut Decoder<R>
1020}
1021
1022impl<'r, R: 'r + ReadBytesExt> Iterator for TextIter<'r, R> {
1023 type Item = DecodeResult<String>;
1024
1025 fn next(&mut self) -> Option<DecodeResult<String>> {
1026 match or_break(self.decoder.text()) {
1027 Ok(None) => None,
1028 Ok(Some(b)) => Some(Ok(b)),
1029 Err(e) => Some(Err(e))
1030 }
1031 }
1032}
1033
1034pub struct GenericDecoder<R> {
1038 decoder: Decoder<R>
1039}
1040
1041impl<R: ReadBytesExt> GenericDecoder<R> {
1042 pub fn new(c: Config, r: R) -> GenericDecoder<R> {
1043 GenericDecoder { decoder: Decoder::new(c, r) }
1044 }
1045
1046 pub fn from_decoder(d: Decoder<R>) -> GenericDecoder<R> {
1047 GenericDecoder { decoder: d }
1048 }
1049
1050 pub fn into_inner(self) -> Decoder<R> {
1051 self.decoder
1052 }
1053
1054 pub fn borrow_mut(&mut self) -> &mut Decoder<R> {
1055 &mut self.decoder
1056 }
1057
1058 pub fn value(&mut self) -> DecodeResult<Value> {
1063 let start = self.decoder.config.max_nesting;
1064 self.decode_value(start)
1065 }
1066
1067 fn decode_value(&mut self, level: usize) -> DecodeResult<Value> {
1068 if level == 0 {
1069 return Err(DecodeError::TooNested)
1070 }
1071 match self.decoder.kernel.typeinfo()? {
1072 ti@(Type::UInt8, _) => self.decoder.kernel.u8(&ti).map(Value::U8),
1073 ti@(Type::UInt16, _) => self.decoder.kernel.u16(&ti).map(Value::U16),
1074 ti@(Type::UInt32, _) => self.decoder.kernel.u32(&ti).map(Value::U32),
1075 ti@(Type::UInt64, _) => self.decoder.kernel.u64(&ti).map(Value::U64),
1076 ti@(Type::Int8, _) =>
1077 self.decoder.kernel.i16(&ti)
1078 .map(|n| {
1079 if n > i8::MAX as i16 || n < i8::MIN as i16 {
1080 Value::I16(n)
1081 } else {
1082 Value::I8(n as i8)
1083 }
1084 }),
1085 ti@(Type::Int16, _) =>
1086 self.decoder.kernel.i32(&ti)
1087 .map(|n| {
1088 if n > i16::MAX as i32 || n < i16::MIN as i32 {
1089 Value::I32(n)
1090 } else {
1091 Value::I16(n as i16)
1092 }
1093 }),
1094 ti@(Type::Int32, _) =>
1095 self.decoder.kernel.i64(&ti)
1096 .map(|n| {
1097 if n > i32::MAX as i64 || n < i32::MIN as i64 {
1098 Value::I64(n)
1099 } else {
1100 Value::I32(n as i32)
1101 }
1102 }),
1103 (Type::Int64, a) =>
1104 self.decoder.kernel.unsigned(a)
1105 .map(|n| {
1106 if n > i64::MAX as u64 {
1107 Value::Int(Int::Neg(n))
1108 } else {
1109 Value::I64(-1 - n as i64)
1110 }
1111 }),
1112 ti@(Type::Float16, _) => self.decoder.kernel.f16(&ti).map(Value::F32),
1113 ti@(Type::Float32, _) => self.decoder.kernel.f32(&ti).map(Value::F32),
1114 ti@(Type::Float64, _) => self.decoder.kernel.f64(&ti).map(Value::F64),
1115 ti@(Type::Bool, _) => self.decoder.kernel.bool(&ti).map(Value::Bool),
1116 (Type::Null, _) => Ok(Value::Null),
1117 (Type::Undefined, _) => Ok(Value::Undefined),
1118 (Type::Break, _) => Ok(Value::Break),
1119 (Type::Bytes, 31) => { let mut i = 0u64;
1121 let mut v = LinkedList::new();
1122 loop {
1123 match self.decoder.bytes() {
1124 Ok(chunk) => {
1125 i += chunk.len() as u64;
1126 if i > self.decoder.config.max_len_bytes as u64 {
1127 return Err(DecodeError::TooLong { max: self.decoder.config.max_len_bytes, actual: i })
1128 }
1129 v.push_back(chunk)
1130 }
1131 Err(ref e) if is_break(e) => break,
1132 Err(e) => return Err(e)
1133 }
1134 }
1135 Ok(Value::Bytes(Bytes::Chunks(v)))
1136 }
1137 (Type::Bytes, a) => {
1138 let max = self.decoder.config.max_len_bytes;
1139 self.decoder.kernel.raw_data(a, max).map(|x| Value::Bytes(Bytes::Bytes(x)))
1140 }
1141 (Type::Text, 31) => { let mut i = 0u64;
1143 let mut v = LinkedList::new();
1144 loop {
1145 match self.decoder.text() {
1146 Ok(chunk) => {
1147 i += chunk.len() as u64;
1148 if i > self.decoder.config.max_len_text as u64 {
1149 return Err(DecodeError::TooLong { max: self.decoder.config.max_len_text, actual: i })
1150 }
1151 v.push_back(chunk)
1152 }
1153 Err(ref e) if is_break(e) => break,
1154 Err(e) => return Err(e)
1155 }
1156 }
1157 Ok(Value::Text(Text::Chunks(v)))
1158 }
1159 (Type::Text, a) => {
1160 let max = self.decoder.config.max_len_text;
1161 let data = self.decoder.kernel.raw_data(a, max)?;
1162 String::from_utf8(data).map(|x| Value::Text(Text::Text(x))).map_err(From::from)
1163 }
1164 (Type::Array, 31) => { let mut i = 0u64;
1166 let mut v = Vec::new();
1167 loop {
1168 i += 1;
1169 if i > self.decoder.config.max_len_array as u64 {
1170 return Err(DecodeError::TooLong { max: self.decoder.config.max_len_array, actual: i })
1171 }
1172 match self.decode_value(level - 1) {
1173 Ok(Value::Break) => break,
1174 Ok(x) => v.push(x),
1175 e => return e
1176 }
1177 }
1178 Ok(Value::Array(v))
1179 }
1180 (Type::Array, a) => {
1181 let len = self.decoder.kernel.unsigned(a)?;
1182 if len > self.decoder.config.max_len_array as u64 {
1183 return Err(DecodeError::TooLong { max: self.decoder.config.max_len_array, actual: len })
1184 }
1185 let n = len as usize;
1186 let mut v = Vec::with_capacity(n);
1187 for _ in 0 .. n {
1188 v.push(self.decode_value(level - 1)?);
1189 }
1190 Ok(Value::Array(v))
1191 }
1192 (Type::Object, 31) => { let mut i = 0u64;
1194 let mut m = BTreeMap::new();
1195 loop {
1196 i += 1;
1197 if i > self.decoder.config.max_size_map as u64 {
1198 return Err(DecodeError::TooLong { max: self.decoder.config.max_size_map, actual: i })
1199 }
1200 match self.decode_key(level - 1) {
1201 Ok(key) => {
1202 if m.contains_key(&key) {
1203 return Err(DecodeError::DuplicateKey(key))
1204 }
1205 match self.decode_value(level - 1)? {
1206 Value::Break => return Err(DecodeError::UnexpectedBreak),
1207 value => { m.insert(key, value); }
1208 }
1209 }
1210 Err(DecodeError::InvalidKey(Value::Break)) => break,
1211 Err(e) => return Err(e)
1212 }
1213 }
1214 Ok(Value::Map(m))
1215 }
1216 (Type::Object, a) => {
1217 let len = self.decoder.kernel.unsigned(a)?;
1218 if len > self.decoder.config.max_size_map as u64 {
1219 return Err(DecodeError::TooLong { max: self.decoder.config.max_size_map, actual: len })
1220 }
1221 let n = len as usize;
1222 let mut m = BTreeMap::new();
1223 for _ in 0 .. n {
1224 let key = self.decode_key(level - 1)?;
1225 if m.contains_key(&key) {
1226 return Err(DecodeError::DuplicateKey(key))
1227 }
1228 m.insert(key, self.decode_value(level - 1)?);
1229 }
1230 Ok(Value::Map(m))
1231 }
1232 (Type::Tagged, a) => {
1233 let tag = self.decoder.kernel.unsigned(a).map(Tag::of)?;
1234 if self.decoder.config.skip_tags {
1235 return self.decode_value(level - 1)
1236 }
1237 let val = self.decode_value(level - 1).map(|v| Value::Tagged(tag, Box::new(v)))?;
1238 if self.decoder.config.check_tags && !value::check(&val) {
1239 return Err(DecodeError::InvalidTag(val))
1240 }
1241 Ok(val)
1242 }
1243 (Type::Unassigned { major: 7, info: a }, _) => Ok(Value::Simple(Simple::Unassigned(a))),
1244 (Type::Reserved { major: 7, info: a }, _) => Ok(Value::Simple(Simple::Reserved(a))),
1245 ti => unexpected_type(&ti)
1246 }
1247 }
1248
1249 fn decode_key(&mut self, level: usize) -> DecodeResult<Key> {
1250 match self.decode_value(level)? {
1251 Value::Bool(x) => Ok(Key::Bool(x)),
1252 Value::Bytes(x) => Ok(Key::Bytes(x)),
1253 Value::Text(x) => Ok(Key::Text(x)),
1254 Value::I8(x) => Ok(Key::i64(x as i64)),
1255 Value::I16(x) => Ok(Key::i64(x as i64)),
1256 Value::I32(x) => Ok(Key::i64(x as i64)),
1257 Value::I64(x) => Ok(Key::i64(x)),
1258 Value::U8(x) => Ok(Key::u64(x as u64)),
1259 Value::U16(x) => Ok(Key::u64(x as u64)),
1260 Value::U32(x) => Ok(Key::u64(x as u64)),
1261 Value::U64(x) => Ok(Key::u64(x)),
1262 Value::Int(x) => Ok(Key::Int(x)),
1263 other => Err(DecodeError::InvalidKey(other))
1264 }
1265 }
1266
1267}
1268
1269#[cfg(test)]
1272mod tests {
1273 use rustc_serialize::hex::FromHex;
1274 use std::{f32, f64, u64};
1275 use std::collections::BTreeMap;
1276 use std::io::Cursor;
1277 use super::*;
1278 use types::Tag;
1279 use value::{self, Int, Key, Simple, Value};
1280
1281 #[test]
1282 fn unsigned() {
1283 assert_eq!(Some(0), decoder("00").u8().ok());
1284 assert_eq!(Some(1), decoder("01").u8().ok());
1285 assert_eq!(Some(10), decoder("0a").u8().ok());
1286 assert_eq!(Some(23), decoder("17").u8().ok());
1287 assert_eq!(Some(24), decoder("1818").u8().ok());
1288 assert_eq!(Some(25), decoder("1819").u8().ok());
1289 assert_eq!(Some(100), decoder("1864").u8().ok());
1290 assert_eq!(Some(1000), decoder("1903e8").u16().ok());
1291 assert_eq!(Some(1000000), decoder("1a000f4240").u32().ok());
1292 assert_eq!(Some(1000000000000), decoder("1b000000e8d4a51000").u64().ok());
1293 assert_eq!(Some(18446744073709551615), decoder("1bffffffffffffffff").u64().ok());
1294 }
1295
1296 #[test]
1297 fn signed() {
1298 assert_eq!(Some(-1), decoder("20").i8().ok());
1299 assert_eq!(Some(-10), decoder("29").i8().ok());
1300 assert_eq!(Some(-100), decoder("3863").i8().ok());
1301 assert_eq!(Some(-500), decoder("3901f3").i16().ok());
1302 assert_eq!(Some(-1000), decoder("3903e7").i16().ok());
1303 assert_eq!(Some(-343434), decoder("3a00053d89").i32().ok());
1304 assert_eq!(Some(-23764523654), decoder("3b000000058879da85").i64().ok())
1305 }
1306
1307 #[test]
1308 fn mixed() {
1309 assert_eq!(Some(0), decoder("00").i8().ok());
1310 assert_eq!(Some(1), decoder("01").i8().ok());
1311 assert_eq!(Some(10), decoder("0a").i8().ok());
1312 assert_eq!(Some(23), decoder("17").i8().ok());
1313 assert_eq!(Some(24), decoder("1818").i8().ok());
1314 assert_eq!(Some(25), decoder("1819").i8().ok());
1315 assert_eq!(Some(100), decoder("1864").i8().ok());
1316 assert_eq!(Some(1000), decoder("1903e8").i16().ok());
1317 assert_eq!(Some(1000000), decoder("1a000f4240").i32().ok());
1318 }
1319
1320 #[test]
1321 fn int() {
1322 assert_eq!(Some(Some(0)), decoder("00").int().ok().map(|n| n.i64()));
1323 assert_eq!(Some(Some(1)), decoder("01").int().ok().map(|n| n.i64()));
1324 assert_eq!(Some(Some(10)), decoder("0a").int().ok().map(|n| n.i64()));
1325 assert_eq!(Some(Some(23)), decoder("17").int().ok().map(|n| n.i64()));
1326 assert_eq!(Some(Some(24)), decoder("1818").int().ok().map(|n| n.i64()));
1327 assert_eq!(Some(Some(25)), decoder("1819").int().ok().map(|n| n.i64()));
1328 assert_eq!(Some(Some(100)), decoder("1864").int().ok().map(|n| n.i64()));
1329 assert_eq!(Some(Some(1000)), decoder("1903e8").int().ok().map(|n| n.i64()));
1330 assert_eq!(Some(Some(1000000)), decoder("1a000f4240").int().ok().map(|n| n.i64()));
1331 assert_eq!(Some(Some(1000000000000)), decoder("1b000000e8d4a51000").int().ok().map(|n| n.i64()));
1332 assert_eq!(Some(None), decoder("1bffffffffffffffff").int().ok().map(|n| n.i64()));
1333 assert_eq!(Some(Some(0xffffffffffffffff)), decoder("1bffffffffffffffff").int().ok().map(|n| n.u64()));
1334 assert_eq!(Some(Some(0x7fffffffffffffff)), decoder("1b7fffffffffffffff").int().ok().map(|n| n.i64()));
1335 assert_eq!(Some(Some(-9223372036854775808)), decoder("3b7fffffffffffffff").int().ok().map(|n| n.i64()));
1336 assert_eq!(Some(Int::Neg(u64::MAX)), decoder("3bffffffffffffffff").int().ok());
1337 assert_eq!(Some(Some(-1)), decoder("20").int().ok().map(|n| n.i64()));
1338 assert_eq!(Some(Some(-10)), decoder("29").int().ok().map(|n| n.i64()));
1339 assert_eq!(Some(Some(-100)), decoder("3863").int().ok().map(|n| n.i64()));
1340 assert_eq!(Some(Some(-500)), decoder("3901f3").int().ok().map(|n| n.i64()));
1341 assert_eq!(Some(Some(-1000)), decoder("3903e7").int().ok().map(|n| n.i64()));
1342 assert_eq!(Some(Some(-343434)), decoder("3a00053d89").int().ok().map(|n| n.i64()));
1343 assert_eq!(Some(Some(-23764523654)), decoder("3b000000058879da85").int().ok().map(|n| n.i64()));
1344 assert_eq!(Some(Value::Int(Int::Neg(u64::MAX))), gen_decoder("3bffffffffffffffff").value().ok())
1345 }
1346
1347 #[test]
1348 fn float() {
1349 assert_eq!(Some(0.0), decoder("f90000").f16().ok());
1350 assert_eq!(Some(-0.0), decoder("f98000").f16().ok());
1351 assert_eq!(Some(1.0), decoder("f93c00").f16().ok());
1352 assert_eq!(Some(1.5), decoder("f93e00").f16().ok());
1353 assert_eq!(Some(65504.0), decoder("f97bff").f16().ok());
1354 assert_eq!(Some(f32::INFINITY), decoder("f97c00").f16().ok());
1355 assert_eq!(Some(-f32::INFINITY), decoder("f9fc00").f16().ok());
1356 assert!(decoder("f97e00").f16().ok().unwrap().is_nan());
1357
1358 assert_eq!(Some(100000.0), decoder("fa47c35000").f32().ok());
1359 assert_eq!(Some(3.4028234663852886e+38), decoder("fa7f7fffff").f32().ok());
1360 assert_eq!(Some(-4.1), decoder("fbc010666666666666").f64().ok());
1361
1362 assert_eq!(Some(f32::INFINITY), decoder("fa7f800000").f32().ok());
1363 assert_eq!(Some(-f32::INFINITY), decoder("faff800000").f32().ok());
1364 assert!(decoder("fa7fc00000").f32().ok().unwrap().is_nan());
1365
1366 assert_eq!(Some(1.0e+300), decoder("fb7e37e43c8800759c").f64().ok());
1367 assert_eq!(Some(f64::INFINITY), decoder("fb7ff0000000000000").f64().ok());
1368 assert_eq!(Some(-f64::INFINITY), decoder("fbfff0000000000000").f64().ok());
1369 assert!(decoder("fb7ff8000000000000").f64().ok().unwrap().is_nan())
1370 }
1371
1372 #[test]
1373 fn bool() {
1374 assert_eq!(Some(false), decoder("f4").bool().ok());
1375 assert_eq!(Some(true), decoder("f5").bool().ok());
1376 }
1377
1378 #[test]
1379 fn simple() {
1380 assert_eq!(Some(Simple::Unassigned(16)), decoder("f0").simple().ok());
1381 assert_eq!(Some(Simple::Reserved(24)), decoder("f818").simple().ok());
1382 assert_eq!(Some(Simple::Unassigned(255)), decoder("f8ff").simple().ok())
1383 }
1384
1385 #[test]
1386 fn bytes() {
1387 assert_eq!(Some(vec![1,2,3,4]), decoder("4401020304").bytes().ok())
1388 }
1389
1390 #[test]
1391 fn read_bytes() {
1392 let mut buf = [0u8; 4];
1393 assert_eq!(Some(4), decoder("4401020304").read_bytes(&mut buf).ok());
1394 assert_eq!([1,2,3,4], buf)
1395 }
1396
1397 #[test]
1398 fn text() {
1399 let expected1 = String::from("dfsdfsdf\r\nsdf\r\nhello\r\nsdfsfsdfs");
1400 assert_eq!(Some(expected1), decoder("781f64667364667364660d0a7364660d0a68656c6c6f0d0a736466736673646673").text().ok());
1401
1402 let expected2 = String::from("\u{00fc}");
1403 assert_eq!(Some(expected2), decoder("62c3bc").text().ok());
1404
1405 let mut r = Vec::new();
1406 let mut d = decoder("7f657374726561646d696e67ff");
1407 for t in d.text_iter().unwrap() {
1408 r.push(t.unwrap())
1409 }
1410 assert_eq!(vec![String::from("strea"), String::from("ming")], r);
1411 }
1412
1413 #[test]
1414 fn text_borrow() {
1415 let expected1 = "dfsdfsdf\r\nsdf\r\nhello\r\nsdfsfsdfs";
1416 assert_eq!(Some(expected1), decoder("781f64667364667364660d0a7364660d0a68656c6c6f0d0a736466736673646673").text_borrow().ok());
1417 }
1418
1419 #[test]
1420 fn bytes_borrow() {
1421 let expected1 = &b"dfsdfsdf\r\nsdf\r\nhello\r\nsdfsfsdfs"[..];
1422 assert_eq!(Some(expected1), decoder("581f64667364667364660d0a7364660d0a68656c6c6f0d0a736466736673646673").bytes_borrow().ok());
1423 }
1424
1425 #[test]
1426 fn option() {
1427 let none: Option<u8> = None;
1428 let some: Option<u8> = Some(1);
1429 assert_eq!(Some(none), opt(decoder("f6").u8()).ok());
1430 assert_eq!(Some(some), opt(decoder("01").u8()).ok())
1431 }
1432
1433 #[test]
1434 fn undefined() {
1435 let undef: Option<u8> = None;
1436 let def: Option<u8> = Some(1);
1437 assert_eq!(Some(undef), maybe(decoder("f7").u8()).ok());
1438 assert_eq!(Some(def), maybe(decoder("01").u8()).ok())
1439 }
1440
1441 #[test]
1442 fn empty_arrays() {
1443 assert_eq!(Some(Value::Array(vec![])), gen_decoder("9fff").value().ok());
1444
1445 let mut d = decoder("9fff");
1446 d.array_begin().unwrap();
1447 or_break(d.u8()).unwrap();
1448 }
1449
1450 #[test]
1451 fn array() {
1452 let mut d = decoder("83010203");
1453 assert_eq!(3, d.array().unwrap());
1454 assert_eq!(Some(1u32), d.u32().ok());
1455 assert_eq!(Some(2u32), d.u32().ok());
1456 assert_eq!(Some(3u32), d.u32().ok());
1457 }
1458
1459 #[test]
1460 fn object() {
1461 let mut map = BTreeMap::new();
1462 map.insert(String::from("a"), 1u8);
1463 map.insert(String::from("b"), 2u8);
1464 map.insert(String::from("c"), 3u8);
1465 let mut d = decoder("a3616101616202616303");
1466 let mut x = BTreeMap::new();
1467 for _ in 0 .. d.object().unwrap() {
1468 x.insert(d.text().unwrap(), d.u8().unwrap());
1469 }
1470 assert_eq!(map, x);
1471 }
1472
1473 #[test]
1474 fn skip() {
1475 let mut d = decoder("a66161016162820203616382040561647f657374726561646d696e67ff61659f070405ff61666568656c6c6f");
1476 for _ in 0 .. d.object().unwrap() {
1477 match d.text().unwrap().as_ref() {
1478 "a" => { d.u8().unwrap(); }
1479 "b" => for _ in 0 .. d.array().unwrap() { d.u8().unwrap(); },
1480 "c" => d.skip().unwrap(),
1481 "d" => d.skip().unwrap(),
1482 "e" => d.skip().unwrap(),
1483 "f" => d.skip().unwrap(),
1484 key => panic!("unexpected key: {}", key)
1485 }
1486 }
1487 }
1488
1489 #[test]
1490 fn array_of_array() {
1491 let mut d = decoder("828301020383010203");
1492 let outer = d.array().unwrap();
1493 let mut v = Vec::with_capacity(outer);
1494 for _ in 0 .. outer {
1495 let inner = d.array().unwrap();
1496 let mut w = Vec::with_capacity(inner);
1497 for _ in 0 .. inner {
1498 w.push(d.u8().unwrap())
1499 }
1500 v.push(w)
1501 }
1502 assert_eq!(vec![vec![1, 2, 3], vec![1, 2, 3]], v)
1503 }
1504
1505 #[test]
1506 fn object_value() {
1507 let v = gen_decoder("a2616101028103").value().ok().unwrap();
1508 let d = value::Cursor::new(&v);
1509 assert_eq!(Some(1), d.field("a").u8());
1510 assert_eq!(Some(3), d.get(Key::u64(2)).at(0).u8())
1511 }
1512
1513 #[test]
1514 fn tagged() {
1515 assert_eq!(Some(1363896240), decoder("c11a514b67b0").u32().ok());
1517 let mut d = decoder("c11a514b67b0");
1519 assert_eq!(Some(Tag::Timestamp), d.tag().ok());
1520 assert_eq!(Some(1363896240), d.u32().ok())
1521 }
1522
1523 #[test]
1524 fn tagged_value() {
1525 match gen_decoder("c11a514b67b0").value().ok() {
1526 Some(Value::Tagged(Tag::Timestamp, ref v)) if **v == Value::U32(1363896240) => (),
1527 other => panic!("impossible tagged value: {:?}", other)
1528 }
1529 match gen_decoder("c1fb41d452d9ec200000").value().ok() {
1530 Some(Value::Tagged(Tag::Timestamp, ref v)) if **v == Value::F64(1363896240.5) => (),
1531 other => panic!("impossible tagged value: {:?}", other)
1532 }
1533 }
1534
1535 fn decoder(s: &str) -> Decoder<Cursor<Vec<u8>>> {
1536 Decoder::new(Config::default(), Cursor::new(s.from_hex().unwrap()))
1537 }
1538
1539 fn gen_decoder(s: &str) -> GenericDecoder<Cursor<Vec<u8>>> {
1540 GenericDecoder::from_decoder(decoder(s))
1541 }
1542}