rustc_serialize/
json.rs

1// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT
2// file at the top-level directory of this distribution and at
3// http://rust-lang.org/COPYRIGHT.
4//
5// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8// option. This file may not be copied, modified, or distributed
9// except according to those terms.
10
11// Rust JSON serialization library
12// Copyright (c) 2011 Google Inc.
13
14//! JSON parsing and serialization
15//!
16//! # What is JSON?
17//!
18//! JSON (JavaScript Object Notation) is a way to write data in Javascript.
19//! Like XML, it allows encoding structured data in a text format that can be
20//! easily read by humans. Its simple syntax and native compatibility with
21//! JavaScript have made it a widely used format.
22//!
23//! Data types that can be encoded are JavaScript types (see the `Json` enum
24//! for more details):
25//!
26//! * `I64`: equivalent to rust's `i64`
27//! * `U64`: equivalent to rust's `u64`
28//! * `F64`: equivalent to rust's `f64`
29//! * `Boolean`: equivalent to rust's `bool`
30//! * `String`: equivalent to rust's `String`
31//! * `Array`: equivalent to rust's `Vec<T>`, but also allowing objects of
32//!   different types in the
33//!   same array
34//! * `Object`: equivalent to rust's `BTreeMap<String, json::Json>`
35//! * `Null`
36//!
37//! An object is a series of string keys mapping to values, in `"key": value`
38//! format.  Arrays are enclosed in square brackets ([ ... ]) and objects in
39//! curly brackets ({ ... }).  A simple JSON document encoding a person,
40//! their age, address and phone numbers could look like
41//!
42//! ```ignore
43//! {
44//!     "FirstName": "John",
45//!     "LastName": "Doe",
46//!     "Age": 43,
47//!     "Address": {
48//!         "Street": "Downing Street 10",
49//!         "City": "London",
50//!         "Country": "Great Britain"
51//!     },
52//!     "PhoneNumbers": [
53//!         "+44 1234567",
54//!         "+44 2345678"
55//!     ]
56//! }
57//! ```
58//!
59//! # Rust Type-based Encoding and Decoding
60//!
61//! Rust provides a mechanism for low boilerplate encoding & decoding of values
62//! to and from JSON via the serialization API.  To be able to encode a piece
63//! of data, it must implement the `rustc_serialize::Encodable` trait.  To be
64//! able to decode a piece of data, it must implement the
65//! `rustc_serialize::Decodable` trait.  The Rust compiler provides an
66//! annotation to automatically generate the code for these traits:
67//! `#[derive(RustcDecodable, RustcEncodable)]`
68//!
69//! The JSON API provides an enum `json::Json` and a trait `ToJson` to encode
70//! objects.  The `ToJson` trait provides a `to_json` method to convert an
71//! object into a `json::Json` value.  A `json::Json` value can be encoded as a
72//! string or buffer using the functions described above.  You can also use the
73//! `json::Encoder` object, which implements the `Encoder` trait.
74//!
75//! When using `ToJson`, the `Encodable` trait implementation is not
76//! mandatory.
77//!
78//! # Examples of use
79//!
80//! ## Using Autoserialization
81//!
82//! Create a struct called `TestStruct` and serialize and deserialize it to and
83//! from JSON using the serialization API, using the derived serialization code.
84//!
85//! ```rust
86//! extern crate rustc_serialize;
87//! use rustc_serialize::json;
88//!
89//! // Automatically generate `RustcDecodable` and `RustcEncodable` trait
90//! // implementations
91//! #[derive(RustcDecodable, RustcEncodable)]
92//! pub struct TestStruct  {
93//!     data_int: u8,
94//!     data_str: String,
95//!     data_vector: Vec<u8>,
96//! }
97//!
98//! fn main() {
99//!     let object = TestStruct {
100//!         data_int: 1,
101//!         data_str: "homura".to_string(),
102//!         data_vector: vec![2,3,4,5],
103//!     };
104//!
105//!     // Serialize using `json::encode`
106//!     let encoded = json::encode(&object).unwrap();
107//!
108//!     // Deserialize using `json::decode`
109//!     let decoded: TestStruct = json::decode(&encoded).unwrap();
110//! }
111//! ```
112//!
113//! ## Using the `ToJson` trait
114//!
115//! The examples below use the `ToJson` trait to generate the JSON string,
116//! which is required for custom mappings.
117//!
118//! ### Simple example of `ToJson` usage
119//!
120//! ```rust
121//! extern crate rustc_serialize;
122//! use rustc_serialize::json::{self, ToJson, Json};
123//!
124//! // A custom data structure
125//! struct ComplexNum {
126//!     a: f64,
127//!     b: f64,
128//! }
129//!
130//! // JSON value representation
131//! impl ToJson for ComplexNum {
132//!     fn to_json(&self) -> Json {
133//!         Json::String(format!("{}+{}i", self.a, self.b))
134//!     }
135//! }
136//!
137//! // Only generate `RustcEncodable` trait implementation
138//! #[derive(RustcEncodable)]
139//! pub struct ComplexNumRecord {
140//!     uid: u8,
141//!     dsc: String,
142//!     val: Json,
143//! }
144//!
145//! fn main() {
146//!     let num = ComplexNum { a: 0.0001, b: 12.539 };
147//!     let data: String = json::encode(&ComplexNumRecord{
148//!         uid: 1,
149//!         dsc: "test".to_string(),
150//!         val: num.to_json(),
151//!     }).unwrap();
152//!     println!("data: {}", data);
153//!     // data: {"uid":1,"dsc":"test","val":"0.0001+12.539i"};
154//! }
155//! ```
156//!
157//! ### Verbose example of `ToJson` usage
158//!
159//! ```rust
160//! extern crate rustc_serialize;
161//! use std::collections::BTreeMap;
162//! use rustc_serialize::json::{self, Json, ToJson};
163//!
164//! // Only generate `Decodable` trait implementation
165//! #[derive(RustcDecodable)]
166//! pub struct TestStruct {
167//!     data_int: u8,
168//!     data_str: String,
169//!     data_vector: Vec<u8>,
170//! }
171//!
172//! // Specify encoding method manually
173//! impl ToJson for TestStruct {
174//!     fn to_json(&self) -> Json {
175//!         let mut d = BTreeMap::new();
176//!         // All standard types implement `to_json()`, so use it
177//!         d.insert("data_int".to_string(), self.data_int.to_json());
178//!         d.insert("data_str".to_string(), self.data_str.to_json());
179//!         d.insert("data_vector".to_string(), self.data_vector.to_json());
180//!         Json::Object(d)
181//!     }
182//! }
183//!
184//! fn main() {
185//!     // Serialize using `ToJson`
186//!     let input_data = TestStruct {
187//!         data_int: 1,
188//!         data_str: "madoka".to_string(),
189//!         data_vector: vec![2,3,4,5],
190//!     };
191//!     let json_obj: Json = input_data.to_json();
192//!     let json_str: String = json_obj.to_string();
193//!
194//!     // Deserialize like before
195//!     let decoded: TestStruct = json::decode(&json_str).unwrap();
196//! }
197//! ```
198//!
199//! ## Parsing a `str` to `Json` and reading the result
200//!
201//! ```rust
202//! extern crate rustc_serialize;
203//! use rustc_serialize::json::Json;
204//!
205//! fn main() {
206//!     let data = Json::from_str("{\"foo\": 13, \"bar\": \"baz\"}").unwrap();
207//!     println!("data: {}", data);
208//!     // data: {"bar":"baz","foo":13}
209//!     println!("object? {}", data.is_object());
210//!     // object? true
211//!
212//!     let obj = data.as_object().unwrap();
213//!     let foo = obj.get("foo").unwrap();
214//!
215//!     println!("array? {:?}", foo.as_array());
216//!     // array? None
217//!     println!("u64? {:?}", foo.as_u64());
218//!     // u64? Some(13u64)
219//!
220//!     for (key, value) in obj.iter() {
221//!         println!("{}: {}", key, match *value {
222//!             Json::U64(v) => format!("{} (u64)", v),
223//!             Json::String(ref v) => format!("{} (string)", v),
224//!             _ => format!("other")
225//!         });
226//!     }
227//!     // bar: baz (string)
228//!     // foo: 13 (u64)
229//! }
230//! ```
231//!
232//! # The status of this library
233//!
234//! While this library is the standard way of working with JSON in Rust,
235//! there is a next-generation library called Serde that's in the works (it's
236//! faster, overcomes some design limitations of rustc-serialize and has more
237//! features). You might consider using it when starting a new project or
238//! evaluating Rust JSON performance.
239
240use 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/// Represents a json value
260#[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/// The errors that can arise while parsing a JSON stream.
281#[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    /// msg, line, col
306    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
321// Builder and Parser have the same errors.
322pub 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
354/// Returns a readable error string for a given error code.
355pub 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
378/// Shortcut function to decode a JSON `&str` into an object
379pub 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
389/// Shortcut function to encode a `T` into a JSON `String`
390pub 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
576/// A structure for implementing serialization to JSON.
577pub 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    /// Creates a new encoder whose output will be written in human-readable
585    /// JSON to the specified writer
586    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    /// Creates a new encoder whose output will be written in compact
598    /// JSON to the specified writer
599    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    /// Set the number of spaces to indent for each level.
608    /// This is safe to set during encoding.
609    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            // self.indent very well could be 0 so we need to use checked division.
612            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        // enums are encoded as strings or objects
682        // Bunny => "Bunny"
683        // Kangaroo(34,"William") => {"variant": "Kangaroo", "fields": [34,"William"]}
684        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
945/// Create an `AsJson` wrapper which can be used to print a value as JSON
946/// on-the-fly via `write!`
947pub fn as_json<T: Encodable>(t: &T) -> AsJson<T> {
948    AsJson { inner: t }
949}
950
951/// Create an `AsPrettyJson` wrapper which can be used to print a value as JSON
952/// on-the-fly via `write!`
953pub fn as_pretty_json<T: Encodable>(t: &T) -> AsPrettyJson<T> {
954    AsPrettyJson { inner: t, indent: None }
955}
956
957impl Json {
958    /// Decodes a json value from an `&mut io::Read`
959    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    /// Decodes a json value from a string
974    pub fn from_str(s: &str) -> Result<Self, BuilderError> {
975        let mut builder = Builder::new(s.chars());
976        builder.build()
977    }
978
979    /// Borrow this json object as a pretty object to generate a pretty
980    /// representation for it via `Display`.
981    pub fn pretty(&self) -> PrettyJson {
982        PrettyJson { inner: self }
983    }
984
985     /// If the Json value is an Object, returns the value associated with the provided key.
986    /// Otherwise, returns None.
987    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    /// Attempts to get a nested Json Object for each key in `keys`.
995    /// If any key is found not to exist, find_path will return None.
996    /// Otherwise, it will return the Json value associated with the final key.
997    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    /// If the Json value is an Object, performs a depth-first search until
1009    /// a value associated with the provided key is found. If no value is found
1010    /// or the Json value is not an Object, returns None.
1011    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    /// Returns true if the Json value is an Object. Returns false otherwise.
1032    pub fn is_object<'a>(&'a self) -> bool {
1033        self.as_object().is_some()
1034    }
1035
1036    /// If the Json value is an Object, returns a reference to the associated BTreeMap.
1037    /// Returns None otherwise.
1038    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    /// If the Json value is an Object, returns a mutable reference to the associated BTreeMap.
1046    /// Returns None otherwise.
1047    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    /// If the Json value is an Object, returns the associated BTreeMap.
1055    /// Returns None otherwise.
1056    pub fn into_object(self) -> Option<Object> {
1057        match self {
1058            Json::Object(map) => Some(map),
1059            _ => None
1060        }
1061    }
1062
1063    /// Returns true if the Json value is an Array. Returns false otherwise.
1064    pub fn is_array<'a>(&'a self) -> bool {
1065        self.as_array().is_some()
1066    }
1067
1068    /// If the Json value is an Array, returns a reference to the associated vector.
1069    /// Returns None otherwise.
1070    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    /// If the Json value is an Array, returns a mutable reference to the associated vector.
1078    /// Returns None otherwise.
1079    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    /// If the Json value is an Array, returns the associated vector.
1087    /// Returns None otherwise.
1088    pub fn into_array(self) -> Option<Array> {
1089        match self {
1090            Json::Array(array) => Some(array),
1091            _ => None
1092        }
1093    }
1094
1095    /// Returns true if the Json value is a String. Returns false otherwise.
1096    pub fn is_string<'a>(&'a self) -> bool {
1097        self.as_string().is_some()
1098    }
1099
1100    /// If the Json value is a String, returns the associated str.
1101    /// Returns None otherwise.
1102    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    /// Returns true if the Json value is a Number. Returns false otherwise.
1110    pub fn is_number(&self) -> bool {
1111        match *self {
1112            Json::I64(_) | Json::U64(_) | Json::F64(_) => true,
1113            _ => false,
1114        }
1115    }
1116
1117    /// Returns true if the Json value is a i64. Returns false otherwise.
1118    pub fn is_i64(&self) -> bool {
1119        match *self {
1120            Json::I64(_) => true,
1121            _ => false,
1122        }
1123    }
1124
1125    /// Returns true if the Json value is a u64. Returns false otherwise.
1126    pub fn is_u64(&self) -> bool {
1127        match *self {
1128            Json::U64(_) => true,
1129            _ => false,
1130        }
1131    }
1132
1133    /// Returns true if the Json value is a f64. Returns false otherwise.
1134    pub fn is_f64(&self) -> bool {
1135        match *self {
1136            Json::F64(_) => true,
1137            _ => false,
1138        }
1139    }
1140
1141    /// If the Json value is a number, return or cast it to a i64.
1142    /// Returns None otherwise.
1143    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    /// If the Json value is a number, return or cast it to a u64.
1153    /// Returns None otherwise.
1154    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    /// If the Json value is a number, return or cast it to a f64.
1163    /// Returns None otherwise.
1164    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    /// Returns true if the Json value is a Boolean. Returns false otherwise.
1174    pub fn is_boolean(&self) -> bool {
1175        self.as_boolean().is_some()
1176    }
1177
1178    /// If the Json value is a Boolean, returns the associated bool.
1179    /// Returns None otherwise.
1180    pub fn as_boolean(&self) -> Option<bool> {
1181        match self {
1182            &Json::Boolean(b) => Some(b),
1183            _ => None
1184        }
1185    }
1186
1187    /// Returns true if the Json value is a Null. Returns false otherwise.
1188    pub fn is_null(&self) -> bool {
1189        self.as_null().is_some()
1190    }
1191
1192    /// If the Json value is a Null, returns ().
1193    /// Returns None otherwise.
1194    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/// The output of the streaming parser.
1222#[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    // Parse a value in an array, true means first element.
1240    ParseArray(bool),
1241    // Parse ',' or ']' after an element in an array.
1242    ParseArrayComma,
1243    // Parse a key:value in an object, true means first element.
1244    ParseObject(bool),
1245    // Parse ',' or ']' after an element in an object.
1246    ParseObjectComma,
1247    // Initial state.
1248    ParseStart,
1249    // Expecting the stream to end.
1250    ParseBeforeFinish,
1251    // Parsing can't continue.
1252    ParseFinished,
1253}
1254
1255/// A Stack represents the current position of the parser in the logical
1256/// structure of the JSON stream.
1257/// For example foo.bar[3].x
1258pub struct Stack {
1259    stack: Vec<InternalStackElement>,
1260    str_buffer: Vec<u8>,
1261}
1262
1263/// StackElements compose a Stack.
1264/// For example, Key("foo"), Key("bar"), Index(3) and Key("x") are the
1265/// StackElements compositing the stack that represents foo.bar[3].x
1266#[derive(PartialEq, Clone, Debug)]
1267pub enum StackElement<'l> {
1268    Index(u32),
1269    Key(&'l str),
1270}
1271
1272// Internally, Key elements are stored as indices in a buffer to avoid
1273// allocating a string for every member of an object.
1274#[derive(PartialEq, Clone, Debug)]
1275enum InternalStackElement {
1276    InternalIndex(u32),
1277    InternalKey(u16, u16), // start, size
1278}
1279
1280impl Stack {
1281    pub fn new() -> Stack {
1282        Stack { stack: Vec::new(), str_buffer: Vec::new() }
1283    }
1284
1285    /// Returns The number of elements in the Stack.
1286    pub fn len(&self) -> usize { self.stack.len() }
1287
1288    /// Returns true if the stack is empty.
1289    pub fn is_empty(&self) -> bool { self.stack.is_empty() }
1290
1291    /// Provides access to the StackElement at a given index.
1292    /// lower indices are at the bottom of the stack while higher indices are
1293    /// at the top.
1294    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    /// Compares this stack with an array of StackElements.
1305    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    /// Returns true if the bottom-most elements of this stack are the same as
1314    /// the ones passed as parameter.
1315    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    /// Returns true if the top-most elements of this stack are the same as
1324    /// the ones passed as parameter.
1325    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    /// Returns the top-most element (if any).
1335    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    // Used by Parser to insert Key elements at the top of the stack.
1348    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    // Used by Parser to insert Index elements at the top of the stack.
1356    fn push_index(&mut self, index: u32) {
1357        self.stack.push(InternalIndex(index));
1358    }
1359
1360    // Used by Parser to remove the top-most element of the stack.
1361    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    // Used by Parser to test whether the top-most element is an index.
1374    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    // Used by Parser to increment the index of the top-most element.
1383    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
1393/// A streaming JSON parser implemented as an iterator of JsonEvent, consuming
1394/// an iterator of char.
1395pub struct Parser<T> {
1396    rdr: T,
1397    ch: Option<char>,
1398    line: usize,
1399    col: usize,
1400    // We maintain a stack representing where we are in the logical structure
1401    // of the JSON stream.
1402    stack: Stack,
1403    // A state machine is kept to make it possible to interrupt and resume parsing.
1404    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            // Make sure there is no trailing characters.
1418            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    /// Creates the JSON parser.
1432    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    /// Provides access to the current position in the logical structure of the
1446    /// JSON stream.
1447    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                // Make sure we don't underflow.
1521                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                // A leading '0' must be the only digit before the decimal point.
1542                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        // Make sure a digit follows the decimal place.
1578        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        // Make sure a digit follows the exponent place.
1615        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                        // Non-BMP characters are encoded as a sequence of
1685                        // two hex escapes, representing UTF-16 surrogates.
1686                        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    // Invoked at each iteration, consumes the stream until it has enough
1727    // information to return a JsonEvent.
1728    // Manages an internal state so that parsing can be interrupted and resumed.
1729    // Also keeps track of the position in the logical structure of the json
1730    // stream int the form of a stack that can be queried by the user using the
1731    // stack() method.
1732    fn parse(&mut self) -> JsonEvent {
1733        loop {
1734            // The only paths where the loop can spin a new iteration
1735            // are in the cases ParseArrayComma and ParseObjectComma if ','
1736            // is parsed. In these cases the state is set to (respectively)
1737            // ParseArray(false) and ParseObject(false), which always return,
1738            // so there is no risk of getting stuck in an infinite loop.
1739            // All other paths return before the end of the loop's iteration.
1740            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
1948/// A Builder consumes a json::Parser to create a generic Json structure.
1949pub struct Builder<T> {
1950    parser: Parser<T>,
1951    token: Option<JsonEvent>,
1952}
1953
1954impl<T: Iterator<Item = char>> Builder<T> {
1955    /// Create a JSON Builder.
1956    pub fn new(src: T) -> Builder<T> {
1957        Builder { parser: Parser::new(src), token: None, }
1958    }
1959
1960    // Decode a Json value from a Parser.
1961    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
2040/// A structure to decode JSON to values in rust.
2041pub struct Decoder {
2042    stack: Vec<Json>,
2043}
2044
2045impl Decoder {
2046    /// Creates a new decoder instance for decoding the specified JSON value.
2047    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                // re: #12967.. a type w/ numeric keys (ie HashMap<usize, V> etc)
2105                // is going to have a string here, as per JSON spec.
2106                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                // re: #12967.. a type w/ numeric keys (ie HashMap<usize, V> etc)
2147                // is going to have a string here, as per JSON spec.
2148                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                // exactly one character
2168                (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                // Add a Null and try to parse it as an Option<_>
2270                // to get None as a default value.
2271                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
2378/// A trait for converting values to JSON
2379pub trait ToJson {
2380    /// Converts the value of `self` to an instance of JSON
2381    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    // use variables to indicate the arity of the tuple
2441    ($($tyvar:ident),* ) => {
2442        // the trailing commas are for the 1 tuple
2443        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    /// Encodes a json value into a string
2523    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    /// Encodes a json value into a string
2535    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    /// Encodes a json value into a string
2547    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    /// Set the indentation level for the emitted JSON
2559    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    /// Encodes a json value into a string
2567    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            // unwrap cannot panic for pretty encoders
2572            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        // We can't compare the strings directly because the object fields be
2824        // printed in a different order.
2825        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        // Only C0 control characters are excluded.
3015        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            _ => {} // it parsed and we are good to go
3471        }
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            _ => {} // it parsed and we are good to go
3488        }
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            // The following layout below should look a lot like
3502            // the pretty-printed JSON (indent * x)
3503            vec!
3504            ( // 0x
3505                String("greetings".to_string()), // 1x
3506                Object(tree), // 1x + 2x + 2x + 1x
3507            ) // 0x
3508            // End JSON array (7 lines)
3509        );
3510
3511        // Helper function for counting indents
3512        fn indents(source: &str) -> usize {
3513            let trimmed = source.trim_left_matches(' ');
3514            source.len() - trimmed.len()
3515        }
3516
3517        // Test up to 4 spaces of indents (more?)
3518        for i in 0..4 {
3519            let printed = super::as_pretty_json(&json).indent(i as u32)
3520                                .to_string();
3521
3522            // Check for indents at each line
3523            let lines: Vec<&str> = printed.lines().collect();
3524            assert_eq!(lines.len(), 7); // JSON should be 7 lines
3525
3526            assert_eq!(indents(lines[0]), 0 * i); // [
3527            assert_eq!(indents(lines[1]), 1 * i); //   "greetings",
3528            assert_eq!(indents(lines[2]), 1 * i); //   {
3529            assert_eq!(indents(lines[3]), 2 * i); //     "hello": "guten tag",
3530            assert_eq!(indents(lines[4]), 2 * i); //     "goodbye": "sayonara"
3531            assert_eq!(indents(lines[5]), 1 * i); //   },
3532            assert_eq!(indents(lines[6]), 0 * i); // ]
3533
3534            // Finally, test that the pretty-printed JSON is valid
3535            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)] // FIXME(#14064)
3604    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)] // FIXME(#14064)
3640    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)] // FIXME(#14064)
3715    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}