1use self::JsonEvent::*;
241use self::ErrorCode::*;
242use self::ParserError::*;
243use self::DecoderError::*;
244use self::ParserState::*;
245use self::InternalStackElement::*;
246
247use std::collections::{HashMap, BTreeMap};
248use std::error::Error as StdError;
249use std::i64;
250use std::io::prelude::*;
251use std::mem::swap;
252use std::ops::Index;
253use std::str::FromStr;
254use std::string;
255use std::{char, f64, fmt, io, str};
256
257use Encodable;
258
259#[derive(Clone, PartialEq, PartialOrd, Debug)]
261pub enum Json {
262 I64(i64),
263 U64(u64),
264 F64(f64),
265 String(string::String),
266 Boolean(bool),
267 Array(self::Array),
268 Object(self::Object),
269 Null,
270}
271
272pub type Array = Vec<Json>;
273pub type Object = BTreeMap<string::String, Json>;
274
275pub struct PrettyJson<'a> { inner: &'a Json }
276
277pub struct AsJson<'a, T: 'a> { inner: &'a T }
278pub struct AsPrettyJson<'a, T: 'a> { inner: &'a T, indent: Option<u32> }
279
280#[derive(Clone, Copy, PartialEq)]
282pub enum ErrorCode {
283 InvalidSyntax,
284 InvalidNumber,
285 EOFWhileParsingObject,
286 EOFWhileParsingArray,
287 EOFWhileParsingValue,
288 EOFWhileParsingString,
289 KeyMustBeAString,
290 ExpectedColon,
291 TrailingCharacters,
292 TrailingComma,
293 InvalidEscape,
294 InvalidUnicodeCodePoint,
295 LoneLeadingSurrogateInHexEscape,
296 UnexpectedEndOfHexEscape,
297 UnrecognizedHex,
298 NotFourDigit,
299 ControlCharacterInString,
300 NotUtf8,
301}
302
303#[derive(Debug)]
304pub enum ParserError {
305 SyntaxError(ErrorCode, usize, usize),
307 IoError(io::Error),
308}
309
310impl PartialEq for ParserError {
311 fn eq(&self, other: &ParserError) -> bool {
312 match (self, other) {
313 (&SyntaxError(msg0, line0, col0), &SyntaxError(msg1, line1, col1)) =>
314 msg0 == msg1 && line0 == line1 && col0 == col1,
315 (&IoError(_), _) => false,
316 (_, &IoError(_)) => false,
317 }
318 }
319}
320
321pub type BuilderError = ParserError;
323
324#[derive(PartialEq, Debug)]
325pub enum DecoderError {
326 ParseError(ParserError),
327 ExpectedError(string::String, string::String),
328 MissingFieldError(string::String),
329 UnknownVariantError(string::String),
330 ApplicationError(string::String),
331 EOF,
332}
333
334#[derive(Copy, Debug)]
335pub enum EncoderError {
336 FmtError(fmt::Error),
337 BadHashmapKey,
338}
339
340impl PartialEq for EncoderError {
341 fn eq(&self, other: &EncoderError) -> bool {
342 match (*self, *other) {
343 (EncoderError::FmtError(_), EncoderError::FmtError(_)) => true,
344 (EncoderError::BadHashmapKey, EncoderError::BadHashmapKey) => true,
345 _ => false,
346 }
347 }
348}
349
350impl Clone for EncoderError {
351 fn clone(&self) -> Self { *self }
352}
353
354pub fn error_str(error: ErrorCode) -> &'static str {
356 match error {
357 InvalidSyntax => "invalid syntax",
358 InvalidNumber => "invalid number",
359 EOFWhileParsingObject => "EOF While parsing object",
360 EOFWhileParsingArray => "EOF While parsing array",
361 EOFWhileParsingValue => "EOF While parsing value",
362 EOFWhileParsingString => "EOF While parsing string",
363 KeyMustBeAString => "key must be a string",
364 ExpectedColon => "expected `:`",
365 TrailingCharacters => "trailing characters",
366 TrailingComma => "trailing comma",
367 InvalidEscape => "invalid escape",
368 UnrecognizedHex => "invalid \\u{ esc}ape (unrecognized hex)",
369 NotFourDigit => "invalid \\u{ esc}ape (not four digits)",
370 ControlCharacterInString => "unescaped control character in string",
371 NotUtf8 => "contents not utf-8",
372 InvalidUnicodeCodePoint => "invalid Unicode code point",
373 LoneLeadingSurrogateInHexEscape => "lone leading surrogate in hex escape",
374 UnexpectedEndOfHexEscape => "unexpected end of hex escape",
375 }
376}
377
378pub fn decode<T: ::Decodable>(s: &str) -> DecodeResult<T> {
380 let json = match Json::from_str(s) {
381 Ok(x) => x,
382 Err(e) => return Err(ParseError(e))
383 };
384
385 let mut decoder = Decoder::new(json);
386 ::Decodable::decode(&mut decoder)
387}
388
389pub fn encode<T: ::Encodable>(object: &T) -> EncodeResult<string::String> {
391 let mut s = String::new();
392 {
393 let mut encoder = Encoder::new(&mut s);
394 try!(object.encode(&mut encoder));
395 }
396 Ok(s)
397}
398
399impl fmt::Debug for ErrorCode {
400 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
401 error_str(*self).fmt(f)
402 }
403}
404
405impl StdError for DecoderError {
406 fn description(&self) -> &str { "decoder error" }
407 fn cause(&self) -> Option<&StdError> {
408 match *self {
409 DecoderError::ParseError(ref e) => Some(e),
410 _ => None,
411 }
412 }
413}
414
415impl fmt::Display for DecoderError {
416 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
417 fmt::Debug::fmt(&self, f)
418 }
419}
420
421impl From<ParserError> for DecoderError {
422 fn from(err: ParserError) -> DecoderError {
423 ParseError(From::from(err))
424 }
425}
426
427impl StdError for ParserError {
428 fn description(&self) -> &str { "failed to parse json" }
429}
430
431impl fmt::Display for ParserError {
432 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
433 fmt::Debug::fmt(&self, f)
434 }
435}
436
437impl From<io::Error> for ParserError {
438 fn from(err: io::Error) -> ParserError {
439 IoError(err)
440 }
441}
442
443impl StdError for EncoderError {
444 fn description(&self) -> &str { "encoder error" }
445}
446
447impl fmt::Display for EncoderError {
448 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
449 fmt::Debug::fmt(&self, f)
450 }
451}
452
453impl From<fmt::Error> for EncoderError {
454 fn from(err: fmt::Error) -> EncoderError { EncoderError::FmtError(err) }
455}
456
457pub type EncodeResult<T> = Result<T, EncoderError>;
458pub type DecodeResult<T> = Result<T, DecoderError>;
459
460fn escape_str(wr: &mut fmt::Write, v: &str) -> EncodeResult<()> {
461 try!(wr.write_str("\""));
462
463 let mut start = 0;
464
465 for (i, byte) in v.bytes().enumerate() {
466 let escaped = match byte {
467 b'"' => "\\\"",
468 b'\\' => "\\\\",
469 b'\x00' => "\\u0000",
470 b'\x01' => "\\u0001",
471 b'\x02' => "\\u0002",
472 b'\x03' => "\\u0003",
473 b'\x04' => "\\u0004",
474 b'\x05' => "\\u0005",
475 b'\x06' => "\\u0006",
476 b'\x07' => "\\u0007",
477 b'\x08' => "\\b",
478 b'\t' => "\\t",
479 b'\n' => "\\n",
480 b'\x0b' => "\\u000b",
481 b'\x0c' => "\\f",
482 b'\r' => "\\r",
483 b'\x0e' => "\\u000e",
484 b'\x0f' => "\\u000f",
485 b'\x10' => "\\u0010",
486 b'\x11' => "\\u0011",
487 b'\x12' => "\\u0012",
488 b'\x13' => "\\u0013",
489 b'\x14' => "\\u0014",
490 b'\x15' => "\\u0015",
491 b'\x16' => "\\u0016",
492 b'\x17' => "\\u0017",
493 b'\x18' => "\\u0018",
494 b'\x19' => "\\u0019",
495 b'\x1a' => "\\u001a",
496 b'\x1b' => "\\u001b",
497 b'\x1c' => "\\u001c",
498 b'\x1d' => "\\u001d",
499 b'\x1e' => "\\u001e",
500 b'\x1f' => "\\u001f",
501 b'\x7f' => "\\u007f",
502 _ => { continue; }
503 };
504
505 if start < i {
506 try!(wr.write_str(&v[start..i]));
507 }
508
509 try!(wr.write_str(escaped));
510
511 start = i + 1;
512 }
513
514 if start != v.len() {
515 try!(wr.write_str(&v[start..]));
516 }
517
518 try!(wr.write_str("\""));
519 Ok(())
520}
521
522fn escape_char(writer: &mut fmt::Write, v: char) -> EncodeResult<()> {
523 let mut buf = [0; 4];
524 let _ = write!(&mut &mut buf[..], "{}", v);
525 let buf = unsafe { str::from_utf8_unchecked(&buf[..v.len_utf8()]) };
526 escape_str(writer, buf)
527}
528
529fn spaces(wr: &mut fmt::Write, n: u32) -> EncodeResult<()> {
530 let mut n = n as usize;
531 const BUF: &'static str = " ";
532
533 while n >= BUF.len() {
534 try!(wr.write_str(BUF));
535 n -= BUF.len();
536 }
537
538 if n > 0 {
539 try!(wr.write_str(&BUF[..n]));
540 }
541 Ok(())
542}
543
544fn fmt_number_or_null(v: f64) -> string::String {
545 use std::num::FpCategory::{Nan, Infinite};
546
547 match v.classify() {
548 Nan | Infinite => "null".to_string(),
549 _ => {
550 let s = v.to_string();
551 if s.contains(".") {s} else {s + ".0"}
552 }
553 }
554}
555
556macro_rules! emit_enquoted_if_mapkey {
557 ($enc:ident,$e:expr) => {
558 if $enc.is_emitting_map_key {
559 try!(write!($enc.writer, "\"{}\"", $e));
560 Ok(())
561 } else {
562 try!(write!($enc.writer, "{}", $e));
563 Ok(())
564 }
565 }
566}
567
568enum EncodingFormat {
569 Compact,
570 Pretty {
571 curr_indent: u32,
572 indent: u32
573 }
574}
575
576pub struct Encoder<'a> {
578 writer: &'a mut (fmt::Write+'a),
579 format : EncodingFormat,
580 is_emitting_map_key: bool,
581}
582
583impl<'a> Encoder<'a> {
584 pub fn new_pretty(writer: &'a mut fmt::Write) -> Encoder<'a> {
587 Encoder {
588 writer: writer,
589 format: EncodingFormat::Pretty {
590 curr_indent: 0,
591 indent: 2,
592 },
593 is_emitting_map_key: false,
594 }
595 }
596
597 pub fn new(writer: &'a mut fmt::Write) -> Encoder<'a> {
600 Encoder {
601 writer: writer,
602 format: EncodingFormat::Compact,
603 is_emitting_map_key: false,
604 }
605 }
606
607 pub fn set_indent(&mut self, new_indent: u32) -> Result<(), ()> {
610 if let EncodingFormat::Pretty{ref mut curr_indent, ref mut indent} = self.format {
611 let level = curr_indent.checked_div(*indent).unwrap_or(0);
613 *indent = new_indent;
614 *curr_indent = level * *indent;
615 Ok(())
616 } else {
617 Err(())
618 }
619 }
620}
621
622impl<'a> ::Encoder for Encoder<'a> {
623 type Error = EncoderError;
624
625 fn emit_nil(&mut self) -> EncodeResult<()> {
626 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
627 try!(write!(self.writer, "null"));
628 Ok(())
629 }
630
631 fn emit_usize(&mut self, v: usize) -> EncodeResult<()> { emit_enquoted_if_mapkey!(self, v) }
632 fn emit_u64(&mut self, v: u64) -> EncodeResult<()> { emit_enquoted_if_mapkey!(self, v) }
633 fn emit_u32(&mut self, v: u32) -> EncodeResult<()> { emit_enquoted_if_mapkey!(self, v) }
634 fn emit_u16(&mut self, v: u16) -> EncodeResult<()> { emit_enquoted_if_mapkey!(self, v) }
635 fn emit_u8(&mut self, v: u8) -> EncodeResult<()> { emit_enquoted_if_mapkey!(self, v) }
636
637 fn emit_isize(&mut self, v: isize) -> EncodeResult<()> { emit_enquoted_if_mapkey!(self, v) }
638 fn emit_i64(&mut self, v: i64) -> EncodeResult<()> { emit_enquoted_if_mapkey!(self, v) }
639 fn emit_i32(&mut self, v: i32) -> EncodeResult<()> { emit_enquoted_if_mapkey!(self, v) }
640 fn emit_i16(&mut self, v: i16) -> EncodeResult<()> { emit_enquoted_if_mapkey!(self, v) }
641 fn emit_i8(&mut self, v: i8) -> EncodeResult<()> { emit_enquoted_if_mapkey!(self, v) }
642
643 fn emit_bool(&mut self, v: bool) -> EncodeResult<()> {
644 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
645 if v {
646 try!(write!(self.writer, "true"));
647 } else {
648 try!(write!(self.writer, "false"));
649 }
650 Ok(())
651 }
652
653 fn emit_f64(&mut self, v: f64) -> EncodeResult<()> {
654 emit_enquoted_if_mapkey!(self, fmt_number_or_null(v))
655 }
656 fn emit_f32(&mut self, v: f32) -> EncodeResult<()> {
657 self.emit_f64(v as f64)
658 }
659
660 fn emit_char(&mut self, v: char) -> EncodeResult<()> {
661 escape_char(self.writer, v)
662 }
663 fn emit_str(&mut self, v: &str) -> EncodeResult<()> {
664 escape_str(self.writer, v)
665 }
666
667 fn emit_enum<F>(&mut self, _name: &str, f: F) -> EncodeResult<()> where
668 F: FnOnce(&mut Encoder<'a>) -> EncodeResult<()>,
669 {
670 f(self)
671 }
672
673 fn emit_enum_variant<F>(&mut self,
674 name: &str,
675 _id: usize,
676 cnt: usize,
677 f: F)
678 -> EncodeResult<()> where
679 F: FnOnce(&mut Encoder<'a>) -> EncodeResult<()>,
680 {
681 if cnt == 0 {
685 escape_str(self.writer, name)
686 } else {
687 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
688 if let EncodingFormat::Pretty{ref mut curr_indent, indent} = self.format {
689 try!(write!(self.writer, "{{\n"));
690 *curr_indent += indent;
691 try!(spaces(self.writer, *curr_indent));
692 try!(write!(self.writer, "\"variant\": "));
693 try!(escape_str(self.writer, name));
694 try!(write!(self.writer, ",\n"));
695 try!(spaces(self.writer, *curr_indent));
696 try!(write!(self.writer, "\"fields\": [\n"));
697 *curr_indent += indent;
698 } else {
699 try!(write!(self.writer, "{{\"variant\":"));
700 try!(escape_str(self.writer, name));
701 try!(write!(self.writer, ",\"fields\":["));
702 }
703 try!(f(self));
704 if let EncodingFormat::Pretty{ref mut curr_indent, indent} = self.format {
705 *curr_indent -= indent;
706 try!(write!(self.writer, "\n"));
707 try!(spaces(self.writer, *curr_indent));
708 *curr_indent -= indent;
709 try!(write!(self.writer, "]\n"));
710 try!(spaces(self.writer, *curr_indent));
711 try!(write!(self.writer, "}}"));
712 } else {
713 try!(write!(self.writer, "]}}"));
714 }
715 Ok(())
716 }
717 }
718
719 fn emit_enum_variant_arg<F>(&mut self, idx: usize, f: F) -> EncodeResult<()> where
720 F: FnOnce(&mut Encoder<'a>) -> EncodeResult<()>,
721 {
722 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
723 if idx != 0 {
724 try!(write!(self.writer, ","));
725 if let EncodingFormat::Pretty{..} = self.format {
726 try!(write!(self.writer, "\n"));
727 }
728 }
729 if let EncodingFormat::Pretty{curr_indent, ..} = self.format {
730 try!(spaces(self.writer, curr_indent));
731 }
732 f(self)
733 }
734
735 fn emit_enum_struct_variant<F>(&mut self,
736 name: &str,
737 id: usize,
738 cnt: usize,
739 f: F) -> EncodeResult<()> where
740 F: FnOnce(&mut Encoder<'a>) -> EncodeResult<()>,
741 {
742 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
743 self.emit_enum_variant(name, id, cnt, f)
744 }
745
746 fn emit_enum_struct_variant_field<F>(&mut self,
747 _: &str,
748 idx: usize,
749 f: F) -> EncodeResult<()> where
750 F: FnOnce(&mut Encoder<'a>) -> EncodeResult<()>,
751 {
752 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
753 self.emit_enum_variant_arg(idx, f)
754 }
755
756
757 fn emit_struct<F>(&mut self, _: &str, len: usize, f: F) -> EncodeResult<()> where
758 F: FnOnce(&mut Encoder<'a>) -> EncodeResult<()>,
759 {
760 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
761 if len == 0 {
762 try!(write!(self.writer, "{{}}"));
763 } else {
764 try!(write!(self.writer, "{{"));
765 if let EncodingFormat::Pretty{ref mut curr_indent, indent} = self.format {
766 *curr_indent += indent;
767 }
768 try!(f(self));
769 if let EncodingFormat::Pretty{ref mut curr_indent, indent} = self.format {
770 *curr_indent -= indent;
771 try!(write!(self.writer, "\n"));
772 try!(spaces(self.writer, *curr_indent));
773 }
774 try!(write!(self.writer, "}}"));
775 }
776 Ok(())
777 }
778
779 fn emit_struct_field<F>(&mut self, name: &str, idx: usize, f: F) -> EncodeResult<()> where
780 F: FnOnce(&mut Encoder<'a>) -> EncodeResult<()>,
781 {
782 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
783 if idx != 0 {
784 try!(write!(self.writer, ","));
785 }
786 if let EncodingFormat::Pretty{curr_indent, ..} = self.format {
787 try!(write!(self.writer, "\n"));
788 try!(spaces(self.writer, curr_indent));
789 }
790 try!(escape_str(self.writer, name));
791 if let EncodingFormat::Pretty{..} = self.format {
792 try!(write!(self.writer, ": "));
793 } else {
794 try!(write!(self.writer, ":"));
795 }
796 f(self)
797 }
798
799 fn emit_tuple<F>(&mut self, len: usize, f: F) -> EncodeResult<()> where
800 F: FnOnce(&mut Encoder<'a>) -> EncodeResult<()>,
801 {
802 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
803 self.emit_seq(len, f)
804 }
805 fn emit_tuple_arg<F>(&mut self, idx: usize, f: F) -> EncodeResult<()> where
806 F: FnOnce(&mut Encoder<'a>) -> EncodeResult<()>,
807 {
808 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
809 self.emit_seq_elt(idx, f)
810 }
811
812 fn emit_tuple_struct<F>(&mut self, _: &str, len: usize, f: F) -> EncodeResult<()> where
813 F: FnOnce(&mut Encoder<'a>) -> EncodeResult<()>,
814 {
815 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
816 self.emit_seq(len, f)
817 }
818 fn emit_tuple_struct_arg<F>(&mut self, idx: usize, f: F) -> EncodeResult<()> where
819 F: FnOnce(&mut Encoder<'a>) -> EncodeResult<()>,
820 {
821 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
822 self.emit_seq_elt(idx, f)
823 }
824
825 fn emit_option<F>(&mut self, f: F) -> EncodeResult<()> where
826 F: FnOnce(&mut Encoder<'a>) -> EncodeResult<()>,
827 {
828 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
829 f(self)
830 }
831 fn emit_option_none(&mut self) -> EncodeResult<()> {
832 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
833 self.emit_nil()
834 }
835 fn emit_option_some<F>(&mut self, f: F) -> EncodeResult<()> where
836 F: FnOnce(&mut Encoder<'a>) -> EncodeResult<()>,
837 {
838 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
839 f(self)
840 }
841
842 fn emit_seq<F>(&mut self, len: usize, f: F) -> EncodeResult<()> where
843 F: FnOnce(&mut Encoder<'a>) -> EncodeResult<()>,
844 {
845 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
846 if len == 0 {
847 try!(write!(self.writer, "[]"));
848 } else {
849 try!(write!(self.writer, "["));
850 if let EncodingFormat::Pretty{ref mut curr_indent, indent} = self.format {
851 *curr_indent += indent;
852 }
853 try!(f(self));
854 if let EncodingFormat::Pretty{ref mut curr_indent, indent} = self.format {
855 *curr_indent -= indent;
856 try!(write!(self.writer, "\n"));
857 try!(spaces(self.writer, *curr_indent));
858 }
859 try!(write!(self.writer, "]"));
860 }
861 Ok(())
862 }
863
864 fn emit_seq_elt<F>(&mut self, idx: usize, f: F) -> EncodeResult<()> where
865 F: FnOnce(&mut Encoder<'a>) -> EncodeResult<()>,
866 {
867 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
868 if idx != 0 {
869 try!(write!(self.writer, ","));
870 }
871 if let EncodingFormat::Pretty{ref mut curr_indent, ..} = self.format {
872 try!(write!(self.writer, "\n"));
873 try!(spaces(self.writer, *curr_indent));
874 }
875 f(self)
876 }
877
878 fn emit_map<F>(&mut self, len: usize, f: F) -> EncodeResult<()> where
879 F: FnOnce(&mut Encoder<'a>) -> EncodeResult<()>,
880 {
881 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
882 if len == 0 {
883 try!(write!(self.writer, "{{}}"));
884 } else {
885 try!(write!(self.writer, "{{"));
886 if let EncodingFormat::Pretty{ref mut curr_indent, indent} = self.format {
887 *curr_indent += indent;
888 }
889 try!(f(self));
890 if let EncodingFormat::Pretty{ref mut curr_indent, indent} = self.format {
891 *curr_indent -= indent;
892 try!(write!(self.writer, "\n"));
893 try!(spaces(self.writer, *curr_indent));
894 }
895 try!(write!(self.writer, "}}"));
896 }
897 Ok(())
898 }
899
900 fn emit_map_elt_key<F>(&mut self, idx: usize, f: F) -> EncodeResult<()> where
901 F: FnOnce(&mut Encoder<'a>) -> EncodeResult<()>,
902 {
903 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
904 if idx != 0 {
905 try!(write!(self.writer, ","));
906 }
907 if let EncodingFormat::Pretty{curr_indent, ..} = self.format {
908 try!(write!(self.writer, "\n"));
909 try!(spaces(self.writer, curr_indent));
910 }
911 self.is_emitting_map_key = true;
912 try!(f(self));
913 self.is_emitting_map_key = false;
914 Ok(())
915 }
916
917 fn emit_map_elt_val<F>(&mut self, _idx: usize, f: F) -> EncodeResult<()> where
918 F: FnOnce(&mut Encoder<'a>) -> EncodeResult<()>,
919 {
920 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
921 if let EncodingFormat::Pretty{..} = self.format {
922 try!(write!(self.writer, ": "));
923 } else {
924 try!(write!(self.writer, ":"));
925 }
926 f(self)
927 }
928}
929
930impl Encodable for Json {
931 fn encode<S: ::Encoder>(&self, e: &mut S) -> Result<(), S::Error> {
932 match *self {
933 Json::I64(v) => v.encode(e),
934 Json::U64(v) => v.encode(e),
935 Json::F64(v) => v.encode(e),
936 Json::String(ref v) => v.encode(e),
937 Json::Boolean(v) => v.encode(e),
938 Json::Array(ref v) => v.encode(e),
939 Json::Object(ref v) => v.encode(e),
940 Json::Null => e.emit_nil(),
941 }
942 }
943}
944
945pub fn as_json<T: Encodable>(t: &T) -> AsJson<T> {
948 AsJson { inner: t }
949}
950
951pub fn as_pretty_json<T: Encodable>(t: &T) -> AsPrettyJson<T> {
954 AsPrettyJson { inner: t, indent: None }
955}
956
957impl Json {
958 pub fn from_reader(rdr: &mut io::Read) -> Result<Self, BuilderError> {
960 let contents = {
961 let mut c = Vec::new();
962 try!(rdr.read_to_end(&mut c));
963 c
964 };
965 let s = match str::from_utf8(&contents).ok() {
966 Some(s) => s,
967 _ => return Err(SyntaxError(NotUtf8, 0, 0))
968 };
969 let mut builder = Builder::new(s.chars());
970 builder.build()
971 }
972
973 pub fn from_str(s: &str) -> Result<Self, BuilderError> {
975 let mut builder = Builder::new(s.chars());
976 builder.build()
977 }
978
979 pub fn pretty(&self) -> PrettyJson {
982 PrettyJson { inner: self }
983 }
984
985 pub fn find<'a>(&'a self, key: &str) -> Option<&'a Json>{
988 match self {
989 &Json::Object(ref map) => map.get(key),
990 _ => None
991 }
992 }
993
994 pub fn find_path<'a>(&'a self, keys: &[&str]) -> Option<&'a Json>{
998 let mut target = self;
999 for key in keys.iter() {
1000 match target.find(*key) {
1001 Some(t) => { target = t; },
1002 None => return None
1003 }
1004 }
1005 Some(target)
1006 }
1007
1008 pub fn search<'a>(&'a self, key: &str) -> Option<&'a Json> {
1012 match self {
1013 &Json::Object(ref map) => {
1014 match map.get(key) {
1015 Some(json_value) => Some(json_value),
1016 None => {
1017 for (_, v) in map.iter() {
1018 match v.search(key) {
1019 x if x.is_some() => return x,
1020 _ => ()
1021 }
1022 }
1023 None
1024 }
1025 }
1026 },
1027 _ => None
1028 }
1029 }
1030
1031 pub fn is_object<'a>(&'a self) -> bool {
1033 self.as_object().is_some()
1034 }
1035
1036 pub fn as_object<'a>(&'a self) -> Option<&'a Object> {
1039 match self {
1040 &Json::Object(ref map) => Some(map),
1041 _ => None
1042 }
1043 }
1044
1045 pub fn as_object_mut<'a>(&'a mut self) -> Option<&'a mut Object> {
1048 match self {
1049 &mut Json::Object(ref mut map) => Some(map),
1050 _ => None
1051 }
1052 }
1053
1054 pub fn into_object(self) -> Option<Object> {
1057 match self {
1058 Json::Object(map) => Some(map),
1059 _ => None
1060 }
1061 }
1062
1063 pub fn is_array<'a>(&'a self) -> bool {
1065 self.as_array().is_some()
1066 }
1067
1068 pub fn as_array<'a>(&'a self) -> Option<&'a Array> {
1071 match self {
1072 &Json::Array(ref array) => Some(&*array),
1073 _ => None
1074 }
1075 }
1076
1077 pub fn as_array_mut<'a>(&'a mut self) -> Option<&'a mut Array> {
1080 match self {
1081 &mut Json::Array(ref mut list) => Some(list),
1082 _ => None
1083 }
1084 }
1085
1086 pub fn into_array(self) -> Option<Array> {
1089 match self {
1090 Json::Array(array) => Some(array),
1091 _ => None
1092 }
1093 }
1094
1095 pub fn is_string<'a>(&'a self) -> bool {
1097 self.as_string().is_some()
1098 }
1099
1100 pub fn as_string<'a>(&'a self) -> Option<&'a str> {
1103 match *self {
1104 Json::String(ref s) => Some(&s),
1105 _ => None
1106 }
1107 }
1108
1109 pub fn is_number(&self) -> bool {
1111 match *self {
1112 Json::I64(_) | Json::U64(_) | Json::F64(_) => true,
1113 _ => false,
1114 }
1115 }
1116
1117 pub fn is_i64(&self) -> bool {
1119 match *self {
1120 Json::I64(_) => true,
1121 _ => false,
1122 }
1123 }
1124
1125 pub fn is_u64(&self) -> bool {
1127 match *self {
1128 Json::U64(_) => true,
1129 _ => false,
1130 }
1131 }
1132
1133 pub fn is_f64(&self) -> bool {
1135 match *self {
1136 Json::F64(_) => true,
1137 _ => false,
1138 }
1139 }
1140
1141 pub fn as_i64(&self) -> Option<i64> {
1144 match *self {
1145 Json::I64(n) => Some(n),
1146 Json::U64(n) if n >= i64::MAX as u64 => None,
1147 Json::U64(n) => Some(n as i64),
1148 _ => None
1149 }
1150 }
1151
1152 pub fn as_u64(&self) -> Option<u64> {
1155 match *self {
1156 Json::I64(n) if n >= 0 => Some(n as u64),
1157 Json::U64(n) => Some(n),
1158 _ => None
1159 }
1160 }
1161
1162 pub fn as_f64(&self) -> Option<f64> {
1165 match *self {
1166 Json::I64(n) => Some(n as f64),
1167 Json::U64(n) => Some(n as f64),
1168 Json::F64(n) => Some(n),
1169 _ => None
1170 }
1171 }
1172
1173 pub fn is_boolean(&self) -> bool {
1175 self.as_boolean().is_some()
1176 }
1177
1178 pub fn as_boolean(&self) -> Option<bool> {
1181 match self {
1182 &Json::Boolean(b) => Some(b),
1183 _ => None
1184 }
1185 }
1186
1187 pub fn is_null(&self) -> bool {
1189 self.as_null().is_some()
1190 }
1191
1192 pub fn as_null(&self) -> Option<()> {
1195 match self {
1196 &Json::Null => Some(()),
1197 _ => None
1198 }
1199 }
1200}
1201
1202impl<'a> Index<&'a str> for Json {
1203 type Output = Json;
1204
1205 fn index(&self, idx: &str) -> &Json {
1206 self.find(idx).unwrap()
1207 }
1208}
1209
1210impl Index<usize> for Json {
1211 type Output = Json;
1212
1213 fn index<'a>(&'a self, idx: usize) -> &'a Json {
1214 match self {
1215 &Json::Array(ref v) => &v[idx],
1216 _ => panic!("can only index Json with usize if it is an array")
1217 }
1218 }
1219}
1220
1221#[derive(PartialEq, Debug)]
1223pub enum JsonEvent {
1224 ObjectStart,
1225 ObjectEnd,
1226 ArrayStart,
1227 ArrayEnd,
1228 BooleanValue(bool),
1229 I64Value(i64),
1230 U64Value(u64),
1231 F64Value(f64),
1232 StringValue(string::String),
1233 NullValue,
1234 Error(ParserError),
1235}
1236
1237#[derive(PartialEq, Debug)]
1238enum ParserState {
1239 ParseArray(bool),
1241 ParseArrayComma,
1243 ParseObject(bool),
1245 ParseObjectComma,
1247 ParseStart,
1249 ParseBeforeFinish,
1251 ParseFinished,
1253}
1254
1255pub struct Stack {
1259 stack: Vec<InternalStackElement>,
1260 str_buffer: Vec<u8>,
1261}
1262
1263#[derive(PartialEq, Clone, Debug)]
1267pub enum StackElement<'l> {
1268 Index(u32),
1269 Key(&'l str),
1270}
1271
1272#[derive(PartialEq, Clone, Debug)]
1275enum InternalStackElement {
1276 InternalIndex(u32),
1277 InternalKey(u16, u16), }
1279
1280impl Stack {
1281 pub fn new() -> Stack {
1282 Stack { stack: Vec::new(), str_buffer: Vec::new() }
1283 }
1284
1285 pub fn len(&self) -> usize { self.stack.len() }
1287
1288 pub fn is_empty(&self) -> bool { self.stack.is_empty() }
1290
1291 pub fn get<'l>(&'l self, idx: usize) -> StackElement<'l> {
1295 match self.stack[idx] {
1296 InternalIndex(i) => StackElement::Index(i),
1297 InternalKey(start, size) => {
1298 StackElement::Key(str::from_utf8(
1299 &self.str_buffer[start as usize .. start as usize + size as usize]).unwrap())
1300 }
1301 }
1302 }
1303
1304 pub fn is_equal_to(&self, rhs: &[StackElement]) -> bool {
1306 if self.stack.len() != rhs.len() { return false; }
1307 for i in 0..rhs.len() {
1308 if self.get(i) != rhs[i] { return false; }
1309 }
1310 return true;
1311 }
1312
1313 pub fn starts_with(&self, rhs: &[StackElement]) -> bool {
1316 if self.stack.len() < rhs.len() { return false; }
1317 for i in 0..rhs.len() {
1318 if self.get(i) != rhs[i] { return false; }
1319 }
1320 return true;
1321 }
1322
1323 pub fn ends_with(&self, rhs: &[StackElement]) -> bool {
1326 if self.stack.len() < rhs.len() { return false; }
1327 let offset = self.stack.len() - rhs.len();
1328 for i in 0..rhs.len() {
1329 if self.get(i + offset) != rhs[i] { return false; }
1330 }
1331 return true;
1332 }
1333
1334 pub fn top<'l>(&'l self) -> Option<StackElement<'l>> {
1336 return match self.stack.last() {
1337 None => None,
1338 Some(&InternalIndex(i)) => Some(StackElement::Index(i)),
1339 Some(&InternalKey(start, size)) => {
1340 Some(StackElement::Key(str::from_utf8(
1341 &self.str_buffer[start as usize .. (start+size) as usize]
1342 ).unwrap()))
1343 }
1344 }
1345 }
1346
1347 fn push_key(&mut self, key: string::String) {
1349 self.stack.push(InternalKey(self.str_buffer.len() as u16, key.len() as u16));
1350 for c in key.as_bytes().iter() {
1351 self.str_buffer.push(*c);
1352 }
1353 }
1354
1355 fn push_index(&mut self, index: u32) {
1357 self.stack.push(InternalIndex(index));
1358 }
1359
1360 fn pop(&mut self) {
1362 assert!(!self.is_empty());
1363 match *self.stack.last().unwrap() {
1364 InternalKey(_, sz) => {
1365 let new_size = self.str_buffer.len() - sz as usize;
1366 self.str_buffer.truncate(new_size);
1367 }
1368 InternalIndex(_) => {}
1369 }
1370 self.stack.pop();
1371 }
1372
1373 fn last_is_index(&self) -> bool {
1375 if self.is_empty() { return false; }
1376 return match *self.stack.last().unwrap() {
1377 InternalIndex(_) => true,
1378 _ => false,
1379 }
1380 }
1381
1382 fn bump_index(&mut self) {
1384 let len = self.stack.len();
1385 let idx = match *self.stack.last().unwrap() {
1386 InternalIndex(i) => { i + 1 }
1387 _ => { panic!(); }
1388 };
1389 self.stack[len - 1] = InternalIndex(idx);
1390 }
1391}
1392
1393pub struct Parser<T> {
1396 rdr: T,
1397 ch: Option<char>,
1398 line: usize,
1399 col: usize,
1400 stack: Stack,
1403 state: ParserState,
1405}
1406
1407impl<T: Iterator<Item = char>> Iterator for Parser<T> {
1408 type Item = JsonEvent;
1409
1410 fn next(&mut self) -> Option<JsonEvent> {
1411 if self.state == ParseFinished {
1412 return None;
1413 }
1414
1415 if self.state == ParseBeforeFinish {
1416 self.parse_whitespace();
1417 if self.eof() {
1419 self.state = ParseFinished;
1420 return None;
1421 } else {
1422 return Some(self.error_event(TrailingCharacters));
1423 }
1424 }
1425
1426 return Some(self.parse());
1427 }
1428}
1429
1430impl<T: Iterator<Item = char>> Parser<T> {
1431 pub fn new(rdr: T) -> Parser<T> {
1433 let mut p = Parser {
1434 rdr: rdr,
1435 ch: Some('\x00'),
1436 line: 1,
1437 col: 0,
1438 stack: Stack::new(),
1439 state: ParseStart,
1440 };
1441 p.bump();
1442 return p;
1443 }
1444
1445 pub fn stack<'l>(&'l self) -> &'l Stack {
1448 return &self.stack;
1449 }
1450
1451 fn eof(&self) -> bool { self.ch.is_none() }
1452 fn ch_or_null(&self) -> char { self.ch.unwrap_or('\x00') }
1453 fn bump(&mut self) {
1454 self.ch = self.rdr.next();
1455
1456 if self.ch_is('\n') {
1457 self.line += 1;
1458 self.col = 1;
1459 } else {
1460 self.col += 1;
1461 }
1462 }
1463
1464 fn next_char(&mut self) -> Option<char> {
1465 self.bump();
1466 self.ch
1467 }
1468 fn ch_is(&self, c: char) -> bool {
1469 self.ch == Some(c)
1470 }
1471
1472 fn error<E>(&self, reason: ErrorCode) -> Result<E, ParserError> {
1473 Err(SyntaxError(reason, self.line, self.col))
1474 }
1475
1476 fn parse_whitespace(&mut self) {
1477 while self.ch_is(' ') ||
1478 self.ch_is('\n') ||
1479 self.ch_is('\t') ||
1480 self.ch_is('\r') { self.bump(); }
1481 }
1482
1483 fn parse_number(&mut self) -> JsonEvent {
1484 let mut neg = false;
1485
1486 if self.ch_is('-') {
1487 self.bump();
1488 neg = true;
1489 }
1490
1491 let res = match self.parse_u64() {
1492 Ok(res) => res,
1493 Err(e) => { return Error(e); }
1494 };
1495
1496 if self.ch_is('.') || self.ch_is('e') || self.ch_is('E') {
1497 let mut res = res as f64;
1498
1499 if self.ch_is('.') {
1500 res = match self.parse_decimal(res) {
1501 Ok(res) => res,
1502 Err(e) => { return Error(e); }
1503 };
1504 }
1505
1506 if self.ch_is('e') || self.ch_is('E') {
1507 res = match self.parse_exponent(res) {
1508 Ok(res) => res,
1509 Err(e) => { return Error(e); }
1510 };
1511 }
1512
1513 if neg {
1514 res *= -1.0;
1515 }
1516
1517 F64Value(res)
1518 } else {
1519 if neg {
1520 if res > (i64::MAX as u64) + 1 {
1522 Error(SyntaxError(InvalidNumber, self.line, self.col))
1523 } else if res == 0 {
1524 I64Value(res as i64)
1525 } else {
1526 I64Value((!res + 1) as i64)
1527 }
1528 } else {
1529 U64Value(res)
1530 }
1531 }
1532 }
1533
1534 fn parse_u64(&mut self) -> Result<u64, ParserError> {
1535 let mut accum: u64 = 0;
1536
1537 match self.ch_or_null() {
1538 '0' => {
1539 self.bump();
1540
1541 match self.ch_or_null() {
1543 '0' ... '9' => return self.error(InvalidNumber),
1544 _ => ()
1545 }
1546 },
1547 '1' ... '9' => {
1548 while !self.eof() {
1549 match self.ch_or_null() {
1550 c @ '0' ... '9' => {
1551 macro_rules! try_or_invalid {
1552 ($e: expr) => {
1553 match $e {
1554 Some(v) => v,
1555 None => return self.error(InvalidNumber)
1556 }
1557 }
1558 }
1559 accum = try_or_invalid!(accum.checked_mul(10));
1560 accum = try_or_invalid!(accum.checked_add((c as u64) - ('0' as u64)));
1561
1562 self.bump();
1563 }
1564 _ => break,
1565 }
1566 }
1567 }
1568 _ => return self.error(InvalidNumber),
1569 }
1570
1571 Ok(accum)
1572 }
1573
1574 fn parse_decimal(&mut self, mut res: f64) -> Result<f64, ParserError> {
1575 self.bump();
1576
1577 match self.ch_or_null() {
1579 '0' ... '9' => (),
1580 _ => return self.error(InvalidNumber)
1581 }
1582
1583 let mut dec = 1.0;
1584 let mut frac = 0.0;
1585 while !self.eof() {
1586 match self.ch_or_null() {
1587 c @ '0' ... '9' => {
1588 dec /= 10.0;
1589 frac += (((c as isize) - ('0' as isize)) as f64) * dec;
1590 self.bump();
1591 }
1592 _ => break,
1593 }
1594 }
1595
1596 res += frac;
1597
1598 Ok(res)
1599 }
1600
1601 fn parse_exponent(&mut self, mut res: f64) -> Result<f64, ParserError> {
1602 self.bump();
1603
1604 let mut exp = 0;
1605 let mut neg_exp = false;
1606
1607 if self.ch_is('+') {
1608 self.bump();
1609 } else if self.ch_is('-') {
1610 self.bump();
1611 neg_exp = true;
1612 }
1613
1614 match self.ch_or_null() {
1616 '0' ... '9' => (),
1617 _ => return self.error(InvalidNumber)
1618 }
1619 while !self.eof() {
1620 match self.ch_or_null() {
1621 c @ '0' ... '9' => {
1622 exp *= 10;
1623 exp += (c as usize) - ('0' as usize);
1624
1625 self.bump();
1626 }
1627 _ => break
1628 }
1629 }
1630
1631 let exp = 10_f64.powi(exp as i32);
1632 if neg_exp {
1633 res /= exp;
1634 } else {
1635 res *= exp;
1636 }
1637
1638 Ok(res)
1639 }
1640
1641 fn decode_hex_escape(&mut self) -> Result<u16, ParserError> {
1642 let mut i = 0;
1643 let mut n = 0;
1644 while i < 4 {
1645 self.bump();
1646 n = match self.ch_or_null() {
1647 c @ '0' ... '9' => n * 16 + ((c as u16) - ('0' as u16)),
1648 c @ 'a' ... 'f' => n * 16 + (10 + (c as u16) - ('a' as u16)),
1649 c @ 'A' ... 'F' => n * 16 + (10 + (c as u16) - ('A' as u16)),
1650 _ => return self.error(InvalidEscape)
1651 };
1652
1653 i += 1;
1654 }
1655
1656 Ok(n)
1657 }
1658
1659 fn parse_str(&mut self) -> Result<string::String, ParserError> {
1660 let mut escape = false;
1661 let mut res = string::String::new();
1662
1663 loop {
1664 self.bump();
1665 if self.eof() {
1666 return self.error(EOFWhileParsingString);
1667 }
1668
1669 if escape {
1670 match self.ch_or_null() {
1671 '"' => res.push('"'),
1672 '\\' => res.push('\\'),
1673 '/' => res.push('/'),
1674 'b' => res.push('\x08'),
1675 'f' => res.push('\x0c'),
1676 'n' => res.push('\n'),
1677 'r' => res.push('\r'),
1678 't' => res.push('\t'),
1679 'u' => match try!(self.decode_hex_escape()) {
1680 0xDC00 ... 0xDFFF => {
1681 return self.error(LoneLeadingSurrogateInHexEscape)
1682 }
1683
1684 n1 @ 0xD800 ... 0xDBFF => {
1687 match (self.next_char(), self.next_char()) {
1688 (Some('\\'), Some('u')) => (),
1689 _ => return self.error(UnexpectedEndOfHexEscape),
1690 }
1691
1692 let n2 = try!(self.decode_hex_escape());
1693 if n2 < 0xDC00 || n2 > 0xDFFF {
1694 return self.error(LoneLeadingSurrogateInHexEscape)
1695 }
1696 let c = (((n1 - 0xD800) as u32) << 10 |
1697 (n2 - 0xDC00) as u32) + 0x1_0000;
1698 res.push(char::from_u32(c).unwrap());
1699 }
1700
1701 n => match char::from_u32(n as u32) {
1702 Some(c) => res.push(c),
1703 None => return self.error(InvalidUnicodeCodePoint),
1704 },
1705 },
1706 _ => return self.error(InvalidEscape),
1707 }
1708 escape = false;
1709 } else if self.ch_is('\\') {
1710 escape = true;
1711 } else {
1712 match self.ch {
1713 Some('"') => {
1714 self.bump();
1715 return Ok(res);
1716 },
1717 Some(c) if c <= '\u{1F}' =>
1718 return self.error(ControlCharacterInString),
1719 Some(c) => res.push(c),
1720 None => unreachable!()
1721 }
1722 }
1723 }
1724 }
1725
1726 fn parse(&mut self) -> JsonEvent {
1733 loop {
1734 self.parse_whitespace();
1741
1742 match self.state {
1743 ParseStart => {
1744 return self.parse_start();
1745 }
1746 ParseArray(first) => {
1747 return self.parse_array(first);
1748 }
1749 ParseArrayComma => {
1750 match self.parse_array_comma_or_end() {
1751 Some(evt) => { return evt; }
1752 None => {}
1753 }
1754 }
1755 ParseObject(first) => {
1756 return self.parse_object(first);
1757 }
1758 ParseObjectComma => {
1759 self.stack.pop();
1760 if self.ch_is(',') {
1761 self.state = ParseObject(false);
1762 self.bump();
1763 } else {
1764 return self.parse_object_end();
1765 }
1766 }
1767 _ => {
1768 return self.error_event(InvalidSyntax);
1769 }
1770 }
1771 }
1772 }
1773
1774 fn parse_start(&mut self) -> JsonEvent {
1775 let val = self.parse_value();
1776 self.state = match val {
1777 Error(_) => ParseFinished,
1778 ArrayStart => ParseArray(true),
1779 ObjectStart => ParseObject(true),
1780 _ => ParseBeforeFinish,
1781 };
1782 return val;
1783 }
1784
1785 fn parse_array(&mut self, first: bool) -> JsonEvent {
1786 if self.ch_is(']') {
1787 if !first {
1788 self.error_event(InvalidSyntax)
1789 } else {
1790 self.state = if self.stack.is_empty() {
1791 ParseBeforeFinish
1792 } else if self.stack.last_is_index() {
1793 ParseArrayComma
1794 } else {
1795 ParseObjectComma
1796 };
1797 self.bump();
1798 ArrayEnd
1799 }
1800 } else {
1801 if first {
1802 self.stack.push_index(0);
1803 }
1804 let val = self.parse_value();
1805 self.state = match val {
1806 Error(_) => ParseFinished,
1807 ArrayStart => ParseArray(true),
1808 ObjectStart => ParseObject(true),
1809 _ => ParseArrayComma,
1810 };
1811 val
1812 }
1813 }
1814
1815 fn parse_array_comma_or_end(&mut self) -> Option<JsonEvent> {
1816 if self.ch_is(',') {
1817 self.stack.bump_index();
1818 self.state = ParseArray(false);
1819 self.bump();
1820 None
1821 } else if self.ch_is(']') {
1822 self.stack.pop();
1823 self.state = if self.stack.is_empty() {
1824 ParseBeforeFinish
1825 } else if self.stack.last_is_index() {
1826 ParseArrayComma
1827 } else {
1828 ParseObjectComma
1829 };
1830 self.bump();
1831 Some(ArrayEnd)
1832 } else if self.eof() {
1833 Some(self.error_event(EOFWhileParsingArray))
1834 } else {
1835 Some(self.error_event(InvalidSyntax))
1836 }
1837 }
1838
1839 fn parse_object(&mut self, first: bool) -> JsonEvent {
1840 if self.ch_is('}') {
1841 if !first {
1842 if self.stack.is_empty() {
1843 return self.error_event(TrailingComma);
1844 } else {
1845 self.stack.pop();
1846 }
1847 }
1848 self.state = if self.stack.is_empty() {
1849 ParseBeforeFinish
1850 } else if self.stack.last_is_index() {
1851 ParseArrayComma
1852 } else {
1853 ParseObjectComma
1854 };
1855 self.bump();
1856 return ObjectEnd;
1857 }
1858 if self.eof() {
1859 return self.error_event(EOFWhileParsingObject);
1860 }
1861 if !self.ch_is('"') {
1862 return self.error_event(KeyMustBeAString);
1863 }
1864 let s = match self.parse_str() {
1865 Ok(s) => s,
1866 Err(e) => {
1867 self.state = ParseFinished;
1868 return Error(e);
1869 }
1870 };
1871 self.parse_whitespace();
1872 if self.eof() {
1873 return self.error_event(EOFWhileParsingObject);
1874 } else if self.ch_or_null() != ':' {
1875 return self.error_event(ExpectedColon);
1876 }
1877 self.stack.push_key(s);
1878 self.bump();
1879 self.parse_whitespace();
1880
1881 let val = self.parse_value();
1882
1883 self.state = match val {
1884 Error(_) => ParseFinished,
1885 ArrayStart => ParseArray(true),
1886 ObjectStart => ParseObject(true),
1887 _ => ParseObjectComma,
1888 };
1889 return val;
1890 }
1891
1892 fn parse_object_end(&mut self) -> JsonEvent {
1893 if self.ch_is('}') {
1894 self.state = if self.stack.is_empty() {
1895 ParseBeforeFinish
1896 } else if self.stack.last_is_index() {
1897 ParseArrayComma
1898 } else {
1899 ParseObjectComma
1900 };
1901 self.bump();
1902 ObjectEnd
1903 } else if self.eof() {
1904 self.error_event(EOFWhileParsingObject)
1905 } else {
1906 self.error_event(InvalidSyntax)
1907 }
1908 }
1909
1910 fn parse_value(&mut self) -> JsonEvent {
1911 if self.eof() { return self.error_event(EOFWhileParsingValue); }
1912 match self.ch_or_null() {
1913 'n' => { self.parse_ident("ull", NullValue) }
1914 't' => { self.parse_ident("rue", BooleanValue(true)) }
1915 'f' => { self.parse_ident("alse", BooleanValue(false)) }
1916 '0' ... '9' | '-' => self.parse_number(),
1917 '"' => match self.parse_str() {
1918 Ok(s) => StringValue(s),
1919 Err(e) => Error(e),
1920 },
1921 '[' => {
1922 self.bump();
1923 ArrayStart
1924 }
1925 '{' => {
1926 self.bump();
1927 ObjectStart
1928 }
1929 _ => { self.error_event(InvalidSyntax) }
1930 }
1931 }
1932
1933 fn parse_ident(&mut self, ident: &str, value: JsonEvent) -> JsonEvent {
1934 if ident.chars().all(|c| Some(c) == self.next_char()) {
1935 self.bump();
1936 value
1937 } else {
1938 Error(SyntaxError(InvalidSyntax, self.line, self.col))
1939 }
1940 }
1941
1942 fn error_event(&mut self, reason: ErrorCode) -> JsonEvent {
1943 self.state = ParseFinished;
1944 Error(SyntaxError(reason, self.line, self.col))
1945 }
1946}
1947
1948pub struct Builder<T> {
1950 parser: Parser<T>,
1951 token: Option<JsonEvent>,
1952}
1953
1954impl<T: Iterator<Item = char>> Builder<T> {
1955 pub fn new(src: T) -> Builder<T> {
1957 Builder { parser: Parser::new(src), token: None, }
1958 }
1959
1960 pub fn build(&mut self) -> Result<Json, BuilderError> {
1962 self.bump();
1963 let result = self.build_value();
1964 self.bump();
1965 match self.token.take() {
1966 None => {}
1967 Some(Error(e)) => { return Err(e); }
1968 _ => { return Err(SyntaxError(InvalidSyntax, self.parser.line, self.parser.col)); }
1969 }
1970 result
1971 }
1972
1973 fn bump(&mut self) {
1974 self.token = self.parser.next();
1975 }
1976
1977 fn build_value(&mut self) -> Result<Json, BuilderError> {
1978 return match self.token.take() {
1979 Some(NullValue) => Ok(Json::Null),
1980 Some(I64Value(n)) => Ok(Json::I64(n)),
1981 Some(U64Value(n)) => Ok(Json::U64(n)),
1982 Some(F64Value(n)) => Ok(Json::F64(n)),
1983 Some(BooleanValue(b)) => Ok(Json::Boolean(b)),
1984 Some(StringValue(ref mut s)) => {
1985 let mut temp = string::String::new();
1986 swap(s, &mut temp);
1987 Ok(Json::String(temp))
1988 }
1989 Some(Error(e)) => Err(e),
1990 Some(ArrayStart) => self.build_array(),
1991 Some(ObjectStart) => self.build_object(),
1992 Some(ObjectEnd) => self.parser.error(InvalidSyntax),
1993 Some(ArrayEnd) => self.parser.error(InvalidSyntax),
1994 None => self.parser.error(EOFWhileParsingValue),
1995 }
1996 }
1997
1998 fn build_array(&mut self) -> Result<Json, BuilderError> {
1999 self.bump();
2000 let mut values = Vec::new();
2001
2002 loop {
2003 if let Some(ArrayEnd) = self.token {
2004 return Ok(Json::Array(values.into_iter().collect()));
2005 }
2006 match self.build_value() {
2007 Ok(v) => values.push(v),
2008 Err(e) => { return Err(e) }
2009 }
2010 self.bump();
2011 }
2012 }
2013
2014 fn build_object(&mut self) -> Result<Json, BuilderError> {
2015 self.bump();
2016
2017 let mut values = BTreeMap::new();
2018
2019 loop {
2020 match self.token.take() {
2021 Some(ObjectEnd) => { return Ok(Json::Object(values)); }
2022 Some(Error(e)) => { return Err(e); }
2023 None => { break; }
2024 token => { self.token = token; }
2025 }
2026 let key = match self.parser.stack().top() {
2027 Some(StackElement::Key(k)) => { k.to_string() }
2028 _ => { panic!("invalid state"); }
2029 };
2030 match self.build_value() {
2031 Ok(value) => { values.insert(key, value); }
2032 Err(e) => { return Err(e); }
2033 }
2034 self.bump();
2035 }
2036 return self.parser.error(EOFWhileParsingObject);
2037 }
2038}
2039
2040pub struct Decoder {
2042 stack: Vec<Json>,
2043}
2044
2045impl Decoder {
2046 pub fn new(json: Json) -> Decoder {
2048 Decoder { stack: vec![json] }
2049 }
2050}
2051
2052impl Decoder {
2053 fn pop(&mut self) -> DecodeResult<Json> {
2054 match self.stack.pop() {
2055 Some(s) => Ok(s),
2056 None => Err(EOF),
2057 }
2058 }
2059}
2060
2061macro_rules! expect {
2062 ($e:expr, Null) => ({
2063 match try!($e) {
2064 Json::Null => Ok(()),
2065 other => Err(ExpectedError("Null".to_string(),
2066 format!("{}", other)))
2067 }
2068 });
2069 ($e:expr, $t:ident) => ({
2070 match try!($e) {
2071 Json::$t(v) => Ok(v),
2072 other => {
2073 Err(ExpectedError(stringify!($t).to_string(),
2074 format!("{}", other)))
2075 }
2076 }
2077 })
2078}
2079
2080macro_rules! read_primitive {
2081 ($name:ident, $ty:ident) => {
2082 #[allow(unused_comparisons)]
2083 fn $name(&mut self) -> DecodeResult<$ty> {
2084 match try!(self.pop()) {
2085 Json::I64(i) => {
2086 let other = i as $ty;
2087 if i == other as i64 && (other > 0) == (i > 0) {
2088 Ok(other)
2089 } else {
2090 Err(ExpectedError("Number".to_string(), i.to_string()))
2091 }
2092 }
2093 Json::U64(u) => {
2094 let other = u as $ty;
2095 if u == other as u64 && other >= 0 {
2096 Ok(other)
2097 } else {
2098 Err(ExpectedError("Number".to_string(), u.to_string()))
2099 }
2100 }
2101 Json::F64(f) => {
2102 Err(ExpectedError("Integer".to_string(), f.to_string()))
2103 }
2104 Json::String(s) => match s.parse() {
2107 Ok(f) => Ok(f),
2108 Err(_) => Err(ExpectedError("Number".to_string(), s)),
2109 },
2110 value => {
2111 Err(ExpectedError("Number".to_string(), value.to_string()))
2112 }
2113 }
2114 }
2115 }
2116}
2117
2118impl ::Decoder for Decoder {
2119 type Error = DecoderError;
2120
2121 fn read_nil(&mut self) -> DecodeResult<()> {
2122 expect!(self.pop(), Null)
2123 }
2124
2125 read_primitive! { read_usize, usize }
2126 read_primitive! { read_u8, u8 }
2127 read_primitive! { read_u16, u16 }
2128 read_primitive! { read_u32, u32 }
2129 read_primitive! { read_u64, u64 }
2130 read_primitive! { read_isize, isize }
2131 read_primitive! { read_i8, i8 }
2132 read_primitive! { read_i16, i16 }
2133 read_primitive! { read_i32, i32 }
2134 read_primitive! { read_i64, i64 }
2135
2136 fn read_f32(&mut self) -> DecodeResult<f32> {
2137 self.read_f64().map(|x| x as f32)
2138 }
2139
2140 fn read_f64(&mut self) -> DecodeResult<f64> {
2141 match try!(self.pop()) {
2142 Json::I64(f) => Ok(f as f64),
2143 Json::U64(f) => Ok(f as f64),
2144 Json::F64(f) => Ok(f),
2145 Json::String(s) => {
2146 match s.parse() {
2149 Ok(f) => Ok(f),
2150 Err(_) => Err(ExpectedError("Number".to_string(), s)),
2151 }
2152 },
2153 Json::Null => Ok(f64::NAN),
2154 value => Err(ExpectedError("Number".to_string(), format!("{}", value)))
2155 }
2156 }
2157
2158 fn read_bool(&mut self) -> DecodeResult<bool> {
2159 expect!(self.pop(), Boolean)
2160 }
2161
2162 fn read_char(&mut self) -> DecodeResult<char> {
2163 let s = try!(self.read_str());
2164 {
2165 let mut it = s.chars();
2166 match (it.next(), it.next()) {
2167 (Some(c), None) => return Ok(c),
2169 _ => ()
2170 }
2171 }
2172 Err(ExpectedError("single character string".to_string(), format!("{}", s)))
2173 }
2174
2175 fn read_str(&mut self) -> DecodeResult<string::String> {
2176 expect!(self.pop(), String)
2177 }
2178
2179 fn read_enum<T, F>(&mut self, _name: &str, f: F) -> DecodeResult<T> where
2180 F: FnOnce(&mut Decoder) -> DecodeResult<T>,
2181 {
2182 f(self)
2183 }
2184
2185 fn read_enum_variant<T, F>(&mut self, names: &[&str],
2186 mut f: F) -> DecodeResult<T>
2187 where F: FnMut(&mut Decoder, usize) -> DecodeResult<T>,
2188 {
2189 let name = match try!(self.pop()) {
2190 Json::String(s) => s,
2191 Json::Object(mut o) => {
2192 let n = match o.remove(&"variant".to_string()) {
2193 Some(Json::String(s)) => s,
2194 Some(val) => {
2195 return Err(ExpectedError("String".to_string(), format!("{}", val)))
2196 }
2197 None => {
2198 return Err(MissingFieldError("variant".to_string()))
2199 }
2200 };
2201 match o.remove(&"fields".to_string()) {
2202 Some(Json::Array(l)) => {
2203 for field in l.into_iter().rev() {
2204 self.stack.push(field);
2205 }
2206 },
2207 Some(val) => {
2208 return Err(ExpectedError("Array".to_string(), format!("{}", val)))
2209 }
2210 None => {
2211 return Err(MissingFieldError("fields".to_string()))
2212 }
2213 }
2214 n
2215 }
2216 json => {
2217 return Err(ExpectedError("String or Object".to_string(), format!("{}", json)))
2218 }
2219 };
2220 let idx = match names.iter().position(|n| *n == name) {
2221 Some(idx) => idx,
2222 None => return Err(UnknownVariantError(name))
2223 };
2224 f(self, idx)
2225 }
2226
2227 fn read_enum_variant_arg<T, F>(&mut self, _idx: usize, f: F) -> DecodeResult<T> where
2228 F: FnOnce(&mut Decoder) -> DecodeResult<T>,
2229 {
2230 f(self)
2231 }
2232
2233 fn read_enum_struct_variant<T, F>(&mut self, names: &[&str], f: F) -> DecodeResult<T> where
2234 F: FnMut(&mut Decoder, usize) -> DecodeResult<T>,
2235 {
2236 self.read_enum_variant(names, f)
2237 }
2238
2239
2240 fn read_enum_struct_variant_field<T, F>(&mut self,
2241 _name: &str,
2242 idx: usize,
2243 f: F)
2244 -> DecodeResult<T> where
2245 F: FnOnce(&mut Decoder) -> DecodeResult<T>,
2246 {
2247 self.read_enum_variant_arg(idx, f)
2248 }
2249
2250 fn read_struct<T, F>(&mut self, _name: &str, _len: usize, f: F) -> DecodeResult<T> where
2251 F: FnOnce(&mut Decoder) -> DecodeResult<T>,
2252 {
2253 let value = try!(f(self));
2254 try!(self.pop());
2255 Ok(value)
2256 }
2257
2258 fn read_struct_field<T, F>(&mut self,
2259 name: &str,
2260 _idx: usize,
2261 f: F)
2262 -> DecodeResult<T> where
2263 F: FnOnce(&mut Decoder) -> DecodeResult<T>,
2264 {
2265 let mut obj = try!(expect!(self.pop(), Object));
2266
2267 let value = match obj.remove(&name.to_string()) {
2268 None => {
2269 self.stack.push(Json::Null);
2272 match f(self) {
2273 Ok(x) => x,
2274 Err(_) => return Err(MissingFieldError(name.to_string())),
2275 }
2276 },
2277 Some(json) => {
2278 self.stack.push(json);
2279 try!(f(self))
2280 }
2281 };
2282 self.stack.push(Json::Object(obj));
2283 Ok(value)
2284 }
2285
2286 fn read_tuple<T, F>(&mut self, tuple_len: usize, f: F) -> DecodeResult<T> where
2287 F: FnOnce(&mut Decoder) -> DecodeResult<T>,
2288 {
2289 self.read_seq(move |d, len| {
2290 if len == tuple_len {
2291 f(d)
2292 } else {
2293 Err(ExpectedError(format!("Tuple{}", tuple_len), format!("Tuple{}", len)))
2294 }
2295 })
2296 }
2297
2298 fn read_tuple_arg<T, F>(&mut self, idx: usize, f: F) -> DecodeResult<T> where
2299 F: FnOnce(&mut Decoder) -> DecodeResult<T>,
2300 {
2301 self.read_seq_elt(idx, f)
2302 }
2303
2304 fn read_tuple_struct<T, F>(&mut self,
2305 _name: &str,
2306 len: usize,
2307 f: F)
2308 -> DecodeResult<T> where
2309 F: FnOnce(&mut Decoder) -> DecodeResult<T>,
2310 {
2311 self.read_tuple(len, f)
2312 }
2313
2314 fn read_tuple_struct_arg<T, F>(&mut self,
2315 idx: usize,
2316 f: F)
2317 -> DecodeResult<T> where
2318 F: FnOnce(&mut Decoder) -> DecodeResult<T>,
2319 {
2320 self.read_tuple_arg(idx, f)
2321 }
2322
2323 fn read_option<T, F>(&mut self, mut f: F) -> DecodeResult<T> where
2324 F: FnMut(&mut Decoder, bool) -> DecodeResult<T>,
2325 {
2326 match try!(self.pop()) {
2327 Json::Null => f(self, false),
2328 value => { self.stack.push(value); f(self, true) }
2329 }
2330 }
2331
2332 fn read_seq<T, F>(&mut self, f: F) -> DecodeResult<T> where
2333 F: FnOnce(&mut Decoder, usize) -> DecodeResult<T>,
2334 {
2335 let array = try!(expect!(self.pop(), Array));
2336 let len = array.len();
2337 for v in array.into_iter().rev() {
2338 self.stack.push(v);
2339 }
2340 f(self, len)
2341 }
2342
2343 fn read_seq_elt<T, F>(&mut self, _idx: usize, f: F) -> DecodeResult<T> where
2344 F: FnOnce(&mut Decoder) -> DecodeResult<T>,
2345 {
2346 f(self)
2347 }
2348
2349 fn read_map<T, F>(&mut self, f: F) -> DecodeResult<T> where
2350 F: FnOnce(&mut Decoder, usize) -> DecodeResult<T>,
2351 {
2352 let obj = try!(expect!(self.pop(), Object));
2353 let len = obj.len();
2354 for (key, value) in obj.into_iter() {
2355 self.stack.push(value);
2356 self.stack.push(Json::String(key));
2357 }
2358 f(self, len)
2359 }
2360
2361 fn read_map_elt_key<T, F>(&mut self, _idx: usize, f: F) -> DecodeResult<T> where
2362 F: FnOnce(&mut Decoder) -> DecodeResult<T>,
2363 {
2364 f(self)
2365 }
2366
2367 fn read_map_elt_val<T, F>(&mut self, _idx: usize, f: F) -> DecodeResult<T> where
2368 F: FnOnce(&mut Decoder) -> DecodeResult<T>,
2369 {
2370 f(self)
2371 }
2372
2373 fn error(&mut self, err: &str) -> DecoderError {
2374 ApplicationError(err.to_string())
2375 }
2376}
2377
2378pub trait ToJson {
2380 fn to_json(&self) -> Json;
2382}
2383
2384macro_rules! to_json_impl_i64 {
2385 ($($t:ty), +) => (
2386 $(impl ToJson for $t {
2387 fn to_json(&self) -> Json { Json::I64(*self as i64) }
2388 })+
2389 )
2390}
2391
2392to_json_impl_i64! { isize, i8, i16, i32, i64 }
2393
2394macro_rules! to_json_impl_u64 {
2395 ($($t:ty), +) => (
2396 $(impl ToJson for $t {
2397 fn to_json(&self) -> Json { Json::U64(*self as u64) }
2398 })+
2399 )
2400}
2401
2402to_json_impl_u64! { usize, u8, u16, u32, u64 }
2403
2404impl ToJson for Json {
2405 fn to_json(&self) -> Json { self.clone() }
2406}
2407
2408impl ToJson for f32 {
2409 fn to_json(&self) -> Json { (*self as f64).to_json() }
2410}
2411
2412impl ToJson for f64 {
2413 fn to_json(&self) -> Json {
2414 use std::num::FpCategory::{Nan, Infinite};
2415
2416 match self.classify() {
2417 Nan | Infinite => Json::Null,
2418 _ => Json::F64(*self)
2419 }
2420 }
2421}
2422
2423impl ToJson for () {
2424 fn to_json(&self) -> Json { Json::Null }
2425}
2426
2427impl ToJson for bool {
2428 fn to_json(&self) -> Json { Json::Boolean(*self) }
2429}
2430
2431impl ToJson for str {
2432 fn to_json(&self) -> Json { Json::String(self.to_string()) }
2433}
2434
2435impl ToJson for string::String {
2436 fn to_json(&self) -> Json { Json::String((*self).clone()) }
2437}
2438
2439macro_rules! tuple_impl {
2440 ($($tyvar:ident),* ) => {
2442 impl<
2444 $( $tyvar : ToJson ),*
2445 > ToJson for ( $( $tyvar ),* , ) {
2446
2447 #[inline]
2448 #[allow(non_snake_case)]
2449 fn to_json(&self) -> Json {
2450 match *self {
2451 ($(ref $tyvar),*,) => Json::Array(vec![$($tyvar.to_json()),*])
2452 }
2453 }
2454 }
2455 }
2456}
2457
2458tuple_impl!{A}
2459tuple_impl!{A, B}
2460tuple_impl!{A, B, C}
2461tuple_impl!{A, B, C, D}
2462tuple_impl!{A, B, C, D, E}
2463tuple_impl!{A, B, C, D, E, F}
2464tuple_impl!{A, B, C, D, E, F, G}
2465tuple_impl!{A, B, C, D, E, F, G, H}
2466tuple_impl!{A, B, C, D, E, F, G, H, I}
2467tuple_impl!{A, B, C, D, E, F, G, H, I, J}
2468tuple_impl!{A, B, C, D, E, F, G, H, I, J, K}
2469tuple_impl!{A, B, C, D, E, F, G, H, I, J, K, L}
2470
2471impl<A: ToJson> ToJson for [A] {
2472 fn to_json(&self) -> Json { Json::Array(self.iter().map(|elt| elt.to_json()).collect()) }
2473}
2474
2475impl<A: ToJson> ToJson for Vec<A> {
2476 fn to_json(&self) -> Json { Json::Array(self.iter().map(|elt| elt.to_json()).collect()) }
2477}
2478
2479impl<A: ToJson> ToJson for BTreeMap<string::String, A> {
2480 fn to_json(&self) -> Json {
2481 let mut d = BTreeMap::new();
2482 for (key, value) in self.iter() {
2483 d.insert((*key).clone(), value.to_json());
2484 }
2485 Json::Object(d)
2486 }
2487}
2488
2489impl<A: ToJson> ToJson for HashMap<string::String, A> {
2490 fn to_json(&self) -> Json {
2491 let mut d = BTreeMap::new();
2492 for (key, value) in self.iter() {
2493 d.insert((*key).clone(), value.to_json());
2494 }
2495 Json::Object(d)
2496 }
2497}
2498
2499impl<A:ToJson> ToJson for Option<A> {
2500 fn to_json(&self) -> Json {
2501 match *self {
2502 None => Json::Null,
2503 Some(ref value) => value.to_json()
2504 }
2505 }
2506}
2507
2508struct FormatShim<'a, 'b: 'a> {
2509 inner: &'a mut fmt::Formatter<'b>,
2510}
2511
2512impl<'a, 'b> fmt::Write for FormatShim<'a, 'b> {
2513 fn write_str(&mut self, s: &str) -> fmt::Result {
2514 match self.inner.write_str(s) {
2515 Ok(_) => Ok(()),
2516 Err(_) => Err(fmt::Error)
2517 }
2518 }
2519}
2520
2521impl fmt::Display for Json {
2522 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2524 let mut shim = FormatShim { inner: f };
2525 let mut encoder = Encoder::new(&mut shim);
2526 match self.encode(&mut encoder) {
2527 Ok(_) => Ok(()),
2528 Err(_) => Err(fmt::Error)
2529 }
2530 }
2531}
2532
2533impl<'a> fmt::Display for PrettyJson<'a> {
2534 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2536 let mut shim = FormatShim { inner: f };
2537 let mut encoder = Encoder::new_pretty(&mut shim);
2538 match self.inner.encode(&mut encoder) {
2539 Ok(_) => Ok(()),
2540 Err(_) => Err(fmt::Error)
2541 }
2542 }
2543}
2544
2545impl<'a, T: Encodable> fmt::Display for AsJson<'a, T> {
2546 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2548 let mut shim = FormatShim { inner: f };
2549 let mut encoder = Encoder::new(&mut shim);
2550 match self.inner.encode(&mut encoder) {
2551 Ok(_) => Ok(()),
2552 Err(_) => Err(fmt::Error)
2553 }
2554 }
2555}
2556
2557impl<'a, T> AsPrettyJson<'a, T> {
2558 pub fn indent(mut self, indent: u32) -> AsPrettyJson<'a, T> {
2560 self.indent = Some(indent);
2561 self
2562 }
2563}
2564
2565impl<'a, T: Encodable> fmt::Display for AsPrettyJson<'a, T> {
2566 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2568 let mut shim = FormatShim { inner: f };
2569 let mut encoder = Encoder::new_pretty(&mut shim);
2570 if let Some(n) = self.indent {
2571 let _ = encoder.set_indent(n);
2573 }
2574 match self.inner.encode(&mut encoder) {
2575 Ok(_) => Ok(()),
2576 Err(_) => Err(fmt::Error)
2577 }
2578 }
2579}
2580
2581impl FromStr for Json {
2582 type Err = ParserError;
2583 fn from_str(s: &str) -> Result<Json, ParserError> {
2584 Json::from_str(s)
2585 }
2586}
2587
2588#[cfg(test)]
2589mod tests {
2590 use self::Animal::*;
2591 use {Encodable, Decodable};
2592 use super::Json::*;
2593 use super::ErrorCode::*;
2594 use super::ParserError::*;
2595 use super::DecoderError::*;
2596 use super::JsonEvent::*;
2597 use super::StackElement::*;
2598 use super::{Json, DecodeResult, DecoderError, JsonEvent, Parser,
2599 StackElement, Stack, Decoder, Encoder, EncoderError};
2600 use std::{i64, u64, f32, f64};
2601 use std::collections::BTreeMap;
2602 use std::string;
2603
2604 #[derive(RustcDecodable, Eq, PartialEq, Debug)]
2605 struct OptionData {
2606 opt: Option<usize>,
2607 }
2608
2609 #[test]
2610 fn test_decode_option_none() {
2611 let s ="{}";
2612 let obj: OptionData = super::decode(s).unwrap();
2613 assert_eq!(obj, OptionData { opt: None });
2614 }
2615
2616 #[test]
2617 fn test_decode_option_some() {
2618 let s = "{ \"opt\": 10 }";
2619 let obj: OptionData = super::decode(s).unwrap();
2620 assert_eq!(obj, OptionData { opt: Some(10) });
2621 }
2622
2623 #[test]
2624 fn test_decode_option_malformed() {
2625 check_err::<OptionData>("{ \"opt\": [] }",
2626 ExpectedError("Number".to_string(), "[]".to_string()));
2627 check_err::<OptionData>("{ \"opt\": false }",
2628 ExpectedError("Number".to_string(), "false".to_string()));
2629 }
2630
2631 #[derive(PartialEq, RustcEncodable, RustcDecodable, Debug)]
2632 enum Animal {
2633 Dog,
2634 Frog(string::String, isize)
2635 }
2636
2637 #[derive(PartialEq, RustcEncodable, RustcDecodable, Debug)]
2638 struct Inner {
2639 a: (),
2640 b: usize,
2641 c: Vec<string::String>,
2642 }
2643
2644 #[derive(PartialEq, RustcEncodable, RustcDecodable, Debug)]
2645 struct Outer {
2646 inner: Vec<Inner>,
2647 }
2648
2649 fn mk_object(items: &[(string::String, Json)]) -> Json {
2650 let mut d = BTreeMap::new();
2651
2652 for item in items.iter() {
2653 match *item {
2654 (ref key, ref value) => { d.insert((*key).clone(), (*value).clone()); },
2655 }
2656 };
2657
2658 Object(d)
2659 }
2660
2661 #[test]
2662 fn test_from_str_trait() {
2663 let s = "null";
2664 assert!(s.parse::<Json>().unwrap() == s.parse().unwrap());
2665 }
2666
2667 #[test]
2668 fn test_write_null() {
2669 assert_eq!(Null.to_string(), "null");
2670 assert_eq!(Null.pretty().to_string(), "null");
2671 }
2672
2673 #[test]
2674 fn test_write_i64() {
2675 assert_eq!(U64(0).to_string(), "0");
2676 assert_eq!(U64(0).pretty().to_string(), "0");
2677
2678 assert_eq!(U64(1234).to_string(), "1234");
2679 assert_eq!(U64(1234).pretty().to_string(), "1234");
2680
2681 assert_eq!(I64(-5678).to_string(), "-5678");
2682 assert_eq!(I64(-5678).pretty().to_string(), "-5678");
2683
2684 assert_eq!(U64(7650007200025252000).to_string(), "7650007200025252000");
2685 assert_eq!(U64(7650007200025252000).pretty().to_string(), "7650007200025252000");
2686 }
2687
2688 #[test]
2689 fn test_write_f64() {
2690 assert_eq!(F64(3.0).to_string(), "3.0");
2691 assert_eq!(F64(3.0).pretty().to_string(), "3.0");
2692
2693 assert_eq!(F64(3.1).to_string(), "3.1");
2694 assert_eq!(F64(3.1).pretty().to_string(), "3.1");
2695
2696 assert_eq!(F64(-1.5).to_string(), "-1.5");
2697 assert_eq!(F64(-1.5).pretty().to_string(), "-1.5");
2698
2699 assert_eq!(F64(0.5).to_string(), "0.5");
2700 assert_eq!(F64(0.5).pretty().to_string(), "0.5");
2701
2702 assert_eq!(F64(f64::NAN).to_string(), "null");
2703 assert_eq!(F64(f64::NAN).pretty().to_string(), "null");
2704
2705 assert_eq!(F64(f64::INFINITY).to_string(), "null");
2706 assert_eq!(F64(f64::INFINITY).pretty().to_string(), "null");
2707
2708 assert_eq!(F64(f64::NEG_INFINITY).to_string(), "null");
2709 assert_eq!(F64(f64::NEG_INFINITY).pretty().to_string(), "null");
2710 }
2711
2712 #[test]
2713 fn test_write_str() {
2714 assert_eq!(String("".to_string()).to_string(), "\"\"");
2715 assert_eq!(String("".to_string()).pretty().to_string(), "\"\"");
2716
2717 assert_eq!(String("homura".to_string()).to_string(), "\"homura\"");
2718 assert_eq!(String("madoka".to_string()).pretty().to_string(), "\"madoka\"");
2719 }
2720
2721 #[test]
2722 fn test_write_bool() {
2723 assert_eq!(Boolean(true).to_string(), "true");
2724 assert_eq!(Boolean(true).pretty().to_string(), "true");
2725
2726 assert_eq!(Boolean(false).to_string(), "false");
2727 assert_eq!(Boolean(false).pretty().to_string(), "false");
2728 }
2729
2730 #[test]
2731 fn test_write_array() {
2732 assert_eq!(Array(vec![]).to_string(), "[]");
2733 assert_eq!(Array(vec![]).pretty().to_string(), "[]");
2734
2735 assert_eq!(Array(vec![Boolean(true)]).to_string(), "[true]");
2736 assert_eq!(
2737 Array(vec![Boolean(true)]).pretty().to_string(),
2738 "\
2739 [\n \
2740 true\n\
2741 ]"
2742 );
2743
2744 let long_test_array = Array(vec![
2745 Boolean(false),
2746 Null,
2747 Array(vec![String("foo\nbar".to_string()), F64(3.5)])]);
2748
2749 assert_eq!(long_test_array.to_string(),
2750 "[false,null,[\"foo\\nbar\",3.5]]");
2751 assert_eq!(
2752 long_test_array.pretty().to_string(),
2753 "\
2754 [\n \
2755 false,\n \
2756 null,\n \
2757 [\n \
2758 \"foo\\nbar\",\n \
2759 3.5\n \
2760 ]\n\
2761 ]"
2762 );
2763 }
2764
2765 #[test]
2766 fn test_write_object() {
2767 assert_eq!(mk_object(&[]).to_string(), "{}");
2768 assert_eq!(mk_object(&[]).pretty().to_string(), "{}");
2769
2770 assert_eq!(
2771 mk_object(&[
2772 ("a".to_string(), Boolean(true))
2773 ]).to_string(),
2774 "{\"a\":true}"
2775 );
2776 assert_eq!(
2777 mk_object(&[("a".to_string(), Boolean(true))]).pretty().to_string(),
2778 "\
2779 {\n \
2780 \"a\": true\n\
2781 }"
2782 );
2783
2784 let complex_obj = mk_object(&[
2785 ("b".to_string(), Array(vec![
2786 mk_object(&[("c".to_string(), String("\x0c\r".to_string()))]),
2787 mk_object(&[("d".to_string(), String("".to_string()))])
2788 ]))
2789 ]);
2790
2791 assert_eq!(
2792 complex_obj.to_string(),
2793 "{\
2794 \"b\":[\
2795 {\"c\":\"\\f\\r\"},\
2796 {\"d\":\"\"}\
2797 ]\
2798 }"
2799 );
2800 assert_eq!(
2801 complex_obj.pretty().to_string(),
2802 "\
2803 {\n \
2804 \"b\": [\n \
2805 {\n \
2806 \"c\": \"\\f\\r\"\n \
2807 },\n \
2808 {\n \
2809 \"d\": \"\"\n \
2810 }\n \
2811 ]\n\
2812 }"
2813 );
2814
2815 let a = mk_object(&[
2816 ("a".to_string(), Boolean(true)),
2817 ("b".to_string(), Array(vec![
2818 mk_object(&[("c".to_string(), String("\x0c\r".to_string()))]),
2819 mk_object(&[("d".to_string(), String("".to_string()))])
2820 ]))
2821 ]);
2822
2823 assert_eq!(a.clone(), a.to_string().parse().unwrap());
2826 assert_eq!(a.clone(), a.pretty().to_string().parse().unwrap());
2827 }
2828
2829 #[test]
2830 fn test_write_enum() {
2831 let animal = Dog;
2832 assert_eq!(
2833 format!("{}", super::as_json(&animal)),
2834 "\"Dog\""
2835 );
2836 assert_eq!(
2837 format!("{}", super::as_pretty_json(&animal)),
2838 "\"Dog\""
2839 );
2840
2841 let animal = Frog("Henry".to_string(), 349);
2842 assert_eq!(
2843 format!("{}", super::as_json(&animal)),
2844 "{\"variant\":\"Frog\",\"fields\":[\"Henry\",349]}"
2845 );
2846 assert_eq!(
2847 format!("{}", super::as_pretty_json(&animal)),
2848 "{\n \
2849 \"variant\": \"Frog\",\n \
2850 \"fields\": [\n \
2851 \"Henry\",\n \
2852 349\n \
2853 ]\n\
2854 }"
2855 );
2856 }
2857
2858 macro_rules! check_encoder_for_simple {
2859 ($value:expr, $expected:expr) => ({
2860 let s = format!("{}", super::as_json(&$value));
2861 assert_eq!(s, $expected);
2862
2863 let s = format!("{}", super::as_pretty_json(&$value));
2864 assert_eq!(s, $expected);
2865 })
2866 }
2867
2868 #[test]
2869 fn test_write_some() {
2870 check_encoder_for_simple!(Some("jodhpurs".to_string()), "\"jodhpurs\"");
2871 }
2872
2873 #[test]
2874 fn test_write_none() {
2875 check_encoder_for_simple!(None::<string::String>, "null");
2876 }
2877
2878 #[test]
2879 fn test_write_char() {
2880 check_encoder_for_simple!('a', "\"a\"");
2881 check_encoder_for_simple!('\t', "\"\\t\"");
2882 check_encoder_for_simple!('\u{0000}', "\"\\u0000\"");
2883 check_encoder_for_simple!('\u{001b}', "\"\\u001b\"");
2884 check_encoder_for_simple!('\u{007f}', "\"\\u007f\"");
2885 check_encoder_for_simple!('\u{00a0}', "\"\u{00a0}\"");
2886 check_encoder_for_simple!('\u{abcd}', "\"\u{abcd}\"");
2887 check_encoder_for_simple!('\u{10ffff}', "\"\u{10ffff}\"");
2888 }
2889
2890 #[test]
2891 fn test_trailing_characters() {
2892 assert_eq!(Json::from_str("nulla"), Err(SyntaxError(TrailingCharacters, 1, 5)));
2893 assert_eq!(Json::from_str("truea"), Err(SyntaxError(TrailingCharacters, 1, 5)));
2894 assert_eq!(Json::from_str("falsea"), Err(SyntaxError(TrailingCharacters, 1, 6)));
2895 assert_eq!(Json::from_str("1a"), Err(SyntaxError(TrailingCharacters, 1, 2)));
2896 assert_eq!(Json::from_str("[]a"), Err(SyntaxError(TrailingCharacters, 1, 3)));
2897 assert_eq!(Json::from_str("{}a"), Err(SyntaxError(TrailingCharacters, 1, 3)));
2898 }
2899
2900 #[test]
2901 fn test_read_identifiers() {
2902 assert_eq!(Json::from_str("n"), Err(SyntaxError(InvalidSyntax, 1, 2)));
2903 assert_eq!(Json::from_str("nul"), Err(SyntaxError(InvalidSyntax, 1, 4)));
2904 assert_eq!(Json::from_str("t"), Err(SyntaxError(InvalidSyntax, 1, 2)));
2905 assert_eq!(Json::from_str("truz"), Err(SyntaxError(InvalidSyntax, 1, 4)));
2906 assert_eq!(Json::from_str("f"), Err(SyntaxError(InvalidSyntax, 1, 2)));
2907 assert_eq!(Json::from_str("faz"), Err(SyntaxError(InvalidSyntax, 1, 3)));
2908
2909 assert_eq!(Json::from_str("null"), Ok(Null));
2910 assert_eq!(Json::from_str("true"), Ok(Boolean(true)));
2911 assert_eq!(Json::from_str("false"), Ok(Boolean(false)));
2912 assert_eq!(Json::from_str(" null "), Ok(Null));
2913 assert_eq!(Json::from_str(" true "), Ok(Boolean(true)));
2914 assert_eq!(Json::from_str(" false "), Ok(Boolean(false)));
2915 }
2916
2917 #[test]
2918 fn test_decode_identifiers() {
2919 let v: () = super::decode("null").unwrap();
2920 assert_eq!(v, ());
2921
2922 let v: bool = super::decode("true").unwrap();
2923 assert_eq!(v, true);
2924
2925 let v: bool = super::decode("false").unwrap();
2926 assert_eq!(v, false);
2927 }
2928
2929 #[test]
2930 fn test_read_number() {
2931 assert_eq!(Json::from_str("+"), Err(SyntaxError(InvalidSyntax, 1, 1)));
2932 assert_eq!(Json::from_str("."), Err(SyntaxError(InvalidSyntax, 1, 1)));
2933 assert_eq!(Json::from_str("NaN"), Err(SyntaxError(InvalidSyntax, 1, 1)));
2934 assert_eq!(Json::from_str("-"), Err(SyntaxError(InvalidNumber, 1, 2)));
2935 assert_eq!(Json::from_str("00"), Err(SyntaxError(InvalidNumber, 1, 2)));
2936 assert_eq!(Json::from_str("1."), Err(SyntaxError(InvalidNumber, 1, 3)));
2937 assert_eq!(Json::from_str("1e"), Err(SyntaxError(InvalidNumber, 1, 3)));
2938 assert_eq!(Json::from_str("1e+"), Err(SyntaxError(InvalidNumber, 1, 4)));
2939
2940 assert_eq!(Json::from_str("18446744073709551616"), Err(SyntaxError(InvalidNumber, 1, 20)));
2941 assert_eq!(Json::from_str("18446744073709551617"), Err(SyntaxError(InvalidNumber, 1, 20)));
2942 assert_eq!(Json::from_str("-9223372036854775809"), Err(SyntaxError(InvalidNumber, 1, 21)));
2943
2944 assert_eq!(Json::from_str("3"), Ok(U64(3)));
2945 assert_eq!(Json::from_str("3.1"), Ok(F64(3.1)));
2946 assert_eq!(Json::from_str("-1.2"), Ok(F64(-1.2)));
2947 assert_eq!(Json::from_str("0.4"), Ok(F64(0.4)));
2948 assert_eq!(Json::from_str("0.4e5"), Ok(F64(0.4e5)));
2949 assert_eq!(Json::from_str("0.4e+15"), Ok(F64(0.4e15)));
2950 assert_eq!(Json::from_str("0.4e-01"), Ok(F64(0.4e-01)));
2951 assert_eq!(Json::from_str("123456789.5024"), Ok(F64(123456789.5024)));
2952 assert_eq!(Json::from_str(" 3 "), Ok(U64(3)));
2953
2954 assert_eq!(Json::from_str("-9223372036854775808"), Ok(I64(i64::MIN)));
2955 assert_eq!(Json::from_str("9223372036854775807"), Ok(U64(i64::MAX as u64)));
2956 assert_eq!(Json::from_str("18446744073709551615"), Ok(U64(u64::MAX)));
2957 }
2958
2959 #[test]
2960 fn test_decode_numbers() {
2961 let v: f64 = super::decode("3").unwrap();
2962 assert_eq!(v, 3.0);
2963
2964 let v: f64 = super::decode("3.1").unwrap();
2965 assert_eq!(v, 3.1);
2966
2967 let v: f64 = super::decode("-1.2").unwrap();
2968 assert_eq!(v, -1.2);
2969
2970 let v: f64 = super::decode("0.4").unwrap();
2971 assert_eq!(v, 0.4);
2972
2973 let v: f64 = super::decode("0.4e5").unwrap();
2974 assert_eq!(v, 0.4e5);
2975
2976 let v: f64 = super::decode("0.4e15").unwrap();
2977 assert_eq!(v, 0.4e15);
2978
2979 let v: f64 = super::decode("0.4e-01").unwrap();
2980 assert_eq!(v, 0.4e-01);
2981
2982 let v: f64 = super::decode("123456789.5024").unwrap();
2983 assert_eq!(v, 123456789.5024);
2984
2985 let v: u64 = super::decode("0").unwrap();
2986 assert_eq!(v, 0);
2987
2988 let v: u64 = super::decode("18446744073709551615").unwrap();
2989 assert_eq!(v, u64::MAX);
2990
2991 let v: i64 = super::decode("-9223372036854775808").unwrap();
2992 assert_eq!(v, i64::MIN);
2993
2994 let v: i64 = super::decode("9223372036854775807").unwrap();
2995 assert_eq!(v, i64::MAX);
2996
2997 let res: DecodeResult<i64> = super::decode("765.25252");
2998 match res {
2999 Ok(..) => panic!("expected an error"),
3000 Err(ExpectedError(ref s, _)) => assert_eq!(s, "Integer"),
3001 Err(..) => panic!("expected an 'expected integer' error"),
3002 }
3003 }
3004
3005 #[test]
3006 fn test_read_str() {
3007 assert_eq!(Json::from_str("\""), Err(SyntaxError(EOFWhileParsingString, 1, 2)));
3008 assert_eq!(Json::from_str("\"lol"), Err(SyntaxError(EOFWhileParsingString, 1, 5)));
3009 assert_eq!(Json::from_str("\"\n\""), Err(SyntaxError(ControlCharacterInString, 2, 1)));
3010 assert_eq!(Json::from_str("\"\0\""), Err(SyntaxError(ControlCharacterInString, 1, 2)));
3011 assert_eq!(Json::from_str("\"\u{1}\""), Err(SyntaxError(ControlCharacterInString, 1, 2)));
3012 assert_eq!(Json::from_str("\"\u{1F}\""), Err(SyntaxError(ControlCharacterInString, 1, 2)));
3013
3014 assert!('\u{7F}'.is_control());
3016 assert!('\u{80}'.is_control());
3017 assert!('\u{9F}'.is_control());
3018 let c1_controls = "\u{7F}\u{80}\u{9F}".to_string();
3019 assert_eq!(Json::from_str(&format!("\"{}\"", c1_controls)), Ok(String(c1_controls)));
3020
3021 assert_eq!(Json::from_str("\"\""), Ok(String("".to_string())));
3022 assert_eq!(Json::from_str("\"foo\""), Ok(String("foo".to_string())));
3023 assert_eq!(Json::from_str("\"\\\"\""), Ok(String("\"".to_string())));
3024 assert_eq!(Json::from_str("\"\\b\""), Ok(String("\x08".to_string())));
3025 assert_eq!(Json::from_str("\"\\n\""), Ok(String("\n".to_string())));
3026 assert_eq!(Json::from_str("\"\\r\""), Ok(String("\r".to_string())));
3027 assert_eq!(Json::from_str("\"\\t\""), Ok(String("\t".to_string())));
3028 assert_eq!(Json::from_str(" \"foo\" "), Ok(String("foo".to_string())));
3029 assert_eq!(Json::from_str("\"\\u12ab\""), Ok(String("\u{12ab}".to_string())));
3030 assert_eq!(Json::from_str("\"\\uAB12\""), Ok(String("\u{AB12}".to_string())));
3031 }
3032
3033 #[test]
3034 fn test_decode_str() {
3035 let s = [("\"\"", ""),
3036 ("\"foo\"", "foo"),
3037 ("\"\\\"\"", "\""),
3038 ("\"\\b\"", "\x08"),
3039 ("\"\\n\"", "\n"),
3040 ("\"\\r\"", "\r"),
3041 ("\"\\t\"", "\t"),
3042 ("\"\\u12ab\"", "\u{12ab}"),
3043 ("\"\\uAB12\"", "\u{AB12}")];
3044
3045 for &(i, o) in s.iter() {
3046 let v: string::String = super::decode(i).unwrap();
3047 assert_eq!(v, o);
3048 }
3049 }
3050
3051 #[test]
3052 fn test_read_array() {
3053 assert_eq!(Json::from_str("["), Err(SyntaxError(EOFWhileParsingValue, 1, 2)));
3054 assert_eq!(Json::from_str("[1"), Err(SyntaxError(EOFWhileParsingArray, 1, 3)));
3055 assert_eq!(Json::from_str("[1,"), Err(SyntaxError(EOFWhileParsingValue, 1, 4)));
3056 assert_eq!(Json::from_str("[1,]"), Err(SyntaxError(InvalidSyntax, 1, 4)));
3057 assert_eq!(Json::from_str("[6 7]"), Err(SyntaxError(InvalidSyntax, 1, 4)));
3058
3059 assert_eq!(Json::from_str("[]"), Ok(Array(vec![])));
3060 assert_eq!(Json::from_str("[ ]"), Ok(Array(vec![])));
3061 assert_eq!(Json::from_str("[true]"), Ok(Array(vec![Boolean(true)])));
3062 assert_eq!(Json::from_str("[ false ]"), Ok(Array(vec![Boolean(false)])));
3063 assert_eq!(Json::from_str("[null]"), Ok(Array(vec![Null])));
3064 assert_eq!(Json::from_str("[3, 1]"),
3065 Ok(Array(vec![U64(3), U64(1)])));
3066 assert_eq!(Json::from_str("\n[3, 2]\n"),
3067 Ok(Array(vec![U64(3), U64(2)])));
3068 assert_eq!(Json::from_str("[2, [4, 1]]"),
3069 Ok(Array(vec![U64(2), Array(vec![U64(4), U64(1)])])));
3070 }
3071
3072 #[test]
3073 fn test_decode_array() {
3074 let v: Vec<()> = super::decode("[]").unwrap();
3075 assert_eq!(v, vec![]);
3076
3077 let v: Vec<()> = super::decode("[null]").unwrap();
3078 assert_eq!(v, vec![()]);
3079
3080 let v: Vec<bool> = super::decode("[true]").unwrap();
3081 assert_eq!(v, vec![true]);
3082
3083 let v: Vec<isize> = super::decode("[3, 1]").unwrap();
3084 assert_eq!(v, vec![3, 1]);
3085
3086 let v: Vec<Vec<usize>> = super::decode("[[3], [1, 2]]").unwrap();
3087 assert_eq!(v, vec![vec![3], vec![1, 2]]);
3088 }
3089
3090 #[test]
3091 fn test_decode_tuple() {
3092 let t: (usize, usize, usize) = super::decode("[1, 2, 3]").unwrap();
3093 assert_eq!(t, (1, 2, 3));
3094
3095 let t: (usize, string::String) = super::decode("[1, \"two\"]").unwrap();
3096 assert_eq!(t, (1, "two".to_string()));
3097 }
3098
3099 #[test]
3100 fn test_decode_tuple_malformed_types() {
3101 assert!(super::decode::<(usize, string::String)>("[1, 2]").is_err());
3102 }
3103
3104 #[test]
3105 fn test_decode_tuple_malformed_length() {
3106 assert!(super::decode::<(usize, usize)>("[1, 2, 3]").is_err());
3107 }
3108
3109 #[test]
3110 fn test_read_object() {
3111 assert_eq!(Json::from_str("{"), Err(SyntaxError(EOFWhileParsingObject, 1, 2)));
3112 assert_eq!(Json::from_str("{ "), Err(SyntaxError(EOFWhileParsingObject, 1, 3)));
3113 assert_eq!(Json::from_str("{1"), Err(SyntaxError(KeyMustBeAString, 1, 2)));
3114 assert_eq!(Json::from_str("{ \"a\""), Err(SyntaxError(EOFWhileParsingObject, 1, 6)));
3115 assert_eq!(Json::from_str("{\"a\""), Err(SyntaxError(EOFWhileParsingObject, 1, 5)));
3116 assert_eq!(Json::from_str("{\"a\" "), Err(SyntaxError(EOFWhileParsingObject, 1, 6)));
3117
3118 assert_eq!(Json::from_str("{\"a\" 1"), Err(SyntaxError(ExpectedColon, 1, 6)));
3119 assert_eq!(Json::from_str("{\"a\":"), Err(SyntaxError(EOFWhileParsingValue, 1, 6)));
3120 assert_eq!(Json::from_str("{\"a\":1"), Err(SyntaxError(EOFWhileParsingObject, 1, 7)));
3121 assert_eq!(Json::from_str("{\"a\":1 1"), Err(SyntaxError(InvalidSyntax, 1, 8)));
3122 assert_eq!(Json::from_str("{\"a\":1,"), Err(SyntaxError(EOFWhileParsingObject, 1, 8)));
3123
3124 assert_eq!(Json::from_str("{}").unwrap(), mk_object(&[]));
3125 assert_eq!(Json::from_str("{\"a\": 3}").unwrap(),
3126 mk_object(&[("a".to_string(), U64(3))]));
3127
3128 assert_eq!(Json::from_str(
3129 "{ \"a\": null, \"b\" : true }").unwrap(),
3130 mk_object(&[
3131 ("a".to_string(), Null),
3132 ("b".to_string(), Boolean(true))]));
3133 assert_eq!(Json::from_str("\n{ \"a\": null, \"b\" : true }\n").unwrap(),
3134 mk_object(&[
3135 ("a".to_string(), Null),
3136 ("b".to_string(), Boolean(true))]));
3137 assert_eq!(Json::from_str(
3138 "{\"a\" : 1.0 ,\"b\": [ true ]}").unwrap(),
3139 mk_object(&[
3140 ("a".to_string(), F64(1.0)),
3141 ("b".to_string(), Array(vec![Boolean(true)]))
3142 ]));
3143 assert_eq!(Json::from_str(
3144 "{\
3145 \"a\": 1.0, \
3146 \"b\": [\
3147 true,\
3148 \"foo\\nbar\", \
3149 { \"c\": {\"d\": null} } \
3150 ]\
3151 }").unwrap(),
3152 mk_object(&[
3153 ("a".to_string(), F64(1.0)),
3154 ("b".to_string(), Array(vec![
3155 Boolean(true),
3156 String("foo\nbar".to_string()),
3157 mk_object(&[
3158 ("c".to_string(), mk_object(&[("d".to_string(), Null)]))
3159 ])
3160 ]))
3161 ]));
3162 }
3163
3164 #[test]
3165 fn test_decode_struct() {
3166 let s = "{
3167 \"inner\": [
3168 { \"a\": null, \"b\": 2, \"c\": [\"abc\", \"xyz\"] }
3169 ]
3170 }";
3171
3172 let v: Outer = super::decode(s).unwrap();
3173 assert_eq!(
3174 v,
3175 Outer {
3176 inner: vec![
3177 Inner { a: (), b: 2, c: vec!["abc".to_string(), "xyz".to_string()] }
3178 ]
3179 }
3180 );
3181 }
3182
3183 #[derive(RustcDecodable)]
3184 struct FloatStruct {
3185 f: f64,
3186 a: Vec<f64>
3187 }
3188 #[test]
3189 fn test_decode_struct_with_nan() {
3190 let s = "{\"f\":null,\"a\":[null,123]}";
3191 let obj: FloatStruct = super::decode(s).unwrap();
3192 assert!(obj.f.is_nan());
3193 assert!(obj.a[0].is_nan());
3194 assert_eq!(obj.a[1], 123f64);
3195 }
3196
3197 #[test]
3198 fn test_decode_option() {
3199 let value: Option<string::String> = super::decode("null").unwrap();
3200 assert_eq!(value, None);
3201
3202 let value: Option<string::String> = super::decode("\"jodhpurs\"").unwrap();
3203 assert_eq!(value, Some("jodhpurs".to_string()));
3204 }
3205
3206 #[test]
3207 fn test_decode_enum() {
3208 let value: Animal = super::decode("\"Dog\"").unwrap();
3209 assert_eq!(value, Dog);
3210
3211 let s = "{\"variant\":\"Frog\",\"fields\":[\"Henry\",349]}";
3212 let value: Animal = super::decode(s).unwrap();
3213 assert_eq!(value, Frog("Henry".to_string(), 349));
3214 }
3215
3216 #[test]
3217 fn test_decode_result() {
3218 let value: Result<i32, i8> = Ok(4);
3219 let json_value = super::encode(&value).unwrap();
3220 assert_eq!(json_value, "{\"variant\":\"Ok\",\"fields\":[4]}");
3221 let decoded_value: Result<i32, i8> = super::decode(&json_value).unwrap();
3222 assert_eq!(decoded_value, Ok(4));
3223 }
3224
3225 #[test]
3226 fn test_decode_map() {
3227 let s = "{\"a\": \"Dog\", \"b\": {\"variant\":\"Frog\",\
3228 \"fields\":[\"Henry\", 349]}}";
3229 let mut map: BTreeMap<string::String, Animal> = super::decode(s).unwrap();
3230
3231 assert_eq!(map.remove(&"a".to_string()), Some(Dog));
3232 assert_eq!(map.remove(&"b".to_string()), Some(Frog("Henry".to_string(), 349)));
3233 }
3234
3235 #[test]
3236 fn test_multiline_errors() {
3237 assert_eq!(Json::from_str("{\n \"foo\":\n \"bar\""),
3238 Err(SyntaxError(EOFWhileParsingObject, 3, 8)));
3239 }
3240
3241 #[derive(RustcDecodable)]
3242 #[allow(dead_code)]
3243 struct DecodeStruct {
3244 x: f64,
3245 y: bool,
3246 z: string::String,
3247 w: Vec<DecodeStruct>
3248 }
3249 #[derive(RustcDecodable)]
3250 enum DecodeEnum {
3251 A(f64),
3252 B(string::String)
3253 }
3254 fn check_err<T: Decodable>(to_parse: &'static str, expected: DecoderError) {
3255 let res: DecodeResult<T> = match Json::from_str(to_parse) {
3256 Err(e) => Err(ParseError(e)),
3257 Ok(json) => Decodable::decode(&mut Decoder::new(json))
3258 };
3259 match res {
3260 Ok(_) => panic!("`{:?}` parsed & decoded ok, expecting error `{:?}`",
3261 to_parse, expected),
3262 Err(ParseError(e)) => panic!("`{}` is not valid json: {:?}",
3263 to_parse, e),
3264 Err(e) => {
3265 assert_eq!(e, expected);
3266 }
3267 }
3268 }
3269 #[test]
3270 fn test_decode_errors_struct() {
3271 check_err::<DecodeStruct>("[]", ExpectedError("Object".to_string(), "[]".to_string()));
3272 check_err::<DecodeStruct>("{\"x\": true, \"y\": true, \"z\": \"\", \"w\": []}",
3273 ExpectedError("Number".to_string(), "true".to_string()));
3274 check_err::<DecodeStruct>("{\"x\": 1, \"y\": [], \"z\": \"\", \"w\": []}",
3275 ExpectedError("Boolean".to_string(), "[]".to_string()));
3276 check_err::<DecodeStruct>("{\"x\": 1, \"y\": true, \"z\": {}, \"w\": []}",
3277 ExpectedError("String".to_string(), "{}".to_string()));
3278 check_err::<DecodeStruct>("{\"x\": 1, \"y\": true, \"z\": \"\", \"w\": null}",
3279 ExpectedError("Array".to_string(), "null".to_string()));
3280 check_err::<DecodeStruct>("{\"x\": 1, \"y\": true, \"z\": \"\"}",
3281 MissingFieldError("w".to_string()));
3282 }
3283 #[test]
3284 fn test_decode_errors_enum() {
3285 check_err::<DecodeEnum>("{}",
3286 MissingFieldError("variant".to_string()));
3287 check_err::<DecodeEnum>("{\"variant\": 1}",
3288 ExpectedError("String".to_string(), "1".to_string()));
3289 check_err::<DecodeEnum>("{\"variant\": \"A\"}",
3290 MissingFieldError("fields".to_string()));
3291 check_err::<DecodeEnum>("{\"variant\": \"A\", \"fields\": null}",
3292 ExpectedError("Array".to_string(), "null".to_string()));
3293 check_err::<DecodeEnum>("{\"variant\": \"C\", \"fields\": []}",
3294 UnknownVariantError("C".to_string()));
3295 }
3296
3297 #[test]
3298 fn test_find(){
3299 let json_value = Json::from_str("{\"dog\" : \"cat\"}").unwrap();
3300 let found_str = json_value.find("dog");
3301 assert!(found_str.unwrap().as_string().unwrap() == "cat");
3302 }
3303
3304 #[test]
3305 fn test_find_path(){
3306 let json_value = Json::from_str("{\"dog\":{\"cat\": {\"mouse\" : \"cheese\"}}}").unwrap();
3307 let found_str = json_value.find_path(&["dog", "cat", "mouse"]);
3308 assert!(found_str.unwrap().as_string().unwrap() == "cheese");
3309 }
3310
3311 #[test]
3312 fn test_search(){
3313 let json_value = Json::from_str("{\"dog\":{\"cat\": {\"mouse\" : \"cheese\"}}}").unwrap();
3314 let found_str = json_value.search("mouse").and_then(|j| j.as_string());
3315 assert!(found_str.unwrap() == "cheese");
3316 }
3317
3318 #[test]
3319 fn test_index(){
3320 let json_value = Json::from_str("{\"animals\":[\"dog\",\"cat\",\"mouse\"]}").unwrap();
3321 let ref array = json_value["animals"];
3322 assert_eq!(array[0].as_string().unwrap(), "dog");
3323 assert_eq!(array[1].as_string().unwrap(), "cat");
3324 assert_eq!(array[2].as_string().unwrap(), "mouse");
3325 }
3326
3327 #[test]
3328 fn test_is_object(){
3329 let json_value = Json::from_str("{}").unwrap();
3330 assert!(json_value.is_object());
3331 }
3332
3333 #[test]
3334 fn test_as_object(){
3335 let json_value = Json::from_str("{}").unwrap();
3336 let json_object = json_value.as_object();
3337 assert!(json_object.is_some());
3338 }
3339
3340 #[test]
3341 fn test_is_array(){
3342 let json_value = Json::from_str("[1, 2, 3]").unwrap();
3343 assert!(json_value.is_array());
3344 }
3345
3346 #[test]
3347 fn test_as_array(){
3348 let json_value = Json::from_str("[1, 2, 3]").unwrap();
3349 let json_array = json_value.as_array();
3350 let expected_length = 3;
3351 assert!(json_array.is_some() && json_array.unwrap().len() == expected_length);
3352 }
3353
3354 #[test]
3355 fn test_is_string(){
3356 let json_value = Json::from_str("\"dog\"").unwrap();
3357 assert!(json_value.is_string());
3358 }
3359
3360 #[test]
3361 fn test_as_string(){
3362 let json_value = Json::from_str("\"dog\"").unwrap();
3363 let json_str = json_value.as_string();
3364 let expected_str = "dog";
3365 assert_eq!(json_str, Some(expected_str));
3366 }
3367
3368 #[test]
3369 fn test_is_number(){
3370 let json_value = Json::from_str("12").unwrap();
3371 assert!(json_value.is_number());
3372 }
3373
3374 #[test]
3375 fn test_is_i64(){
3376 let json_value = Json::from_str("-12").unwrap();
3377 assert!(json_value.is_i64());
3378
3379 let json_value = Json::from_str("12").unwrap();
3380 assert!(!json_value.is_i64());
3381
3382 let json_value = Json::from_str("12.0").unwrap();
3383 assert!(!json_value.is_i64());
3384 }
3385
3386 #[test]
3387 fn test_is_u64(){
3388 let json_value = Json::from_str("12").unwrap();
3389 assert!(json_value.is_u64());
3390
3391 let json_value = Json::from_str("-12").unwrap();
3392 assert!(!json_value.is_u64());
3393
3394 let json_value = Json::from_str("12.0").unwrap();
3395 assert!(!json_value.is_u64());
3396 }
3397
3398 #[test]
3399 fn test_is_f64(){
3400 let json_value = Json::from_str("12").unwrap();
3401 assert!(!json_value.is_f64());
3402
3403 let json_value = Json::from_str("-12").unwrap();
3404 assert!(!json_value.is_f64());
3405
3406 let json_value = Json::from_str("12.0").unwrap();
3407 assert!(json_value.is_f64());
3408
3409 let json_value = Json::from_str("-12.0").unwrap();
3410 assert!(json_value.is_f64());
3411 }
3412
3413 #[test]
3414 fn test_as_i64(){
3415 let json_value = Json::from_str("-12").unwrap();
3416 let json_num = json_value.as_i64();
3417 assert_eq!(json_num, Some(-12));
3418 }
3419
3420 #[test]
3421 fn test_as_u64(){
3422 let json_value = Json::from_str("12").unwrap();
3423 let json_num = json_value.as_u64();
3424 assert_eq!(json_num, Some(12));
3425 }
3426
3427 #[test]
3428 fn test_as_f64(){
3429 let json_value = Json::from_str("12.0").unwrap();
3430 let json_num = json_value.as_f64();
3431 assert_eq!(json_num, Some(12f64));
3432 }
3433
3434 #[test]
3435 fn test_is_boolean(){
3436 let json_value = Json::from_str("false").unwrap();
3437 assert!(json_value.is_boolean());
3438 }
3439
3440 #[test]
3441 fn test_as_boolean(){
3442 let json_value = Json::from_str("false").unwrap();
3443 let json_bool = json_value.as_boolean();
3444 let expected_bool = false;
3445 assert!(json_bool.is_some() && json_bool.unwrap() == expected_bool);
3446 }
3447
3448 #[test]
3449 fn test_is_null(){
3450 let json_value = Json::from_str("null").unwrap();
3451 assert!(json_value.is_null());
3452 }
3453
3454 #[test]
3455 fn test_as_null(){
3456 let json_value = Json::from_str("null").unwrap();
3457 let json_null = json_value.as_null();
3458 let expected_null = ();
3459 assert!(json_null.is_some() && json_null.unwrap() == expected_null);
3460 }
3461
3462 #[test]
3463 fn test_encode_hashmap_with_numeric_key() {
3464 use std::collections::HashMap;
3465 let mut hm: HashMap<usize, bool> = HashMap::new();
3466 hm.insert(1, true);
3467 let json_str = super::as_pretty_json(&hm).to_string();
3468 match Json::from_str(&json_str) {
3469 Err(_) => panic!("Unable to parse json_str: {}", json_str),
3470 _ => {} }
3472 }
3473
3474 #[test]
3475 fn test_negative_zero() {
3476 Json::from_str("{\"test\":-0}").unwrap();
3477 }
3478
3479 #[test]
3480 fn test_prettyencode_hashmap_with_numeric_key() {
3481 use std::collections::HashMap;
3482 let mut hm: HashMap<usize, bool> = HashMap::new();
3483 hm.insert(1, true);
3484 let json_str = super::as_pretty_json(&hm).to_string();
3485 match Json::from_str(&json_str) {
3486 Err(_) => panic!("Unable to parse json_str: {}", json_str),
3487 _ => {} }
3489 }
3490
3491 #[test]
3492 fn test_prettyencoder_indent_level_param() {
3493 use std::collections::BTreeMap;
3494
3495 let mut tree = BTreeMap::new();
3496
3497 tree.insert("hello".to_string(), String("guten tag".to_string()));
3498 tree.insert("goodbye".to_string(), String("sayonara".to_string()));
3499
3500 let json = Array(
3501 vec!
3504 ( String("greetings".to_string()), Object(tree), ) );
3510
3511 fn indents(source: &str) -> usize {
3513 let trimmed = source.trim_left_matches(' ');
3514 source.len() - trimmed.len()
3515 }
3516
3517 for i in 0..4 {
3519 let printed = super::as_pretty_json(&json).indent(i as u32)
3520 .to_string();
3521
3522 let lines: Vec<&str> = printed.lines().collect();
3524 assert_eq!(lines.len(), 7); assert_eq!(indents(lines[0]), 0 * i); assert_eq!(indents(lines[1]), 1 * i); assert_eq!(indents(lines[2]), 1 * i); assert_eq!(indents(lines[3]), 2 * i); assert_eq!(indents(lines[4]), 2 * i); assert_eq!(indents(lines[5]), 1 * i); assert_eq!(indents(lines[6]), 0 * i); Json::from_str(&printed).ok()
3536 .expect("Pretty-printed JSON is invalid!");
3537 }
3538 }
3539
3540 #[test]
3541 fn test_hashmap_with_numeric_key_can_handle_double_quote_delimited_key() {
3542 use std::collections::HashMap;
3543 use Decodable;
3544 let json_str = "{\"1\":true}";
3545 let json_obj = match Json::from_str(json_str) {
3546 Err(_) => panic!("Unable to parse json_str: {}", json_str),
3547 Ok(o) => o
3548 };
3549 let mut decoder = Decoder::new(json_obj);
3550 let _hm: HashMap<usize, bool> = Decodable::decode(&mut decoder).unwrap();
3551 }
3552
3553 #[test]
3554 fn test_hashmap_with_enum_key() {
3555 use std::collections::HashMap;
3556 use json;
3557 #[derive(RustcEncodable, Eq, Hash, PartialEq, RustcDecodable, Debug)]
3558 enum Enum {
3559 Foo,
3560 #[allow(dead_code)]
3561 Bar,
3562 }
3563 let mut map = HashMap::new();
3564 map.insert(Enum::Foo, 0);
3565 let result = json::encode(&map).unwrap();
3566 assert_eq!(result, r#"{"Foo":0}"#);
3567 let decoded: HashMap<Enum, _> = json::decode(&result).unwrap();
3568 assert_eq!(map, decoded);
3569 }
3570
3571 #[test]
3572 fn test_hashmap_with_numeric_key_will_error_with_string_keys() {
3573 use std::collections::HashMap;
3574 use Decodable;
3575 let json_str = "{\"a\":true}";
3576 let json_obj = match Json::from_str(json_str) {
3577 Err(_) => panic!("Unable to parse json_str: {}", json_str),
3578 Ok(o) => o
3579 };
3580 let mut decoder = Decoder::new(json_obj);
3581 let result: Result<HashMap<usize, bool>, DecoderError> = Decodable::decode(&mut decoder);
3582 assert_eq!(result, Err(ExpectedError("Number".to_string(), "a".to_string())));
3583 }
3584
3585 fn assert_stream_equal(src: &str,
3586 expected: Vec<(JsonEvent, Vec<StackElement>)>) {
3587 let mut parser = Parser::new(src.chars());
3588 let mut i = 0;
3589 loop {
3590 let evt = match parser.next() {
3591 Some(e) => e,
3592 None => { break; }
3593 };
3594 let (ref expected_evt, ref expected_stack) = expected[i];
3595 if !parser.stack().is_equal_to(&expected_stack) {
3596 panic!("Parser stack is not equal to {:?}", expected_stack);
3597 }
3598 assert_eq!(&evt, expected_evt);
3599 i+=1;
3600 }
3601 }
3602 #[test]
3603 #[cfg_attr(target_word_size = "32", ignore)] fn test_streaming_parser() {
3605 assert_stream_equal(
3606 r#"{ "foo":"bar", "array" : [0, 1, 2, 3, 4, 5], "idents":[null,true,false]}"#,
3607 vec![
3608 (ObjectStart, vec![]),
3609 (StringValue("bar".to_string()), vec![Key("foo")]),
3610 (ArrayStart, vec![Key("array")]),
3611 (U64Value(0), vec![Key("array"), Index(0)]),
3612 (U64Value(1), vec![Key("array"), Index(1)]),
3613 (U64Value(2), vec![Key("array"), Index(2)]),
3614 (U64Value(3), vec![Key("array"), Index(3)]),
3615 (U64Value(4), vec![Key("array"), Index(4)]),
3616 (U64Value(5), vec![Key("array"), Index(5)]),
3617 (ArrayEnd, vec![Key("array")]),
3618 (ArrayStart, vec![Key("idents")]),
3619 (NullValue, vec![Key("idents"), Index(0)]),
3620 (BooleanValue(true), vec![Key("idents"), Index(1)]),
3621 (BooleanValue(false), vec![Key("idents"), Index(2)]),
3622 (ArrayEnd, vec![Key("idents")]),
3623 (ObjectEnd, vec![]),
3624 ]
3625 );
3626 }
3627 fn last_event(src: &str) -> JsonEvent {
3628 let mut parser = Parser::new(src.chars());
3629 let mut evt = NullValue;
3630 loop {
3631 evt = match parser.next() {
3632 Some(e) => e,
3633 None => return evt,
3634 }
3635 }
3636 }
3637
3638 #[test]
3639 #[cfg_attr(target_word_size = "32", ignore)] fn test_read_object_streaming() {
3641 assert_eq!(last_event("{ "), Error(SyntaxError(EOFWhileParsingObject, 1, 3)));
3642 assert_eq!(last_event("{1"), Error(SyntaxError(KeyMustBeAString, 1, 2)));
3643 assert_eq!(last_event("{ \"a\""), Error(SyntaxError(EOFWhileParsingObject, 1, 6)));
3644 assert_eq!(last_event("{\"a\""), Error(SyntaxError(EOFWhileParsingObject, 1, 5)));
3645 assert_eq!(last_event("{\"a\" "), Error(SyntaxError(EOFWhileParsingObject, 1, 6)));
3646
3647 assert_eq!(last_event("{\"a\" 1"), Error(SyntaxError(ExpectedColon, 1, 6)));
3648 assert_eq!(last_event("{\"a\":"), Error(SyntaxError(EOFWhileParsingValue, 1, 6)));
3649 assert_eq!(last_event("{\"a\":1"), Error(SyntaxError(EOFWhileParsingObject, 1, 7)));
3650 assert_eq!(last_event("{\"a\":1 1"), Error(SyntaxError(InvalidSyntax, 1, 8)));
3651 assert_eq!(last_event("{\"a\":1,"), Error(SyntaxError(EOFWhileParsingObject, 1, 8)));
3652 assert_eq!(last_event("{\"a\":1,}"), Error(SyntaxError(TrailingComma, 1, 8)));
3653
3654 assert_stream_equal(
3655 "{}",
3656 vec![(ObjectStart, vec![]), (ObjectEnd, vec![])]
3657 );
3658 assert_stream_equal(
3659 "{\"a\": 3}",
3660 vec![
3661 (ObjectStart, vec![]),
3662 (U64Value(3), vec![Key("a")]),
3663 (ObjectEnd, vec![]),
3664 ]
3665 );
3666 assert_stream_equal(
3667 "{ \"a\": null, \"b\" : true }",
3668 vec![
3669 (ObjectStart, vec![]),
3670 (NullValue, vec![Key("a")]),
3671 (BooleanValue(true), vec![Key("b")]),
3672 (ObjectEnd, vec![]),
3673 ]
3674 );
3675 assert_stream_equal(
3676 "{\"a\" : 1.0 ,\"b\": [ true ]}",
3677 vec![
3678 (ObjectStart, vec![]),
3679 (F64Value(1.0), vec![Key("a")]),
3680 (ArrayStart, vec![Key("b")]),
3681 (BooleanValue(true),vec![Key("b"), Index(0)]),
3682 (ArrayEnd, vec![Key("b")]),
3683 (ObjectEnd, vec![]),
3684 ]
3685 );
3686 assert_stream_equal(
3687 r#"{
3688 "a": 1.0,
3689 "b": [
3690 true,
3691 "foo\nbar",
3692 { "c": {"d": null} },
3693 "\uD834\uDF06"
3694 ]
3695 }"#,
3696 vec![
3697 (ObjectStart, vec![]),
3698 (F64Value(1.0), vec![Key("a")]),
3699 (ArrayStart, vec![Key("b")]),
3700 (BooleanValue(true), vec![Key("b"), Index(0)]),
3701 (StringValue("foo\nbar".to_string()), vec![Key("b"), Index(1)]),
3702 (ObjectStart, vec![Key("b"), Index(2)]),
3703 (ObjectStart, vec![Key("b"), Index(2), Key("c")]),
3704 (NullValue, vec![Key("b"), Index(2), Key("c"), Key("d")]),
3705 (ObjectEnd, vec![Key("b"), Index(2), Key("c")]),
3706 (ObjectEnd, vec![Key("b"), Index(2)]),
3707 (StringValue("\u{1D306}".to_string()), vec![Key("b"), Index(3)]),
3708 (ArrayEnd, vec![Key("b")]),
3709 (ObjectEnd, vec![]),
3710 ]
3711 );
3712 }
3713 #[test]
3714 #[cfg_attr(target_word_size = "32", ignore)] fn test_read_array_streaming() {
3716 assert_stream_equal(
3717 "[]",
3718 vec![
3719 (ArrayStart, vec![]),
3720 (ArrayEnd, vec![]),
3721 ]
3722 );
3723 assert_stream_equal(
3724 "[ ]",
3725 vec![
3726 (ArrayStart, vec![]),
3727 (ArrayEnd, vec![]),
3728 ]
3729 );
3730 assert_stream_equal(
3731 "[true]",
3732 vec![
3733 (ArrayStart, vec![]),
3734 (BooleanValue(true), vec![Index(0)]),
3735 (ArrayEnd, vec![]),
3736 ]
3737 );
3738 assert_stream_equal(
3739 "[ false ]",
3740 vec![
3741 (ArrayStart, vec![]),
3742 (BooleanValue(false), vec![Index(0)]),
3743 (ArrayEnd, vec![]),
3744 ]
3745 );
3746 assert_stream_equal(
3747 "[null]",
3748 vec![
3749 (ArrayStart, vec![]),
3750 (NullValue, vec![Index(0)]),
3751 (ArrayEnd, vec![]),
3752 ]
3753 );
3754 assert_stream_equal(
3755 "[3, 1]",
3756 vec![
3757 (ArrayStart, vec![]),
3758 (U64Value(3), vec![Index(0)]),
3759 (U64Value(1), vec![Index(1)]),
3760 (ArrayEnd, vec![]),
3761 ]
3762 );
3763 assert_stream_equal(
3764 "\n[3, 2]\n",
3765 vec![
3766 (ArrayStart, vec![]),
3767 (U64Value(3), vec![Index(0)]),
3768 (U64Value(2), vec![Index(1)]),
3769 (ArrayEnd, vec![]),
3770 ]
3771 );
3772 assert_stream_equal(
3773 "[2, [4, 1]]",
3774 vec![
3775 (ArrayStart, vec![]),
3776 (U64Value(2), vec![Index(0)]),
3777 (ArrayStart, vec![Index(1)]),
3778 (U64Value(4), vec![Index(1), Index(0)]),
3779 (U64Value(1), vec![Index(1), Index(1)]),
3780 (ArrayEnd, vec![Index(1)]),
3781 (ArrayEnd, vec![]),
3782 ]
3783 );
3784
3785 assert_eq!(last_event("["), Error(SyntaxError(EOFWhileParsingValue, 1, 2)));
3786
3787 assert_eq!(Json::from_str("["), Err(SyntaxError(EOFWhileParsingValue, 1, 2)));
3788 assert_eq!(Json::from_str("[1"), Err(SyntaxError(EOFWhileParsingArray, 1, 3)));
3789 assert_eq!(Json::from_str("[1,"), Err(SyntaxError(EOFWhileParsingValue, 1, 4)));
3790 assert_eq!(Json::from_str("[1,]"), Err(SyntaxError(InvalidSyntax, 1, 4)));
3791 assert_eq!(Json::from_str("[6 7]"), Err(SyntaxError(InvalidSyntax, 1, 4)));
3792
3793 }
3794 #[test]
3795 fn test_trailing_characters_streaming() {
3796 assert_eq!(last_event("nulla"), Error(SyntaxError(TrailingCharacters, 1, 5)));
3797 assert_eq!(last_event("truea"), Error(SyntaxError(TrailingCharacters, 1, 5)));
3798 assert_eq!(last_event("falsea"), Error(SyntaxError(TrailingCharacters, 1, 6)));
3799 assert_eq!(last_event("1a"), Error(SyntaxError(TrailingCharacters, 1, 2)));
3800 assert_eq!(last_event("[]a"), Error(SyntaxError(TrailingCharacters, 1, 3)));
3801 assert_eq!(last_event("{}a"), Error(SyntaxError(TrailingCharacters, 1, 3)));
3802 }
3803 #[test]
3804 fn test_read_identifiers_streaming() {
3805 assert_eq!(Parser::new("null".chars()).next(), Some(NullValue));
3806 assert_eq!(Parser::new("true".chars()).next(), Some(BooleanValue(true)));
3807 assert_eq!(Parser::new("false".chars()).next(), Some(BooleanValue(false)));
3808
3809 assert_eq!(last_event("n"), Error(SyntaxError(InvalidSyntax, 1, 2)));
3810 assert_eq!(last_event("nul"), Error(SyntaxError(InvalidSyntax, 1, 4)));
3811 assert_eq!(last_event("t"), Error(SyntaxError(InvalidSyntax, 1, 2)));
3812 assert_eq!(last_event("truz"), Error(SyntaxError(InvalidSyntax, 1, 4)));
3813 assert_eq!(last_event("f"), Error(SyntaxError(InvalidSyntax, 1, 2)));
3814 assert_eq!(last_event("faz"), Error(SyntaxError(InvalidSyntax, 1, 3)));
3815 }
3816
3817 #[test]
3818 fn test_stack() {
3819 let mut stack = Stack::new();
3820
3821 assert!(stack.is_empty());
3822 assert!(stack.len() == 0);
3823 assert!(!stack.last_is_index());
3824
3825 stack.push_index(0);
3826 stack.bump_index();
3827
3828 assert!(stack.len() == 1);
3829 assert!(stack.is_equal_to(&[Index(1)]));
3830 assert!(stack.starts_with(&[Index(1)]));
3831 assert!(stack.ends_with(&[Index(1)]));
3832 assert!(stack.last_is_index());
3833 assert!(stack.get(0) == Index(1));
3834
3835 stack.push_key("foo".to_string());
3836
3837 assert!(stack.len() == 2);
3838 assert!(stack.is_equal_to(&[Index(1), Key("foo")]));
3839 assert!(stack.starts_with(&[Index(1), Key("foo")]));
3840 assert!(stack.starts_with(&[Index(1)]));
3841 assert!(stack.ends_with(&[Index(1), Key("foo")]));
3842 assert!(stack.ends_with(&[Key("foo")]));
3843 assert!(!stack.last_is_index());
3844 assert!(stack.get(0) == Index(1));
3845 assert!(stack.get(1) == Key("foo"));
3846
3847 stack.push_key("bar".to_string());
3848
3849 assert!(stack.len() == 3);
3850 assert!(stack.is_equal_to(&[Index(1), Key("foo"), Key("bar")]));
3851 assert!(stack.starts_with(&[Index(1)]));
3852 assert!(stack.starts_with(&[Index(1), Key("foo")]));
3853 assert!(stack.starts_with(&[Index(1), Key("foo"), Key("bar")]));
3854 assert!(stack.ends_with(&[Key("bar")]));
3855 assert!(stack.ends_with(&[Key("foo"), Key("bar")]));
3856 assert!(stack.ends_with(&[Index(1), Key("foo"), Key("bar")]));
3857 assert!(!stack.last_is_index());
3858 assert!(stack.get(0) == Index(1));
3859 assert!(stack.get(1) == Key("foo"));
3860 assert!(stack.get(2) == Key("bar"));
3861
3862 stack.pop();
3863
3864 assert!(stack.len() == 2);
3865 assert!(stack.is_equal_to(&[Index(1), Key("foo")]));
3866 assert!(stack.starts_with(&[Index(1), Key("foo")]));
3867 assert!(stack.starts_with(&[Index(1)]));
3868 assert!(stack.ends_with(&[Index(1), Key("foo")]));
3869 assert!(stack.ends_with(&[Key("foo")]));
3870 assert!(!stack.last_is_index());
3871 assert!(stack.get(0) == Index(1));
3872 assert!(stack.get(1) == Key("foo"));
3873 }
3874
3875 #[test]
3876 fn test_to_json() {
3877 use std::collections::{HashMap,BTreeMap};
3878 use super::ToJson;
3879
3880 let array2 = Array(vec!(I64(1), I64(2)));
3881 let array3 = Array(vec!(I64(1), I64(2), I64(3)));
3882 let object = {
3883 let mut tree_map = BTreeMap::new();
3884 tree_map.insert("a".to_string(), U64(1));
3885 tree_map.insert("b".to_string(), U64(2));
3886 Object(tree_map)
3887 };
3888
3889 assert_eq!(array2.to_json(), array2);
3890 assert_eq!(object.to_json(), object);
3891 assert_eq!(3_isize.to_json(), I64(3));
3892 assert_eq!(4_i8.to_json(), I64(4));
3893 assert_eq!(5_i16.to_json(), I64(5));
3894 assert_eq!(6_i32.to_json(), I64(6));
3895 assert_eq!(7_i64.to_json(), I64(7));
3896 assert_eq!(8_usize.to_json(), U64(8));
3897 assert_eq!(9_u8.to_json(), U64(9));
3898 assert_eq!(10_u16.to_json(), U64(10));
3899 assert_eq!(11_u32.to_json(), U64(11));
3900 assert_eq!(12_u64.to_json(), U64(12));
3901 assert_eq!(13.0_f32.to_json(), F64(13.0_f64));
3902 assert_eq!(14.0_f64.to_json(), F64(14.0_f64));
3903 assert_eq!(().to_json(), Null);
3904 assert_eq!(f32::INFINITY.to_json(), Null);
3905 assert_eq!(f64::NAN.to_json(), Null);
3906 assert_eq!(true.to_json(), Boolean(true));
3907 assert_eq!(false.to_json(), Boolean(false));
3908 assert_eq!("abc".to_json(), String("abc".to_string()));
3909 assert_eq!("abc".to_string().to_json(), String("abc".to_string()));
3910 assert_eq!((1, 2).to_json(), array2);
3911 assert_eq!((1, 2, 3).to_json(), array3);
3912 assert_eq!([1, 2].to_json(), array2);
3913 assert_eq!((&[1, 2, 3]).to_json(), array3);
3914 assert_eq!((vec![1, 2]).to_json(), array2);
3915 assert_eq!(vec!(1, 2, 3).to_json(), array3);
3916 let mut tree_map = BTreeMap::new();
3917 tree_map.insert("a".to_string(), 1 as u32);
3918 tree_map.insert("b".to_string(), 2);
3919 assert_eq!(tree_map.to_json(), object);
3920 let mut hash_map = HashMap::new();
3921 hash_map.insert("a".to_string(), 1 as u32);
3922 hash_map.insert("b".to_string(), 2);
3923 assert_eq!(hash_map.to_json(), object);
3924 assert_eq!(Some(15).to_json(), I64(15));
3925 assert_eq!(Some(15 as u32).to_json(), U64(15));
3926 assert_eq!(None::<isize>.to_json(), Null);
3927 }
3928
3929 #[test]
3930 fn test_encode_hashmap_with_arbitrary_key() {
3931 use std::collections::HashMap;
3932 #[derive(PartialEq, Eq, Hash, RustcEncodable)]
3933 struct ArbitraryType(u32);
3934 let mut hm: HashMap<ArbitraryType, bool> = HashMap::new();
3935 hm.insert(ArbitraryType(1), true);
3936 let mut mem_buf = string::String::new();
3937 let mut encoder = Encoder::new(&mut mem_buf);
3938 let result = hm.encode(&mut encoder);
3939 match result.err().unwrap() {
3940 EncoderError::BadHashmapKey => (),
3941 _ => panic!("expected bad hash map key")
3942 }
3943 }
3944
3945 #[test]
3946 fn test_encode_decode_phantom_data() {
3947 use std::marker::PhantomData;
3948
3949 #[derive(Debug, RustcDecodable, RustcEncodable, Eq, PartialEq)]
3950 struct Foo<P> {
3951 phantom_data: PhantomData<P>
3952 }
3953
3954 let f: Foo<u8> = Foo {
3955 phantom_data: PhantomData
3956 };
3957 let s = super::encode(&f).unwrap();
3958 let d: Foo<u8> = super::decode(&s).unwrap();
3959 assert_eq!(f, d);
3960 }
3961
3962 #[test]
3963 fn test_bad_json_stack_depleted() {
3964 use json;
3965 #[derive(Debug, RustcDecodable)]
3966 enum ChatEvent {
3967 Variant(i32)
3968 }
3969 let serialized = "{\"variant\": \"Variant\", \"fields\": []}";
3970 let r: Result<ChatEvent, _> = json::decode(serialized);
3971 assert!(r.unwrap_err() == EOF);
3972 }
3973
3974 #[test]
3975 fn fixed_length_array() {
3976 #[derive(Debug, RustcDecodable, RustcEncodable, Eq, PartialEq)]
3977 struct Foo {
3978 a: [u8; 1],
3979 b: [i32; 2],
3980 c: [u64; 3],
3981 }
3982 let f = Foo {
3983 a: [0],
3984 b: [1, 2],
3985 c: [3, 4, 5],
3986 };
3987 let s = super::encode(&f).unwrap();
3988 let d = super::decode(&s).unwrap();
3989 assert_eq!(f, d);
3990 }
3991
3992 #[test]
3993 fn test_unexpected_token() {
3994 match Json::from_str("{\"\":\"\",\"\":{\"\":\"\",\"\":[{\"\":\"\",}}}") {
3995 Err(e) => assert_eq!(e, SyntaxError(InvalidSyntax, 1, 32)),
3996 _ => ()
3997 };
3998 }
3999}