json.rs 133.0 KB
Newer Older
M
mrec 已提交
1
// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT
2 3 4 5 6 7 8 9 10
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

E
Elly Jones 已提交
11 12
// Rust JSON serialization library
// Copyright (c) 2011 Google Inc.
13

14
#![forbid(non_camel_case_types)]
A
Aaron Turon 已提交
15
#![allow(missing_docs)]
E
Elly Jones 已提交
16

S
Steve Klabnik 已提交
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
//! JSON parsing and serialization
//!
//! # What is JSON?
//!
//! JSON (JavaScript Object Notation) is a way to write data in Javascript.
//! Like XML, it allows to encode structured data in a text format that can be easily read by humans
//! Its simple syntax and native compatibility with JavaScript have made it a widely used format.
//!
//! Data types that can be encoded are JavaScript types (see the `Json` enum for more details):
//!
//! * `Boolean`: equivalent to rust's `bool`
//! * `Number`: equivalent to rust's `f64`
//! * `String`: equivalent to rust's `String`
//! * `Array`: equivalent to rust's `Vec<T>`, but also allowing objects of different types in the
//!   same array
B
Brian J Brennan 已提交
32
//! * `Object`: equivalent to rust's `BTreeMap<String, json::Json>`
S
Steve Klabnik 已提交
33 34 35 36
//! * `Null`
//!
//! An object is a series of string keys mapping to values, in `"key": value` format.
//! Arrays are enclosed in square brackets ([ ... ]) and objects in curly brackets ({ ... }).
37
//! A simple JSON document encoding a person, their age, address and phone numbers could look like
S
Steve Klabnik 已提交
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
//!
//! ```ignore
//! {
//!     "FirstName": "John",
//!     "LastName": "Doe",
//!     "Age": 43,
//!     "Address": {
//!         "Street": "Downing Street 10",
//!         "City": "London",
//!         "Country": "Great Britain"
//!     },
//!     "PhoneNumbers": [
//!         "+44 1234567",
//!         "+44 2345678"
//!     ]
//! }
//! ```
//!
//! # Rust Type-based Encoding and Decoding
//!
//! Rust provides a mechanism for low boilerplate encoding & decoding of values to and from JSON via
//! the serialization API.
60 61
//! To be able to encode a piece of data, it must implement the `serialize::RustcEncodable` trait.
//! To be able to decode a piece of data, it must implement the `serialize::RustcDecodable` trait.
S
Steve Klabnik 已提交
62
//! The Rust compiler provides an annotation to automatically generate the code for these traits:
63
//! `#[derive(RustcDecodable, RustcEncodable)]`
S
Steve Klabnik 已提交
64 65 66 67 68 69
//!
//! The JSON API provides an enum `json::Json` and a trait `ToJson` to encode objects.
//! The `ToJson` trait provides a `to_json` method to convert an object into a `json::Json` value.
//! A `json::Json` value can be encoded as a string or buffer using the functions described above.
//! You can also use the `json::Encoder` object, which implements the `Encoder` trait.
//!
70
//! When using `ToJson` the `RustcEncodable` trait implementation is not mandatory.
S
Steve Klabnik 已提交
71 72 73 74 75 76 77 78
//!
//! # Examples of use
//!
//! ## Using Autoserialization
//!
//! Create a struct called `TestStruct` and serialize and deserialize it to and from JSON using the
//! serialization API, using the derived serialization code.
//!
79 80
//! ```notrust
//! // FIXME(#19470): this cannot be ```rust``` because it fails orphan checking at the moment
S
Steve Klabnik 已提交
81 82 83 84
//! extern crate serialize;
//! use serialize::json;
//!
//! // Automatically generate `Decodable` and `Encodable` trait implementations
85
//! #[derive(RustcDecodable, RustcEncodable)]
S
Steve Klabnik 已提交
86 87 88 89 90 91 92 93 94
//! pub struct TestStruct  {
//!     data_int: u8,
//!     data_str: String,
//!     data_vector: Vec<u8>,
//! }
//!
//! fn main() {
//!     let object = TestStruct {
//!         data_int: 1,
B
Barosl Lee 已提交
95
//!         data_str: "homura".to_string(),
S
Steve Klabnik 已提交
96 97 98 99
//!         data_vector: vec![2,3,4,5],
//!     };
//!
//!     // Serialize using `json::encode`
100
//!     let encoded = json::encode(&object).unwrap();
S
Steve Klabnik 已提交
101 102 103 104 105 106 107 108 109 110 111 112 113
//!
//!     // Deserialize using `json::decode`
//!     let decoded: TestStruct = json::decode(encoded.as_slice()).unwrap();
//! }
//! ```
//!
//! ## Using the `ToJson` trait
//!
//! The examples above use the `ToJson` trait to generate the JSON string, which is required
//! for custom mappings.
//!
//! ### Simple example of `ToJson` usage
//!
114 115
//! ```notrust
//! // FIXME(#19470): this cannot be ```rust``` because it fails orphan checking at the moment
S
Steve Klabnik 已提交
116
//! extern crate serialize;
117
//! use serialize::json::{self, ToJson, Json};
S
Steve Klabnik 已提交
118 119 120 121 122 123 124 125 126
//!
//! // A custom data structure
//! struct ComplexNum {
//!     a: f64,
//!     b: f64,
//! }
//!
//! // JSON value representation
//! impl ToJson for ComplexNum {
127 128
//!     fn to_json(&self) -> Json {
//!         Json::String(format!("{}+{}i", self.a, self.b))
S
Steve Klabnik 已提交
129 130 131
//!     }
//! }
//!
132
//! // Only generate `RustcEncodable` trait implementation
133
//! #[derive(Encodable)]
S
Steve Klabnik 已提交
134 135 136
//! pub struct ComplexNumRecord {
//!     uid: u8,
//!     dsc: String,
137
//!     val: Json,
S
Steve Klabnik 已提交
138 139 140 141 142 143 144 145
//! }
//!
//! fn main() {
//!     let num = ComplexNum { a: 0.0001, b: 12.539 };
//!     let data: String = json::encode(&ComplexNumRecord{
//!         uid: 1,
//!         dsc: "test".to_string(),
//!         val: num.to_json(),
146
//!     }).unwrap();
S
Steve Klabnik 已提交
147 148 149 150 151 152 153
//!     println!("data: {}", data);
//!     // data: {"uid":1,"dsc":"test","val":"0.0001+12.539j"};
//! }
//! ```
//!
//! ### Verbose example of `ToJson` usage
//!
154 155
//! ```notrust
//! // FIXME(#19470): this cannot be ```rust``` because it fails orphan checking at the moment
S
Steve Klabnik 已提交
156
//! extern crate serialize;
A
Alexis Beingessner 已提交
157
//! use std::collections::BTreeMap;
158
//! use serialize::json::{self, Json, ToJson};
S
Steve Klabnik 已提交
159 160
//!
//! // Only generate `Decodable` trait implementation
161
//! #[derive(Decodable)]
S
Steve Klabnik 已提交
162 163 164 165 166 167 168 169
//! pub struct TestStruct {
//!     data_int: u8,
//!     data_str: String,
//!     data_vector: Vec<u8>,
//! }
//!
//! // Specify encoding method manually
//! impl ToJson for TestStruct {
170
//!     fn to_json(&self) -> Json {
A
Alexis Beingessner 已提交
171
//!         let mut d = BTreeMap::new();
S
Steve Klabnik 已提交
172 173 174 175
//!         // All standard types implement `to_json()`, so use it
//!         d.insert("data_int".to_string(), self.data_int.to_json());
//!         d.insert("data_str".to_string(), self.data_str.to_json());
//!         d.insert("data_vector".to_string(), self.data_vector.to_json());
176
//!         Json::Object(d)
S
Steve Klabnik 已提交
177 178 179 180 181 182 183
//!     }
//! }
//!
//! fn main() {
//!     // Serialize using `ToJson`
//!     let input_data = TestStruct {
//!         data_int: 1,
B
Barosl Lee 已提交
184
//!         data_str: "madoka".to_string(),
S
Steve Klabnik 已提交
185 186
//!         data_vector: vec![2,3,4,5],
//!     };
187
//!     let json_obj: Json = input_data.to_json();
S
Steve Klabnik 已提交
188 189 190 191 192 193
//!     let json_str: String = json_obj.to_string();
//!
//!     // Deserialize like before
//!     let decoded: TestStruct = json::decode(json_str.as_slice()).unwrap();
//! }
//! ```
B
Brian Anderson 已提交
194

195 196 197 198
use self::JsonEvent::*;
use self::ErrorCode::*;
use self::ParserError::*;
use self::DecoderError::*;
S
Steven Fackler 已提交
199 200 201
use self::ParserState::*;
use self::InternalStackElement::*;

A
Adolfo Ochagavía 已提交
202
use std;
A
Alexis Beingessner 已提交
203
use std::collections::{HashMap, BTreeMap};
A
Alex Crichton 已提交
204
use std::{char, f64, fmt, old_io, num, str};
205
use std::mem::{swap};
T
Tobias Bucher 已提交
206 207 208
use std::num::{Float, Int};
use std::num::FpCategory as Fp;
use std::str::FromStr;
209
use std::string;
210
use std::ops::Index;
A
Alex Crichton 已提交
211 212
use unicode::str as unicode_str;
use unicode::str::Utf16Item;
213

A
Alex Crichton 已提交
214
use Encodable;
E
Elly Jones 已提交
215

216
/// Represents a json value
J
Jorge Aparicio 已提交
217
#[derive(Clone, PartialEq, PartialOrd, Debug)]
218
pub enum Json {
219 220 221
    I64(i64),
    U64(u64),
    F64(f64),
222
    String(string::String),
B
Ben Striegel 已提交
223
    Boolean(bool),
224 225
    Array(self::Array),
    Object(self::Object),
B
Ben Striegel 已提交
226
    Null,
E
Elly Jones 已提交
227 228
}

229
pub type Array = Vec<Json>;
A
Alexis Beingessner 已提交
230
pub type Object = BTreeMap<string::String, Json>;
231

232 233 234 235 236
pub struct PrettyJson<'a> { inner: &'a Json }

pub struct AsJson<'a, T: 'a> { inner: &'a T }
pub struct AsPrettyJson<'a, T: 'a> { inner: &'a T, indent: Option<uint> }

237
/// The errors that can arise while parsing a JSON stream.
J
Jorge Aparicio 已提交
238
#[derive(Clone, Copy, PartialEq, Debug)]
239 240 241 242
pub enum ErrorCode {
    InvalidSyntax,
    InvalidNumber,
    EOFWhileParsingObject,
C
Corey Farwell 已提交
243
    EOFWhileParsingArray,
244 245 246 247 248
    EOFWhileParsingValue,
    EOFWhileParsingString,
    KeyMustBeAString,
    ExpectedColon,
    TrailingCharacters,
249
    TrailingComma,
250 251 252 253 254 255 256 257 258
    InvalidEscape,
    InvalidUnicodeCodePoint,
    LoneLeadingSurrogateInHexEscape,
    UnexpectedEndOfHexEscape,
    UnrecognizedHex,
    NotFourDigit,
    NotUtf8,
}

J
Jorge Aparicio 已提交
259
#[derive(Clone, Copy, PartialEq, Debug)]
260
pub enum ParserError {
S
Sean McArthur 已提交
261
    /// msg, line, col
262
    SyntaxError(ErrorCode, uint, uint),
A
Alex Crichton 已提交
263
    IoError(old_io::IoErrorKind, &'static str),
264 265 266 267 268
}

// Builder and Parser have the same errors.
pub type BuilderError = ParserError;

J
Jorge Aparicio 已提交
269
#[derive(Clone, PartialEq, Debug)]
270 271
pub enum DecoderError {
    ParseError(ParserError),
272 273 274 275
    ExpectedError(string::String, string::String),
    MissingFieldError(string::String),
    UnknownVariantError(string::String),
    ApplicationError(string::String)
276 277
}

J
Jorge Aparicio 已提交
278
#[derive(Copy, Debug)]
279 280 281 282 283
pub enum EncoderError {
    FmtError(fmt::Error),
    BadHashmapKey,
}

284 285
/// Returns a readable error string for a given error code.
pub fn error_str(error: ErrorCode) -> &'static str {
286
    match error {
287 288 289
        InvalidSyntax => "invalid syntax",
        InvalidNumber => "invalid number",
        EOFWhileParsingObject => "EOF While parsing object",
C
Corey Farwell 已提交
290
        EOFWhileParsingArray => "EOF While parsing array",
291 292 293 294 295
        EOFWhileParsingValue => "EOF While parsing value",
        EOFWhileParsingString => "EOF While parsing string",
        KeyMustBeAString => "key must be a string",
        ExpectedColon => "expected `:`",
        TrailingCharacters => "trailing characters",
296
        TrailingComma => "trailing comma",
297
        InvalidEscape => "invalid escape",
A
Alex Crichton 已提交
298 299
        UnrecognizedHex => "invalid \\u{ esc}ape (unrecognized hex)",
        NotFourDigit => "invalid \\u{ esc}ape (not four digits)",
300
        NotUtf8 => "contents not utf-8",
301
        InvalidUnicodeCodePoint => "invalid Unicode code point",
302 303 304 305 306
        LoneLeadingSurrogateInHexEscape => "lone leading surrogate in hex escape",
        UnexpectedEndOfHexEscape => "unexpected end of hex escape",
    }
}

307
/// Shortcut function to decode a JSON `&str` into an object
308
pub fn decode<T: ::Decodable>(s: &str) -> DecodeResult<T> {
309 310 311 312 313 314 315 316 317 318
    let json = match from_str(s) {
        Ok(x) => x,
        Err(e) => return Err(ParseError(e))
    };

    let mut decoder = Decoder::new(json);
    ::Decodable::decode(&mut decoder)
}

/// Shortcut function to encode a `T` into a JSON `String`
319
pub fn encode<T: ::Encodable>(object: &T) -> Result<string::String, EncoderError> {
320 321 322
    let mut s = String::new();
    {
        let mut encoder = Encoder::new(&mut s);
323
        try!(object.encode(&mut encoder));
324
    }
325
    Ok(s)
326 327
}

328
impl fmt::Display for ErrorCode {
329 330 331 332 333
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        error_str(*self).fmt(f)
    }
}

A
Alex Crichton 已提交
334
fn io_error_to_error(io: old_io::IoError) -> ParserError {
335
    IoError(io.kind, io.desc)
336
}
337

338 339 340 341 342 343 344 345 346 347 348 349 350 351
impl fmt::Display for ParserError {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        // FIXME this should be a nicer error
        fmt::Debug::fmt(self, f)
    }
}

impl fmt::Display for DecoderError {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        // FIXME this should be a nicer error
        fmt::Debug::fmt(self, f)
    }
}

352 353
impl std::error::Error for DecoderError {
    fn description(&self) -> &str { "decoder error" }
354 355 356 357 358 359 360
}

impl fmt::Display for EncoderError {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        // FIXME this should be a nicer error
        fmt::Debug::fmt(self, f)
    }
361 362
}

363 364 365 366 367 368 369 370 371
impl std::error::Error for EncoderError {
    fn description(&self) -> &str { "encoder error" }
}

impl std::error::FromError<fmt::Error> for EncoderError {
    fn from_error(err: fmt::Error) -> EncoderError { EncoderError::FmtError(err) }
}

pub type EncodeResult = Result<(), EncoderError>;
372
pub type DecodeResult<T> = Result<T, DecoderError>;
A
Alex Crichton 已提交
373

374
fn escape_str(wr: &mut fmt::Write, v: &str) -> EncodeResult {
375 376 377 378
    try!(wr.write_str("\""));

    let mut start = 0;

379 380
    for (i, byte) in v.bytes().enumerate() {
        let escaped = match byte {
381 382
            b'"' => "\\\"",
            b'\\' => "\\\\",
R
Rolf Timmermans 已提交
383 384 385 386 387 388 389 390
            b'\x00' => "\\u0000",
            b'\x01' => "\\u0001",
            b'\x02' => "\\u0002",
            b'\x03' => "\\u0003",
            b'\x04' => "\\u0004",
            b'\x05' => "\\u0005",
            b'\x06' => "\\u0006",
            b'\x07' => "\\u0007",
391
            b'\x08' => "\\b",
R
Rolf Timmermans 已提交
392
            b'\t' => "\\t",
393
            b'\n' => "\\n",
R
Rolf Timmermans 已提交
394 395
            b'\x0b' => "\\u000b",
            b'\x0c' => "\\f",
396
            b'\r' => "\\r",
R
Rolf Timmermans 已提交
397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415
            b'\x0e' => "\\u000e",
            b'\x0f' => "\\u000f",
            b'\x10' => "\\u0010",
            b'\x11' => "\\u0011",
            b'\x12' => "\\u0012",
            b'\x13' => "\\u0013",
            b'\x14' => "\\u0014",
            b'\x15' => "\\u0015",
            b'\x16' => "\\u0016",
            b'\x17' => "\\u0017",
            b'\x18' => "\\u0018",
            b'\x19' => "\\u0019",
            b'\x1a' => "\\u001a",
            b'\x1b' => "\\u001b",
            b'\x1c' => "\\u001c",
            b'\x1d' => "\\u001d",
            b'\x1e' => "\\u001e",
            b'\x1f' => "\\u001f",
            b'\x7f' => "\\u007f",
416 417 418 419
            _ => { continue; }
        };

        if start < i {
J
Jorge Aparicio 已提交
420
            try!(wr.write_str(&v[start..i]));
E
Elly Jones 已提交
421
        }
422 423 424 425

        try!(wr.write_str(escaped));

        start = i + 1;
426
    }
427

428
    if start != v.len() {
J
Jorge Aparicio 已提交
429
        try!(wr.write_str(&v[start..]));
430 431
    }

432 433
    try!(wr.write_str("\""));
    Ok(())
434 435
}

436
fn escape_char(writer: &mut fmt::Write, v: char) -> EncodeResult {
437
    let mut buf = [0; 4];
438
    let n = v.encode_utf8(&mut buf).unwrap();
439
    let buf = unsafe { str::from_utf8_unchecked(&buf[..n]) };
440
    escape_str(writer, buf)
441 442
}

443
fn spaces(wr: &mut fmt::Write, mut n: uint) -> EncodeResult {
444
    const BUF: &'static str = "                ";
445

446 447 448
    while n >= BUF.len() {
        try!(wr.write_str(BUF));
        n -= BUF.len();
449 450 451
    }

    if n > 0 {
452
        try!(wr.write_str(&BUF[..n]));
453
    }
454
    Ok(())
E
Elly Jones 已提交
455 456
}

457
fn fmt_number_or_null(v: f64) -> string::String {
M
mrec 已提交
458
    match v.classify() {
T
Tobias Bucher 已提交
459
        Fp::Nan | Fp::Infinite => string::String::from_str("null"),
A
Alfie John 已提交
460 461
        _ if v.fract() != 0f64 => f64::to_str_digits(v, 6),
        _ => f64::to_str_digits(v, 6) + ".0",
M
mrec 已提交
462 463 464
    }
}

465
/// A structure for implementing serialization to JSON.
E
Erik Price 已提交
466
pub struct Encoder<'a> {
467
    writer: &'a mut (fmt::Write+'a),
468
    is_emitting_map_key: bool,
469 470
}

E
Erik Price 已提交
471
impl<'a> Encoder<'a> {
472 473
    /// Creates a new JSON encoder whose output will be written to the writer
    /// specified.
474
    pub fn new(writer: &'a mut fmt::Write) -> Encoder<'a> {
475 476 477 478 479 480 481 482 483 484 485 486 487
        Encoder { writer: writer, is_emitting_map_key: false, }
    }
}

macro_rules! emit_enquoted_if_mapkey {
    ($enc:ident,$e:expr) => {
        if $enc.is_emitting_map_key {
            try!(write!($enc.writer, "\"{}\"", $e));
            Ok(())
        } else {
            try!(write!($enc.writer, "{}", $e));
            Ok(())
        }
488
    }
489 490
}

491
impl<'a> ::Encoder for Encoder<'a> {
492
    type Error = EncoderError;
493

494 495 496 497 498
    fn emit_nil(&mut self) -> EncodeResult {
        if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
        try!(write!(self.writer, "null"));
        Ok(())
    }
499

500 501 502 503 504
    fn emit_uint(&mut self, v: uint) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) }
    fn emit_u64(&mut self, v: u64) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) }
    fn emit_u32(&mut self, v: u32) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) }
    fn emit_u16(&mut self, v: u16) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) }
    fn emit_u8(&mut self, v: u8) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) }
505

506 507 508 509 510
    fn emit_int(&mut self, v: int) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) }
    fn emit_i64(&mut self, v: i64) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) }
    fn emit_i32(&mut self, v: i32) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) }
    fn emit_i16(&mut self, v: i16) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) }
    fn emit_i8(&mut self, v: i8) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) }
511

S
Sean McArthur 已提交
512
    fn emit_bool(&mut self, v: bool) -> EncodeResult {
513
        if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
514
        if v {
515
            try!(write!(self.writer, "true"));
516
        } else {
517
            try!(write!(self.writer, "false"));
518
        }
519
        Ok(())
520 521
    }

S
Sean McArthur 已提交
522
    fn emit_f64(&mut self, v: f64) -> EncodeResult {
523
        emit_enquoted_if_mapkey!(self, fmt_number_or_null(v))
A
Alex Crichton 已提交
524
    }
B
Barosl Lee 已提交
525 526 527
    fn emit_f32(&mut self, v: f32) -> EncodeResult {
        self.emit_f64(v as f64)
    }
528

529
    fn emit_char(&mut self, v: char) -> EncodeResult {
530
        escape_char(self.writer, v)
531
    }
S
Sean McArthur 已提交
532
    fn emit_str(&mut self, v: &str) -> EncodeResult {
533
        escape_str(self.writer, v)
A
Alex Crichton 已提交
534
    }
535

536 537 538
    fn emit_enum<F>(&mut self, _name: &str, f: F) -> EncodeResult where
        F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
    {
A
Adolfo Ochagavía 已提交
539 540
        f(self)
    }
541

542 543 544 545 546 547 548
    fn emit_enum_variant<F>(&mut self,
                            name: &str,
                            _id: uint,
                            cnt: uint,
                            f: F) -> EncodeResult where
        F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
    {
549 550 551 552
        // enums are encoded as strings or objects
        // Bunny => "Bunny"
        // Kangaroo(34,"William") => {"variant": "Kangaroo", "fields": [34,"William"]}
        if cnt == 0 {
553
            escape_str(self.writer, name)
554
        } else {
555
            if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
A
Adolfo Ochagavía 已提交
556
            try!(write!(self.writer, "{{\"variant\":"));
557
            try!(escape_str(self.writer, name));
A
Adolfo Ochagavía 已提交
558
            try!(write!(self.writer, ",\"fields\":["));
559
            try!(f(self));
560 561
            try!(write!(self.writer, "]}}"));
            Ok(())
562 563
        }
    }
564

565 566 567
    fn emit_enum_variant_arg<F>(&mut self, idx: uint, f: F) -> EncodeResult where
        F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
    {
568
        if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
569
        if idx != 0 {
A
Adolfo Ochagavía 已提交
570
            try!(write!(self.writer, ","));
571
        }
S
Sean McArthur 已提交
572
        f(self)
573 574
    }

575 576 577 578 579 580 581
    fn emit_enum_struct_variant<F>(&mut self,
                                   name: &str,
                                   id: uint,
                                   cnt: uint,
                                   f: F) -> EncodeResult where
        F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
    {
582
        if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
583 584 585
        self.emit_enum_variant(name, id, cnt, f)
    }

586 587 588 589 590 591
    fn emit_enum_struct_variant_field<F>(&mut self,
                                         _: &str,
                                         idx: uint,
                                         f: F) -> EncodeResult where
        F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
    {
592
        if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
593 594 595
        self.emit_enum_variant_arg(idx, f)
    }

596 597 598
    fn emit_struct<F>(&mut self, _: &str, _: uint, f: F) -> EncodeResult where
        F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
    {
599
        if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
A
Adolfo Ochagavía 已提交
600
        try!(write!(self.writer, "{{"));
601
        try!(f(self));
602 603
        try!(write!(self.writer, "}}"));
        Ok(())
604
    }
605

606 607 608
    fn emit_struct_field<F>(&mut self, name: &str, idx: uint, f: F) -> EncodeResult where
        F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
    {
609
        if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
A
Adolfo Ochagavía 已提交
610
        if idx != 0 { try!(write!(self.writer, ",")); }
611 612
        try!(escape_str(self.writer, name));
        try!(write!(self.writer, ":"));
S
Sean McArthur 已提交
613
        f(self)
614 615
    }

616 617 618
    fn emit_tuple<F>(&mut self, len: uint, f: F) -> EncodeResult where
        F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
    {
619
        if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
620 621
        self.emit_seq(len, f)
    }
622 623 624
    fn emit_tuple_arg<F>(&mut self, idx: uint, f: F) -> EncodeResult where
        F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
    {
625
        if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
626 627 628
        self.emit_seq_elt(idx, f)
    }

629 630 631
    fn emit_tuple_struct<F>(&mut self, _name: &str, len: uint, f: F) -> EncodeResult where
        F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
    {
632
        if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
633 634
        self.emit_seq(len, f)
    }
635 636 637
    fn emit_tuple_struct_arg<F>(&mut self, idx: uint, f: F) -> EncodeResult where
        F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
    {
638
        if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
639 640 641
        self.emit_seq_elt(idx, f)
    }

642 643 644
    fn emit_option<F>(&mut self, f: F) -> EncodeResult where
        F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
    {
645
        if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
S
Sean McArthur 已提交
646 647
        f(self)
    }
648 649 650 651
    fn emit_option_none(&mut self) -> EncodeResult {
        if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
        self.emit_nil()
    }
652 653 654
    fn emit_option_some<F>(&mut self, f: F) -> EncodeResult where
        F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
    {
655
        if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
S
Sean McArthur 已提交
656 657
        f(self)
    }
658

659 660 661
    fn emit_seq<F>(&mut self, _len: uint, f: F) -> EncodeResult where
        F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
    {
662
        if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
A
Adolfo Ochagavía 已提交
663
        try!(write!(self.writer, "["));
S
Sean McArthur 已提交
664
        try!(f(self));
665 666
        try!(write!(self.writer, "]"));
        Ok(())
667 668
    }

669 670 671
    fn emit_seq_elt<F>(&mut self, idx: uint, f: F) -> EncodeResult where
        F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
    {
672
        if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
673
        if idx != 0 {
A
Adolfo Ochagavía 已提交
674
            try!(write!(self.writer, ","));
675 676 677 678
        }
        f(self)
    }

679 680 681
    fn emit_map<F>(&mut self, _len: uint, f: F) -> EncodeResult where
        F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
    {
682
        if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
A
Adolfo Ochagavía 已提交
683
        try!(write!(self.writer, "{{"));
684
        try!(f(self));
685 686
        try!(write!(self.writer, "}}"));
        Ok(())
687
    }
688

689 690
    fn emit_map_elt_key<F>(&mut self, idx: uint, f: F) -> EncodeResult where
        F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
691
    {
692
        if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
A
Adolfo Ochagavía 已提交
693
        if idx != 0 { try!(write!(self.writer, ",")) }
694
        self.is_emitting_map_key = true;
S
Sean McArthur 已提交
695
        try!(f(self));
696
        self.is_emitting_map_key = false;
S
Sean McArthur 已提交
697
        Ok(())
698 699
    }

700 701 702
    fn emit_map_elt_val<F>(&mut self, _idx: uint, f: F) -> EncodeResult where
        F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
    {
703
        if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
A
Adolfo Ochagavía 已提交
704
        try!(write!(self.writer, ":"));
705 706 707 708
        f(self)
    }
}

709 710
/// Another encoder for JSON, but prints out human-readable JSON instead of
/// compact data
E
Erik Price 已提交
711
pub struct PrettyEncoder<'a> {
712
    writer: &'a mut (fmt::Write+'a),
713
    curr_indent: uint,
714
    indent: uint,
715
    is_emitting_map_key: bool,
716 717
}

E
Erik Price 已提交
718
impl<'a> PrettyEncoder<'a> {
719
    /// Creates a new encoder whose output will be written to the specified writer
720
    pub fn new(writer: &'a mut fmt::Write) -> PrettyEncoder<'a> {
721 722 723 724 725 726
        PrettyEncoder {
            writer: writer,
            curr_indent: 0,
            indent: 2,
            is_emitting_map_key: false,
        }
727 728 729 730
    }

    /// Set the number of spaces to indent for each level.
    /// This is safe to set during encoding.
N
Niko Matsakis 已提交
731
    pub fn set_indent(&mut self, indent: uint) {
732
        // self.indent very well could be 0 so we need to use checked division.
733
        let level = self.curr_indent.checked_div(self.indent).unwrap_or(0);
734 735
        self.indent = indent;
        self.curr_indent = level * self.indent;
736
    }
737
}
738

739
impl<'a> ::Encoder for PrettyEncoder<'a> {
740
    type Error = EncoderError;
741

742 743 744 745 746
    fn emit_nil(&mut self) -> EncodeResult {
        if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
        try!(write!(self.writer, "null"));
        Ok(())
    }
747

748 749 750 751 752
    fn emit_uint(&mut self, v: uint) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) }
    fn emit_u64(&mut self, v: u64) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) }
    fn emit_u32(&mut self, v: u32) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) }
    fn emit_u16(&mut self, v: u16) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) }
    fn emit_u8(&mut self, v: u8) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) }
753

754 755 756 757 758
    fn emit_int(&mut self, v: int) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) }
    fn emit_i64(&mut self, v: i64) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) }
    fn emit_i32(&mut self, v: i32) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) }
    fn emit_i16(&mut self, v: i16) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) }
    fn emit_i8(&mut self, v: i8) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) }
759

S
Sean McArthur 已提交
760
    fn emit_bool(&mut self, v: bool) -> EncodeResult {
761
        if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
762
        if v {
763
            try!(write!(self.writer, "true"));
764
        } else {
765
            try!(write!(self.writer, "false"));
766
        }
767
        Ok(())
768 769
    }

S
Sean McArthur 已提交
770
    fn emit_f64(&mut self, v: f64) -> EncodeResult {
771
        emit_enquoted_if_mapkey!(self, fmt_number_or_null(v))
A
Alex Crichton 已提交
772
    }
773 774 775
    fn emit_f32(&mut self, v: f32) -> EncodeResult {
        self.emit_f64(v as f64)
    }
776

777
    fn emit_char(&mut self, v: char) -> EncodeResult {
778
        escape_char(self.writer, v)
779
    }
S
Sean McArthur 已提交
780
    fn emit_str(&mut self, v: &str) -> EncodeResult {
781
        escape_str(self.writer, v)
A
Alex Crichton 已提交
782
    }
783

784 785 786
    fn emit_enum<F>(&mut self, _name: &str, f: F) -> EncodeResult where
        F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
    {
787 788 789
        f(self)
    }

790 791 792 793 794 795 796 797
    fn emit_enum_variant<F>(&mut self,
                            name: &str,
                            _id: uint,
                            cnt: uint,
                            f: F)
                            -> EncodeResult where
        F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
    {
798
        if cnt == 0 {
799
            escape_str(self.writer, name)
800
        } else {
801
            if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
802
            try!(write!(self.writer, "{{\n"));
803 804
            self.curr_indent += self.indent;
            try!(spaces(self.writer, self.curr_indent));
805
            try!(write!(self.writer, "\"variant\": "));
806 807
            try!(escape_str(self.writer, name));
            try!(write!(self.writer, ",\n"));
808 809 810
            try!(spaces(self.writer, self.curr_indent));
            try!(write!(self.writer, "\"fields\": [\n"));
            self.curr_indent += self.indent;
S
Sean McArthur 已提交
811
            try!(f(self));
812
            self.curr_indent -= self.indent;
813
            try!(write!(self.writer, "\n"));
814
            try!(spaces(self.writer, self.curr_indent));
815 816 817
            self.curr_indent -= self.indent;
            try!(write!(self.writer, "]\n"));
            try!(spaces(self.writer, self.curr_indent));
818 819
            try!(write!(self.writer, "}}"));
            Ok(())
820 821 822
        }
    }

823 824 825
    fn emit_enum_variant_arg<F>(&mut self, idx: uint, f: F) -> EncodeResult where
        F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
    {
826
        if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
827
        if idx != 0 {
A
Adolfo Ochagavía 已提交
828
            try!(write!(self.writer, ",\n"));
829
        }
830
        try!(spaces(self.writer, self.curr_indent));
831 832 833
        f(self)
    }

834 835 836 837 838 839 840
    fn emit_enum_struct_variant<F>(&mut self,
                                   name: &str,
                                   id: uint,
                                   cnt: uint,
                                   f: F) -> EncodeResult where
        F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
    {
841
        if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
842 843 844
        self.emit_enum_variant(name, id, cnt, f)
    }

845 846 847 848 849 850
    fn emit_enum_struct_variant_field<F>(&mut self,
                                         _: &str,
                                         idx: uint,
                                         f: F) -> EncodeResult where
        F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
    {
851
        if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
852 853 854 855
        self.emit_enum_variant_arg(idx, f)
    }


856 857 858
    fn emit_struct<F>(&mut self, _: &str, len: uint, f: F) -> EncodeResult where
        F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
    {
859
        if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
860
        if len == 0 {
861
            try!(write!(self.writer, "{{}}"));
862
        } else {
A
Adolfo Ochagavía 已提交
863
            try!(write!(self.writer, "{{"));
864
            self.curr_indent += self.indent;
865
            try!(f(self));
866
            self.curr_indent -= self.indent;
867
            try!(write!(self.writer, "\n"));
868
            try!(spaces(self.writer, self.curr_indent));
869
            try!(write!(self.writer, "}}"));
870
        }
871
        Ok(())
872
    }
873

874 875 876
    fn emit_struct_field<F>(&mut self, name: &str, idx: uint, f: F) -> EncodeResult where
        F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
    {
877
        if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
878
        if idx == 0 {
A
Adolfo Ochagavía 已提交
879
            try!(write!(self.writer, "\n"));
880
        } else {
A
Adolfo Ochagavía 已提交
881
            try!(write!(self.writer, ",\n"));
882
        }
883
        try!(spaces(self.writer, self.curr_indent));
884 885
        try!(escape_str(self.writer, name));
        try!(write!(self.writer, ": "));
S
Sean McArthur 已提交
886
        f(self)
887 888
    }

889 890 891
    fn emit_tuple<F>(&mut self, len: uint, f: F) -> EncodeResult where
        F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
    {
892
        if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
893 894
        self.emit_seq(len, f)
    }
895 896 897
    fn emit_tuple_arg<F>(&mut self, idx: uint, f: F) -> EncodeResult where
        F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
    {
898
        if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
899 900 901
        self.emit_seq_elt(idx, f)
    }

902 903 904
    fn emit_tuple_struct<F>(&mut self, _: &str, len: uint, f: F) -> EncodeResult where
        F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
    {
905
        if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
906 907
        self.emit_seq(len, f)
    }
908 909 910
    fn emit_tuple_struct_arg<F>(&mut self, idx: uint, f: F) -> EncodeResult where
        F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
    {
911
        if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
912 913 914
        self.emit_seq_elt(idx, f)
    }

915 916 917
    fn emit_option<F>(&mut self, f: F) -> EncodeResult where
        F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
    {
918
        if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
S
Sean McArthur 已提交
919 920
        f(self)
    }
921 922 923 924
    fn emit_option_none(&mut self) -> EncodeResult {
        if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
        self.emit_nil()
    }
925 926 927
    fn emit_option_some<F>(&mut self, f: F) -> EncodeResult where
        F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
    {
928
        if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
S
Sean McArthur 已提交
929 930
        f(self)
    }
931

932 933 934
    fn emit_seq<F>(&mut self, len: uint, f: F) -> EncodeResult where
        F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
    {
935
        if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
936
        if len == 0 {
937
            try!(write!(self.writer, "[]"));
938
        } else {
A
Adolfo Ochagavía 已提交
939
            try!(write!(self.writer, "["));
940
            self.curr_indent += self.indent;
S
Sean McArthur 已提交
941
            try!(f(self));
942
            self.curr_indent -= self.indent;
943
            try!(write!(self.writer, "\n"));
944
            try!(spaces(self.writer, self.curr_indent));
945
            try!(write!(self.writer, "]"));
946
        }
947
        Ok(())
948 949
    }

950 951 952
    fn emit_seq_elt<F>(&mut self, idx: uint, f: F) -> EncodeResult where
        F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
    {
953
        if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
954
        if idx == 0 {
A
Adolfo Ochagavía 已提交
955
            try!(write!(self.writer, "\n"));
956
        } else {
A
Adolfo Ochagavía 已提交
957
            try!(write!(self.writer, ",\n"));
958
        }
959
        try!(spaces(self.writer, self.curr_indent));
960 961 962
        f(self)
    }

963 964 965
    fn emit_map<F>(&mut self, len: uint, f: F) -> EncodeResult where
        F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
    {
966
        if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
967
        if len == 0 {
968
            try!(write!(self.writer, "{{}}"));
969
        } else {
A
Adolfo Ochagavía 已提交
970
            try!(write!(self.writer, "{{"));
971
            self.curr_indent += self.indent;
972
            try!(f(self));
973
            self.curr_indent -= self.indent;
974
            try!(write!(self.writer, "\n"));
975
            try!(spaces(self.writer, self.curr_indent));
976
            try!(write!(self.writer, "}}"));
977
        }
978
        Ok(())
979
    }
980

981 982
    fn emit_map_elt_key<F>(&mut self, idx: uint, f: F) -> EncodeResult where
        F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
983
    {
984
        if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
985
        if idx == 0 {
A
Adolfo Ochagavía 已提交
986
            try!(write!(self.writer, "\n"));
987
        } else {
A
Adolfo Ochagavía 已提交
988
            try!(write!(self.writer, ",\n"));
989
        }
990
        try!(spaces(self.writer, self.curr_indent));
991
        self.is_emitting_map_key = true;
S
Sean McArthur 已提交
992
        try!(f(self));
993
        self.is_emitting_map_key = false;
S
Sean McArthur 已提交
994
        Ok(())
995 996
    }

997 998 999
    fn emit_map_elt_val<F>(&mut self, _idx: uint, f: F) -> EncodeResult where
        F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
    {
1000
        if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
A
Adolfo Ochagavía 已提交
1001
        try!(write!(self.writer, ": "));
S
Sean McArthur 已提交
1002
        f(self)
1003 1004 1005
    }
}

1006 1007
impl Encodable for Json {
    fn encode<E: ::Encoder>(&self, e: &mut E) -> Result<(), E::Error> {
1008
        match *self {
1009 1010 1011 1012 1013 1014 1015 1016
            Json::I64(v) => v.encode(e),
            Json::U64(v) => v.encode(e),
            Json::F64(v) => v.encode(e),
            Json::String(ref v) => v.encode(e),
            Json::Boolean(v) => v.encode(e),
            Json::Array(ref v) => v.encode(e),
            Json::Object(ref v) => v.encode(e),
            Json::Null => e.emit_nil(),
1017 1018 1019 1020
        }
    }
}

1021 1022 1023 1024 1025
/// Create an `AsJson` wrapper which can be used to print a value as JSON
/// on-the-fly via `write!`
pub fn as_json<T>(t: &T) -> AsJson<T> {
    AsJson { inner: t }
}
1026

1027 1028 1029 1030 1031
/// Create an `AsPrettyJson` wrapper which can be used to print a value as JSON
/// on-the-fly via `write!`
pub fn as_pretty_json<T>(t: &T) -> AsPrettyJson<T> {
    AsPrettyJson { inner: t, indent: None }
}
1032

1033 1034
impl Json {
    /// Borrow this json object as a pretty object to generate a pretty
1035
    /// representation for it via `Display`.
1036 1037
    pub fn pretty(&self) -> PrettyJson {
        PrettyJson { inner: self }
1038
    }
1039 1040 1041

     /// If the Json value is an Object, returns the value associated with the provided key.
    /// Otherwise, returns None.
1042 1043
    pub fn find<'a>(&'a self, key: &str) -> Option<&'a Json>{
        match self {
1044
            &Json::Object(ref map) => map.get(key),
1045 1046 1047 1048
            _ => None
        }
    }

1049
    /// Attempts to get a nested Json Object for each key in `keys`.
1050
    /// If any key is found not to exist, find_path will return None.
1051
    /// Otherwise, it will return the Json value associated with the final key.
1052
    pub fn find_path<'a>(&'a self, keys: &[&str]) -> Option<&'a Json>{
1053
        let mut target = self;
1054
        for key in keys {
1055 1056 1057 1058 1059 1060
            match target.find(*key) {
                Some(t) => { target = t; },
                None => return None
            }
        }
        Some(target)
1061 1062 1063 1064 1065
    }

    /// If the Json value is an Object, performs a depth-first search until
    /// a value associated with the provided key is found. If no value is found
    /// or the Json value is not an Object, returns None.
1066 1067
    pub fn search<'a>(&'a self, key: &str) -> Option<&'a Json> {
        match self {
1068
            &Json::Object(ref map) => {
A
Aaron Turon 已提交
1069
                match map.get(key) {
1070 1071
                    Some(json_value) => Some(json_value),
                    None => {
1072
                        for (_, v) in map {
1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085
                            match v.search(key) {
                                x if x.is_some() => return x,
                                _ => ()
                            }
                        }
                        None
                    }
                }
            },
            _ => None
        }
    }

1086 1087
    /// Returns true if the Json value is an Object. Returns false otherwise.
    pub fn is_object<'a>(&'a self) -> bool {
1088
        self.as_object().is_some()
1089 1090
    }

A
Alexis Beingessner 已提交
1091
    /// If the Json value is an Object, returns the associated BTreeMap.
1092
    /// Returns None otherwise.
1093
    pub fn as_object<'a>(&'a self) -> Option<&'a Object> {
1094
        match self {
1095
            &Json::Object(ref map) => Some(map),
1096 1097 1098 1099
            _ => None
        }
    }

C
Corey Farwell 已提交
1100
    /// Returns true if the Json value is an Array. Returns false otherwise.
C
Corey Farwell 已提交
1101 1102
    pub fn is_array<'a>(&'a self) -> bool {
        self.as_array().is_some()
1103 1104
    }

C
Corey Farwell 已提交
1105
    /// If the Json value is an Array, returns the associated vector.
1106
    /// Returns None otherwise.
1107
    pub fn as_array<'a>(&'a self) -> Option<&'a Array> {
1108
        match self {
1109
            &Json::Array(ref array) => Some(&*array),
1110 1111 1112 1113 1114
            _ => None
        }
    }

    /// Returns true if the Json value is a String. Returns false otherwise.
1115 1116
    pub fn is_string<'a>(&'a self) -> bool {
        self.as_string().is_some()
1117 1118 1119 1120
    }

    /// If the Json value is a String, returns the associated str.
    /// Returns None otherwise.
1121
    pub fn as_string<'a>(&'a self) -> Option<&'a str> {
1122
        match *self {
1123
            Json::String(ref s) => Some(&s[..]),
1124 1125 1126 1127 1128 1129
            _ => None
        }
    }

    /// Returns true if the Json value is a Number. Returns false otherwise.
    pub fn is_number(&self) -> bool {
1130
        match *self {
1131
            Json::I64(_) | Json::U64(_) | Json::F64(_) => true,
1132 1133 1134 1135 1136 1137 1138
            _ => false,
        }
    }

    /// Returns true if the Json value is a i64. Returns false otherwise.
    pub fn is_i64(&self) -> bool {
        match *self {
1139
            Json::I64(_) => true,
1140 1141 1142 1143 1144 1145 1146
            _ => false,
        }
    }

    /// Returns true if the Json value is a u64. Returns false otherwise.
    pub fn is_u64(&self) -> bool {
        match *self {
1147
            Json::U64(_) => true,
1148 1149
            _ => false,
        }
1150 1151
    }

1152 1153 1154
    /// Returns true if the Json value is a f64. Returns false otherwise.
    pub fn is_f64(&self) -> bool {
        match *self {
1155
            Json::F64(_) => true,
1156 1157 1158 1159
            _ => false,
        }
    }

1160
    /// If the Json value is a number, return or cast it to a i64.
1161
    /// Returns None otherwise.
1162 1163
    pub fn as_i64(&self) -> Option<i64> {
        match *self {
1164 1165
            Json::I64(n) => Some(n),
            Json::U64(n) => num::cast(n),
1166 1167 1168 1169 1170 1171 1172 1173
            _ => None
        }
    }

    /// If the Json value is a number, return or cast it to a u64.
    /// Returns None otherwise.
    pub fn as_u64(&self) -> Option<u64> {
        match *self {
1174 1175
            Json::I64(n) => num::cast(n),
            Json::U64(n) => Some(n),
1176 1177 1178 1179
            _ => None
        }
    }

1180
    /// If the Json value is a number, return or cast it to a f64.
1181 1182 1183
    /// Returns None otherwise.
    pub fn as_f64(&self) -> Option<f64> {
        match *self {
1184 1185 1186
            Json::I64(n) => num::cast(n),
            Json::U64(n) => num::cast(n),
            Json::F64(n) => Some(n),
1187 1188 1189 1190 1191 1192
            _ => None
        }
    }

    /// Returns true if the Json value is a Boolean. Returns false otherwise.
    pub fn is_boolean(&self) -> bool {
1193
        self.as_boolean().is_some()
1194 1195 1196 1197 1198 1199
    }

    /// If the Json value is a Boolean, returns the associated bool.
    /// Returns None otherwise.
    pub fn as_boolean(&self) -> Option<bool> {
        match self {
1200
            &Json::Boolean(b) => Some(b),
1201 1202 1203 1204 1205 1206
            _ => None
        }
    }

    /// Returns true if the Json value is a Null. Returns false otherwise.
    pub fn is_null(&self) -> bool {
1207
        self.as_null().is_some()
1208 1209 1210 1211 1212 1213
    }

    /// If the Json value is a Null, returns ().
    /// Returns None otherwise.
    pub fn as_null(&self) -> Option<()> {
        match self {
1214
            &Json::Null => Some(()),
1215 1216 1217
            _ => None
        }
    }
E
Elly Jones 已提交
1218 1219
}

N
fallout  
Nick Cameron 已提交
1220
impl<'a> Index<&'a str>  for Json {
J
Jorge Aparicio 已提交
1221 1222 1223 1224 1225 1226 1227
    type Output = Json;

    fn index(&self, idx: & &str) -> &Json {
        self.find(*idx).unwrap()
    }
}

N
fallout  
Nick Cameron 已提交
1228
impl Index<uint> for Json {
J
Jorge Aparicio 已提交
1229 1230 1231 1232
    type Output = Json;

    fn index<'a>(&'a self, idx: &uint) -> &'a Json {
        match self {
J
Jorge Aparicio 已提交
1233
            &Json::Array(ref v) => &v[*idx],
J
Jorge Aparicio 已提交
1234 1235 1236 1237 1238
            _ => panic!("can only index Json with uint if it is an array")
        }
    }
}

1239
/// The output of the streaming parser.
J
Jorge Aparicio 已提交
1240
#[derive(PartialEq, Clone, Debug)]
1241 1242 1243
pub enum JsonEvent {
    ObjectStart,
    ObjectEnd,
C
Corey Farwell 已提交
1244 1245
    ArrayStart,
    ArrayEnd,
1246
    BooleanValue(bool),
1247 1248 1249
    I64Value(i64),
    U64Value(u64),
    F64Value(f64),
1250
    StringValue(string::String),
1251 1252 1253 1254
    NullValue,
    Error(ParserError),
}

J
Jorge Aparicio 已提交
1255
#[derive(PartialEq, Debug)]
1256
enum ParserState {
C
Corey Farwell 已提交
1257
    // Parse a value in an array, true means first element.
1258
    ParseArray(bool),
C
Corey Farwell 已提交
1259
    // Parse ',' or ']' after an element in an array.
C
Corey Farwell 已提交
1260
    ParseArrayComma,
1261 1262 1263 1264
    // Parse a key:value in an object, true means first element.
    ParseObject(bool),
    // Parse ',' or ']' after an element in an object.
    ParseObjectComma,
J
Joseph Crail 已提交
1265
    // Initial state.
1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281
    ParseStart,
    // Expecting the stream to end.
    ParseBeforeFinish,
    // Parsing can't continue.
    ParseFinished,
}

/// A Stack represents the current position of the parser in the logical
/// structure of the JSON stream.
/// For example foo.bar[3].x
pub struct Stack {
    stack: Vec<InternalStackElement>,
    str_buffer: Vec<u8>,
}

/// StackElements compose a Stack.
N
fallout  
Nick Cameron 已提交
1282 1283
/// For example, StackElement::Key("foo"), StackElement::Key("bar"),
/// StackElement::Index(3) and StackElement::Key("x") are the
1284
/// StackElements compositing the stack that represents foo.bar[3].x
J
Jorge Aparicio 已提交
1285
#[derive(PartialEq, Clone, Debug)]
1286 1287 1288 1289 1290 1291 1292
pub enum StackElement<'l> {
    Index(u32),
    Key(&'l str),
}

// Internally, Key elements are stored as indices in a buffer to avoid
// allocating a string for every member of an object.
J
Jorge Aparicio 已提交
1293
#[derive(PartialEq, Clone, Debug)]
1294 1295 1296 1297 1298 1299 1300
enum InternalStackElement {
    InternalIndex(u32),
    InternalKey(u16, u16), // start, size
}

impl Stack {
    pub fn new() -> Stack {
A
Adolfo Ochagavía 已提交
1301
        Stack { stack: Vec::new(), str_buffer: Vec::new() }
1302 1303 1304 1305 1306
    }

    /// Returns The number of elements in the Stack.
    pub fn len(&self) -> uint { self.stack.len() }

A
Adolfo Ochagavía 已提交
1307 1308
    /// Returns true if the stack is empty.
    pub fn is_empty(&self) -> bool { self.stack.is_empty() }
1309 1310 1311 1312 1313

    /// Provides access to the StackElement at a given index.
    /// lower indices are at the bottom of the stack while higher indices are
    /// at the top.
    pub fn get<'l>(&'l self, idx: uint) -> StackElement<'l> {
N
Nick Cameron 已提交
1314
        match self.stack[idx] {
1315
            InternalIndex(i) => StackElement::Index(i),
A
Adolfo Ochagavía 已提交
1316
            InternalKey(start, size) => {
1317
                StackElement::Key(str::from_utf8(
1318
                    &self.str_buffer[start as uint .. start as uint + size as uint])
1319
                        .unwrap())
A
Adolfo Ochagavía 已提交
1320
            }
1321 1322 1323 1324 1325 1326
        }
    }

    /// Compares this stack with an array of StackElements.
    pub fn is_equal_to(&self, rhs: &[StackElement]) -> bool {
        if self.stack.len() != rhs.len() { return false; }
1327
        for i in 0..rhs.len() {
1328 1329 1330 1331 1332 1333 1334 1335 1336
            if self.get(i) != rhs[i] { return false; }
        }
        return true;
    }

    /// Returns true if the bottom-most elements of this stack are the same as
    /// the ones passed as parameter.
    pub fn starts_with(&self, rhs: &[StackElement]) -> bool {
        if self.stack.len() < rhs.len() { return false; }
1337
        for i in 0..rhs.len() {
1338 1339 1340 1341 1342 1343 1344 1345 1346 1347
            if self.get(i) != rhs[i] { return false; }
        }
        return true;
    }

    /// Returns true if the top-most elements of this stack are the same as
    /// the ones passed as parameter.
    pub fn ends_with(&self, rhs: &[StackElement]) -> bool {
        if self.stack.len() < rhs.len() { return false; }
        let offset = self.stack.len() - rhs.len();
1348
        for i in 0..rhs.len() {
1349 1350 1351 1352 1353 1354 1355 1356 1357
            if self.get(i + offset) != rhs[i] { return false; }
        }
        return true;
    }

    /// Returns the top-most element (if any).
    pub fn top<'l>(&'l self) -> Option<StackElement<'l>> {
        return match self.stack.last() {
            None => None,
1358
            Some(&InternalIndex(i)) => Some(StackElement::Index(i)),
1359
            Some(&InternalKey(start, size)) => {
1360
                Some(StackElement::Key(str::from_utf8(
1361
                    &self.str_buffer[start as uint .. (start+size) as uint]
1362 1363 1364 1365 1366
                ).unwrap()))
            }
        }
    }

1367
    // Used by Parser to insert StackElement::Key elements at the top of the stack.
1368
    fn push_key(&mut self, key: string::String) {
1369
        self.stack.push(InternalKey(self.str_buffer.len() as u16, key.len() as u16));
1370
        for c in key.as_bytes() {
1371 1372 1373 1374
            self.str_buffer.push(*c);
        }
    }

1375
    // Used by Parser to insert StackElement::Index elements at the top of the stack.
1376 1377 1378 1379 1380 1381 1382 1383 1384 1385
    fn push_index(&mut self, index: u32) {
        self.stack.push(InternalIndex(index));
    }

    // Used by Parser to remove the top-most element of the stack.
    fn pop(&mut self) {
        assert!(!self.is_empty());
        match *self.stack.last().unwrap() {
            InternalKey(_, sz) => {
                let new_size = self.str_buffer.len() - sz as uint;
A
Adolfo Ochagavía 已提交
1386
                self.str_buffer.truncate(new_size);
1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405
            }
            InternalIndex(_) => {}
        }
        self.stack.pop();
    }

    // Used by Parser to test whether the top-most element is an index.
    fn last_is_index(&self) -> bool {
        if self.is_empty() { return false; }
        return match *self.stack.last().unwrap() {
            InternalIndex(_) => true,
            _ => false,
        }
    }

    // Used by Parser to increment the index of the top-most element.
    fn bump_index(&mut self) {
        let len = self.stack.len();
        let idx = match *self.stack.last().unwrap() {
A
Adolfo Ochagavía 已提交
1406
            InternalIndex(i) => { i + 1 }
S
Steve Klabnik 已提交
1407
            _ => { panic!(); }
1408
        };
1409
        self.stack[len - 1] = InternalIndex(idx);
1410 1411 1412 1413 1414
    }
}

/// A streaming JSON parser implemented as an iterator of JsonEvent, consuming
/// an iterator of char.
G
Gary Linscott 已提交
1415
pub struct Parser<T> {
1416 1417 1418 1419
    rdr: T,
    ch: Option<char>,
    line: uint,
    col: uint,
1420 1421 1422
    // We maintain a stack representing where we are in the logical structure
    // of the JSON stream.
    stack: Stack,
J
Joseph Crail 已提交
1423
    // A state machine is kept to make it possible to interrupt and resume parsing.
1424 1425 1426
    state: ParserState,
}

J
Jorge Aparicio 已提交
1427 1428 1429
impl<T: Iterator<Item=char>> Iterator for Parser<T> {
    type Item = JsonEvent;

1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447
    fn next(&mut self) -> Option<JsonEvent> {
        if self.state == ParseFinished {
            return None;
        }

        if self.state == ParseBeforeFinish {
            self.parse_whitespace();
            // Make sure there is no trailing characters.
            if self.eof() {
                self.state = ParseFinished;
                return None;
            } else {
                return Some(self.error_event(TrailingCharacters));
            }
        }

        return Some(self.parse());
    }
1448 1449
}

J
Jorge Aparicio 已提交
1450
impl<T: Iterator<Item=char>> Parser<T> {
1451
    /// Creates the JSON parser.
1452
    pub fn new(rdr: T) -> Parser<T> {
1453 1454
        let mut p = Parser {
            rdr: rdr,
1455
            ch: Some('\x00'),
1456 1457
            line: 1,
            col: 0,
1458 1459
            stack: Stack::new(),
            state: ParseStart,
1460 1461
        };
        p.bump();
1462
        return p;
1463
    }
E
Elly Jones 已提交
1464

1465 1466 1467
    /// Provides access to the current position in the logical structure of the
    /// JSON stream.
    pub fn stack<'l>(&'l self) -> &'l Stack {
1468
        return &self.stack;
1469
    }
1470

1471 1472
    fn eof(&self) -> bool { self.ch.is_none() }
    fn ch_or_null(&self) -> char { self.ch.unwrap_or('\x00') }
1473
    fn bump(&mut self) {
1474
        self.ch = self.rdr.next();
E
Elly Jones 已提交
1475

1476
        if self.ch_is('\n') {
A
Alfie John 已提交
1477 1478
            self.line += 1;
            self.col = 1;
G
Gary Linscott 已提交
1479
        } else {
A
Alfie John 已提交
1480
            self.col += 1;
E
Elly Jones 已提交
1481
        }
1482 1483
    }

1484
    fn next_char(&mut self) -> Option<char> {
1485 1486 1487
        self.bump();
        self.ch
    }
1488 1489 1490
    fn ch_is(&self, c: char) -> bool {
        self.ch == Some(c)
    }
1491

1492
    fn error<U>(&self, reason: ErrorCode) -> Result<U, ParserError> {
1493
        Err(SyntaxError(reason, self.line, self.col))
1494 1495
    }

1496
    fn parse_whitespace(&mut self) {
1497 1498 1499 1500
        while self.ch_is(' ') ||
              self.ch_is('\n') ||
              self.ch_is('\t') ||
              self.ch_is('\r') { self.bump(); }
1501 1502
    }

1503
    fn parse_number(&mut self) -> JsonEvent {
1504
        let mut neg = false;
1505

1506
        if self.ch_is('-') {
1507
            self.bump();
1508
            neg = true;
E
Elly Jones 已提交
1509
        }
1510

1511
        let res = match self.parse_u64() {
1512 1513 1514
            Ok(res) => res,
            Err(e) => { return Error(e); }
        };
1515

1516 1517
        if self.ch_is('.') || self.ch_is('e') || self.ch_is('E') {
            let mut res = res as f64;
1518

1519 1520 1521 1522 1523 1524
            if self.ch_is('.') {
                res = match self.parse_decimal(res) {
                    Ok(res) => res,
                    Err(e) => { return Error(e); }
                };
            }
1525

1526 1527 1528 1529 1530 1531 1532
            if self.ch_is('e') || self.ch_is('E') {
                res = match self.parse_exponent(res) {
                    Ok(res) => res,
                    Err(e) => { return Error(e); }
                };
            }

1533 1534 1535 1536 1537
            if neg {
                res *= -1.0;
            }

            F64Value(res)
1538
        } else {
1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550
            if neg {
                let res = -(res as i64);

                // Make sure we didn't underflow.
                if res > 0 {
                    Error(SyntaxError(InvalidNumber, self.line, self.col))
                } else {
                    I64Value(res)
                }
            } else {
                U64Value(res)
            }
1551
        }
E
Elly Jones 已提交
1552 1553
    }

1554 1555 1556
    fn parse_u64(&mut self) -> Result<u64, ParserError> {
        let mut accum = 0;
        let last_accum = 0; // necessary to detect overflow.
E
Elly Jones 已提交
1557

1558 1559 1560
        match self.ch_or_null() {
            '0' => {
                self.bump();
1561

M
mrec 已提交
1562
                // A leading '0' must be the only digit before the decimal point.
1563
                match self.ch_or_null() {
1564
                    '0' ... '9' => return self.error(InvalidNumber),
1565 1566 1567
                    _ => ()
                }
            },
1568
            '1' ... '9' => {
1569 1570
                while !self.eof() {
                    match self.ch_or_null() {
1571
                        c @ '0' ... '9' => {
1572 1573 1574 1575 1576 1577
                            accum *= 10;
                            accum += (c as u64) - ('0' as u64);

                            // Detect overflow by comparing to the last value.
                            if accum <= last_accum { return self.error(InvalidNumber); }

1578 1579 1580 1581
                            self.bump();
                        }
                        _ => break,
                    }
1582 1583
                }
            }
1584
            _ => return self.error(InvalidNumber),
E
Elly Jones 已提交
1585
        }
1586 1587

        Ok(accum)
E
Elly Jones 已提交
1588 1589
    }

A
Adolfo Ochagavía 已提交
1590
    fn parse_decimal(&mut self, mut res: f64) -> Result<f64, ParserError> {
1591 1592 1593
        self.bump();

        // Make sure a digit follows the decimal place.
1594
        match self.ch_or_null() {
1595
            '0' ... '9' => (),
1596
             _ => return self.error(InvalidNumber)
1597 1598
        }

D
Daniel Micay 已提交
1599
        let mut dec = 1.0;
1600
        while !self.eof() {
1601
            match self.ch_or_null() {
1602
                c @ '0' ... '9' => {
1603 1604 1605 1606 1607
                    dec /= 10.0;
                    res += (((c as int) - ('0' as int)) as f64) * dec;
                    self.bump();
                }
                _ => break,
E
Elly Jones 已提交
1608 1609
            }
        }
1610

1611
        Ok(res)
E
Elly Jones 已提交
1612 1613
    }

1614
    fn parse_exponent(&mut self, mut res: f64) -> Result<f64, ParserError> {
1615 1616
        self.bump();

A
Alfie John 已提交
1617
        let mut exp = 0;
1618
        let mut neg_exp = false;
1619

1620 1621 1622 1623 1624
        if self.ch_is('+') {
            self.bump();
        } else if self.ch_is('-') {
            self.bump();
            neg_exp = true;
1625 1626 1627
        }

        // Make sure a digit follows the exponent place.
1628
        match self.ch_or_null() {
1629
            '0' ... '9' => (),
1630
            _ => return self.error(InvalidNumber)
1631 1632
        }
        while !self.eof() {
1633
            match self.ch_or_null() {
1634
                c @ '0' ... '9' => {
1635 1636
                    exp *= 10;
                    exp += (c as uint) - ('0' as uint);
1637

1638 1639 1640
                    self.bump();
                }
                _ => break
1641 1642 1643
            }
        }

1644
        let exp = 10_f64.powi(exp as i32);
1645 1646 1647 1648 1649 1650
        if neg_exp {
            res /= exp;
        } else {
            res *= exp;
        }

1651
        Ok(res)
E
Elly Jones 已提交
1652 1653
    }

1654
    fn decode_hex_escape(&mut self) -> Result<u16, ParserError> {
A
Alfie John 已提交
1655
        let mut i = 0;
1656
        let mut n = 0u16;
A
Adolfo Ochagavía 已提交
1657
        while i < 4 && !self.eof() {
1658 1659
            self.bump();
            n = match self.ch_or_null() {
1660
                c @ '0' ... '9' => n * 16 + ((c as u16) - ('0' as u16)),
A
Adolfo Ochagavía 已提交
1661 1662 1663 1664 1665 1666
                'a' | 'A' => n * 16 + 10,
                'b' | 'B' => n * 16 + 11,
                'c' | 'C' => n * 16 + 12,
                'd' | 'D' => n * 16 + 13,
                'e' | 'E' => n * 16 + 14,
                'f' | 'F' => n * 16 + 15,
1667
                _ => return self.error(InvalidEscape)
1668 1669
            };

A
Alfie John 已提交
1670
            i += 1;
1671 1672 1673
        }

        // Error out if we didn't parse 4 digits.
A
Adolfo Ochagavía 已提交
1674
        if i != 4 {
1675
            return self.error(InvalidEscape);
1676 1677 1678 1679 1680
        }

        Ok(n)
    }

1681
    fn parse_str(&mut self) -> Result<string::String, ParserError> {
1682
        let mut escape = false;
1683
        let mut res = string::String::new();
1684

G
Gary Linscott 已提交
1685
        loop {
1686
            self.bump();
G
Gary Linscott 已提交
1687
            if self.eof() {
1688
                return self.error(EOFWhileParsingString);
G
Gary Linscott 已提交
1689
            }
1690

H
Huon Wilson 已提交
1691
            if escape {
1692
                match self.ch_or_null() {
1693 1694 1695 1696 1697 1698 1699 1700
                    '"' => res.push('"'),
                    '\\' => res.push('\\'),
                    '/' => res.push('/'),
                    'b' => res.push('\x08'),
                    'f' => res.push('\x0c'),
                    'n' => res.push('\n'),
                    'r' => res.push('\r'),
                    't' => res.push('\t'),
1701
                    'u' => match try!(self.decode_hex_escape()) {
1702 1703 1704
                        0xDC00 ... 0xDFFF => {
                            return self.error(LoneLeadingSurrogateInHexEscape)
                        }
1705 1706 1707

                        // Non-BMP characters are encoded as a sequence of
                        // two hex escapes, representing UTF-16 surrogates.
1708
                        n1 @ 0xD800 ... 0xDBFF => {
A
Adolfo Ochagavía 已提交
1709
                            match (self.next_char(), self.next_char()) {
1710
                                (Some('\\'), Some('u')) => (),
1711
                                _ => return self.error(UnexpectedEndOfHexEscape),
1712
                            }
1713

1714
                            let buf = [n1, try!(self.decode_hex_escape())];
A
Alex Crichton 已提交
1715 1716
                            match unicode_str::utf16_items(&buf).next() {
                                Some(Utf16Item::ScalarValue(c)) => res.push(c),
1717
                                _ => return self.error(LoneLeadingSurrogateInHexEscape),
1718
                            }
1719 1720
                        }

1721
                        n => match char::from_u32(n as u32) {
1722
                            Some(c) => res.push(c),
1723
                            None => return self.error(InvalidUnicodeCodePoint),
1724 1725
                        },
                    },
1726
                    _ => return self.error(InvalidEscape),
1727 1728
                }
                escape = false;
1729
            } else if self.ch_is('\\') {
1730 1731
                escape = true;
            } else {
1732
                match self.ch {
1733 1734
                    Some('"') => {
                        self.bump();
1735
                        return Ok(res);
1736
                    },
1737
                    Some(c) => res.push(c),
1738
                    None => unreachable!()
1739
                }
E
Elly Jones 已提交
1740 1741 1742 1743
            }
        }
    }

1744 1745 1746 1747
    // Invoked at each iteration, consumes the stream until it has enough
    // information to return a JsonEvent.
    // Manages an internal state so that parsing can be interrupted and resumed.
    // Also keeps track of the position in the logical structure of the json
J
Joseph Crail 已提交
1748
    // stream int the form of a stack that can be queried by the user using the
1749 1750 1751 1752
    // stack() method.
    fn parse(&mut self) -> JsonEvent {
        loop {
            // The only paths where the loop can spin a new iteration
C
Corey Farwell 已提交
1753
            // are in the cases ParseArrayComma and ParseObjectComma if ','
1754
            // is parsed. In these cases the state is set to (respectively)
1755
            // ParseArray(false) and ParseObject(false), which always return,
1756 1757 1758
            // so there is no risk of getting stuck in an infinite loop.
            // All other paths return before the end of the loop's iteration.
            self.parse_whitespace();
1759

1760 1761 1762 1763
            match self.state {
                ParseStart => {
                    return self.parse_start();
                }
1764
                ParseArray(first) => {
C
Corey Farwell 已提交
1765
                    return self.parse_array(first);
1766
                }
C
Corey Farwell 已提交
1767 1768
                ParseArrayComma => {
                    match self.parse_array_comma_or_end() {
1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794
                        Some(evt) => { return evt; }
                        None => {}
                    }
                }
                ParseObject(first) => {
                    return self.parse_object(first);
                }
                ParseObjectComma => {
                    self.stack.pop();
                    if self.ch_is(',') {
                        self.state = ParseObject(false);
                        self.bump();
                    } else {
                        return self.parse_object_end();
                    }
                }
                _ => {
                    return self.error_event(InvalidSyntax);
                }
            }
        }
    }

    fn parse_start(&mut self) -> JsonEvent {
        let val = self.parse_value();
        self.state = match val {
1795 1796 1797 1798
            Error(_) => ParseFinished,
            ArrayStart => ParseArray(true),
            ObjectStart => ParseObject(true),
            _ => ParseBeforeFinish,
1799 1800 1801
        };
        return val;
    }
1802

C
Corey Farwell 已提交
1803
    fn parse_array(&mut self, first: bool) -> JsonEvent {
1804
        if self.ch_is(']') {
1805
            if !first {
1806
                self.error_event(InvalidSyntax)
1807
            } else {
1808 1809 1810
                self.state = if self.stack.is_empty() {
                    ParseBeforeFinish
                } else if self.stack.last_is_index() {
C
Corey Farwell 已提交
1811
                    ParseArrayComma
1812 1813
                } else {
                    ParseObjectComma
1814 1815 1816
                };
                self.bump();
                ArrayEnd
1817
            }
1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829
        } else {
            if first {
                self.stack.push_index(0);
            }
            let val = self.parse_value();
            self.state = match val {
                Error(_) => ParseFinished,
                ArrayStart => ParseArray(true),
                ObjectStart => ParseObject(true),
                _ => ParseArrayComma,
            };
            val
1830
        }
1831
    }
1832

C
Corey Farwell 已提交
1833
    fn parse_array_comma_or_end(&mut self) -> Option<JsonEvent> {
1834 1835
        if self.ch_is(',') {
            self.stack.bump_index();
1836
            self.state = ParseArray(false);
1837
            self.bump();
1838
            None
1839 1840
        } else if self.ch_is(']') {
            self.stack.pop();
1841 1842 1843 1844
            self.state = if self.stack.is_empty() {
                ParseBeforeFinish
            } else if self.stack.last_is_index() {
                ParseArrayComma
1845
            } else {
1846 1847
                ParseObjectComma
            };
1848
            self.bump();
1849
            Some(ArrayEnd)
1850
        } else if self.eof() {
1851
            Some(self.error_event(EOFWhileParsingArray))
1852
        } else {
1853
            Some(self.error_event(InvalidSyntax))
1854
        }
E
Elly Jones 已提交
1855 1856
    }

1857 1858 1859
    fn parse_object(&mut self, first: bool) -> JsonEvent {
        if self.ch_is('}') {
            if !first {
1860 1861 1862 1863 1864
                if self.stack.is_empty() {
                    return self.error_event(TrailingComma);
                } else {
                    self.stack.pop();
                }
1865
            }
1866 1867 1868 1869
            self.state = if self.stack.is_empty() {
                ParseBeforeFinish
            } else if self.stack.last_is_index() {
                ParseArrayComma
1870
            } else {
1871 1872
                ParseObjectComma
            };
1873 1874 1875 1876 1877 1878 1879 1880 1881 1882
            self.bump();
            return ObjectEnd;
        }
        if self.eof() {
            return self.error_event(EOFWhileParsingObject);
        }
        if !self.ch_is('"') {
            return self.error_event(KeyMustBeAString);
        }
        let s = match self.parse_str() {
1883
            Ok(s) => s,
1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895
            Err(e) => {
                self.state = ParseFinished;
                return Error(e);
            }
        };
        self.parse_whitespace();
        if self.eof() {
            return self.error_event(EOFWhileParsingObject);
        } else if self.ch_or_null() != ':' {
            return self.error_event(ExpectedColon);
        }
        self.stack.push_key(s);
1896 1897 1898
        self.bump();
        self.parse_whitespace();

1899
        let val = self.parse_value();
1900

1901
        self.state = match val {
1902 1903 1904 1905
            Error(_) => ParseFinished,
            ArrayStart => ParseArray(true),
            ObjectStart => ParseObject(true),
            _ => ParseObjectComma,
1906 1907 1908 1909 1910
        };
        return val;
    }

    fn parse_object_end(&mut self) -> JsonEvent {
1911
        if self.ch_is('}') {
1912 1913 1914 1915
            self.state = if self.stack.is_empty() {
                ParseBeforeFinish
            } else if self.stack.last_is_index() {
                ParseArrayComma
1916
            } else {
1917 1918
                ParseObjectComma
            };
1919
            self.bump();
A
Adolfo Ochagavía 已提交
1920
            ObjectEnd
1921
        } else if self.eof() {
A
Adolfo Ochagavía 已提交
1922
            self.error_event(EOFWhileParsingObject)
1923
        } else {
A
Adolfo Ochagavía 已提交
1924
            self.error_event(InvalidSyntax)
1925
        }
1926
    }
1927

1928 1929 1930
    fn parse_value(&mut self) -> JsonEvent {
        if self.eof() { return self.error_event(EOFWhileParsingValue); }
        match self.ch_or_null() {
A
Adolfo Ochagavía 已提交
1931 1932 1933
            'n' => { self.parse_ident("ull", NullValue) }
            't' => { self.parse_ident("rue", BooleanValue(true)) }
            'f' => { self.parse_ident("alse", BooleanValue(false)) }
1934
            '0' ... '9' | '-' => self.parse_number(),
A
Adolfo Ochagavía 已提交
1935
            '"' => match self.parse_str() {
1936 1937 1938 1939 1940
                Ok(s) => StringValue(s),
                Err(e) => Error(e),
            },
            '[' => {
                self.bump();
C
Corey Farwell 已提交
1941
                ArrayStart
1942 1943 1944
            }
            '{' => {
                self.bump();
A
Adolfo Ochagavía 已提交
1945
                ObjectStart
1946
            }
A
Adolfo Ochagavía 已提交
1947
            _ => { self.error_event(InvalidSyntax) }
1948 1949
        }
    }
1950

1951 1952 1953 1954 1955 1956 1957 1958
    fn parse_ident(&mut self, ident: &str, value: JsonEvent) -> JsonEvent {
        if ident.chars().all(|c| Some(c) == self.next_char()) {
            self.bump();
            value
        } else {
            Error(SyntaxError(InvalidSyntax, self.line, self.col))
        }
    }
1959

1960 1961 1962 1963 1964
    fn error_event(&mut self, reason: ErrorCode) -> JsonEvent {
        self.state = ParseFinished;
        Error(SyntaxError(reason, self.line, self.col))
    }
}
1965

1966 1967 1968 1969 1970
/// A Builder consumes a json::Parser to create a generic Json structure.
pub struct Builder<T> {
    parser: Parser<T>,
    token: Option<JsonEvent>,
}
1971

J
Jorge Aparicio 已提交
1972
impl<T: Iterator<Item=char>> Builder<T> {
1973 1974
    /// Create a JSON Builder.
    pub fn new(src: T) -> Builder<T> {
A
Adolfo Ochagavía 已提交
1975
        Builder { parser: Parser::new(src), token: None, }
1976 1977 1978 1979 1980 1981 1982 1983 1984 1985
    }

    // Decode a Json value from a Parser.
    pub fn build(&mut self) -> Result<Json, BuilderError> {
        self.bump();
        let result = self.build_value();
        self.bump();
        match self.token {
            None => {}
            Some(Error(e)) => { return Err(e); }
1986
            ref tok => { panic!("unexpected token {:?}", tok.clone()); }
1987
        }
A
Adolfo Ochagavía 已提交
1988
        result
1989 1990 1991 1992 1993 1994 1995
    }

    fn bump(&mut self) {
        self.token = self.parser.next();
    }

    fn build_value(&mut self) -> Result<Json, BuilderError> {
1996 1997 1998 1999 2000 2001
        return match self.token {
            Some(NullValue) => Ok(Json::Null),
            Some(I64Value(n)) => Ok(Json::I64(n)),
            Some(U64Value(n)) => Ok(Json::U64(n)),
            Some(F64Value(n)) => Ok(Json::F64(n)),
            Some(BooleanValue(b)) => Ok(Json::Boolean(b)),
2002
            Some(StringValue(ref mut s)) => {
2003
                let mut temp = string::String::new();
2004
                swap(s, &mut temp);
2005
                Ok(Json::String(temp))
2006
            }
2007 2008 2009 2010 2011 2012
            Some(Error(e)) => Err(e),
            Some(ArrayStart) => self.build_array(),
            Some(ObjectStart) => self.build_object(),
            Some(ObjectEnd) => self.parser.error(InvalidSyntax),
            Some(ArrayEnd) => self.parser.error(InvalidSyntax),
            None => self.parser.error(EOFWhileParsingValue),
2013 2014
        }
    }
2015

C
Corey Farwell 已提交
2016
    fn build_array(&mut self) -> Result<Json, BuilderError> {
2017 2018 2019 2020
        self.bump();
        let mut values = Vec::new();

        loop {
C
Corey Farwell 已提交
2021
            if self.token == Some(ArrayEnd) {
2022
                return Ok(Json::Array(values.into_iter().collect()));
2023 2024 2025 2026
            }
            match self.build_value() {
                Ok(v) => values.push(v),
                Err(e) => { return Err(e) }
2027
            }
2028
            self.bump();
2029
        }
2030
    }
2031

2032 2033 2034
    fn build_object(&mut self) -> Result<Json, BuilderError> {
        self.bump();

A
Alexis Beingessner 已提交
2035
        let mut values = BTreeMap::new();
2036

A
Adolfo Ochagavía 已提交
2037
        loop {
2038
            match self.token {
2039
                Some(ObjectEnd) => { return Ok(Json::Object(values)); }
2040 2041 2042 2043 2044
                Some(Error(e)) => { return Err(e); }
                None => { break; }
                _ => {}
            }
            let key = match self.parser.stack().top() {
2045
                Some(StackElement::Key(k)) => { k.to_string() }
S
Steve Klabnik 已提交
2046
                _ => { panic!("invalid state"); }
2047 2048 2049 2050 2051 2052 2053 2054
            };
            match self.build_value() {
                Ok(value) => { values.insert(key, value); }
                Err(e) => { return Err(e); }
            }
            self.bump();
        }
        return self.parser.error(EOFWhileParsingObject);
L
Lenny222 已提交
2055 2056 2057
    }
}

A
Alex Crichton 已提交
2058 2059
/// Decodes a json value from an `&mut old_io::Reader`
pub fn from_reader(rdr: &mut old_io::Reader) -> Result<Json, BuilderError> {
A
Alex Crichton 已提交
2060
    let contents = match rdr.read_to_end() {
2061
        Ok(c)  => c,
2062
        Err(e) => return Err(io_error_to_error(e))
A
Alex Crichton 已提交
2063
    };
2064
    let s = match str::from_utf8(&contents).ok() {
2065 2066
        Some(s) => s,
        _       => return Err(SyntaxError(NotUtf8, 0, 0))
A
Alex Crichton 已提交
2067
    };
2068
    let mut builder = Builder::new(s.chars());
2069
    builder.build()
E
Elly Jones 已提交
2070 2071
}

2072
/// Decodes a json value from a string
2073 2074
pub fn from_str(s: &str) -> Result<Json, BuilderError> {
    let mut builder = Builder::new(s.chars());
A
Adolfo Ochagavía 已提交
2075
    builder.build()
2076 2077
}

2078
/// A structure to decode JSON to values in rust.
2079
pub struct Decoder {
2080
    stack: Vec<Json>,
2081 2082
}

2083 2084
impl Decoder {
    /// Creates a new decoder instance for decoding the specified JSON value.
2085
    pub fn new(json: Json) -> Decoder {
A
Adolfo Ochagavía 已提交
2086
        Decoder { stack: vec![json] }
2087
    }
2088 2089
}

2090
impl Decoder {
S
Sean McArthur 已提交
2091 2092
    fn pop(&mut self) -> Json {
        self.stack.pop().unwrap()
2093 2094 2095
    }
}

2096
macro_rules! expect {
S
Sean McArthur 已提交
2097 2098
    ($e:expr, Null) => ({
        match $e {
2099
            Json::Null => Ok(()),
A
Alex Crichton 已提交
2100
            other => Err(ExpectedError("Null".to_string(),
A
Alex Crichton 已提交
2101
                                       format!("{}", other)))
S
Sean McArthur 已提交
2102 2103 2104 2105
        }
    });
    ($e:expr, $t:ident) => ({
        match $e {
2106
            Json::$t(v) => Ok(v),
2107
            other => {
2108
                Err(ExpectedError(stringify!($t).to_string(),
A
Alex Crichton 已提交
2109
                                  format!("{}", other)))
2110
            }
2111
        }
S
Sean McArthur 已提交
2112
    })
2113
}
S
Sean McArthur 已提交
2114

2115 2116 2117 2118
macro_rules! read_primitive {
    ($name:ident, $ty:ty) => {
        fn $name(&mut self) -> DecodeResult<$ty> {
            match self.pop() {
B
Barosl Lee 已提交
2119 2120
                Json::I64(f) => match num::cast(f) {
                    Some(f) => Ok(f),
A
Alex Crichton 已提交
2121
                    None => Err(ExpectedError("Number".to_string(), format!("{}", f))),
2122
                },
B
Barosl Lee 已提交
2123 2124
                Json::U64(f) => match num::cast(f) {
                    Some(f) => Ok(f),
A
Alex Crichton 已提交
2125
                    None => Err(ExpectedError("Number".to_string(), format!("{}", f))),
B
Barosl Lee 已提交
2126
                },
A
Alex Crichton 已提交
2127
                Json::F64(f) => Err(ExpectedError("Integer".to_string(), format!("{}", f))),
B
Barosl Lee 已提交
2128 2129
                // re: #12967.. a type w/ numeric keys (ie HashMap<uint, V> etc)
                // is going to have a string here, as per JSON spec.
A
Alex Crichton 已提交
2130
                Json::String(s) => match s.parse().ok() {
B
Barosl Lee 已提交
2131
                    Some(f) => Ok(f),
A
Alex Crichton 已提交
2132
                    None => Err(ExpectedError("Number".to_string(), s)),
2133
                },
A
Alex Crichton 已提交
2134
                value => Err(ExpectedError("Number".to_string(), format!("{}", value))),
2135 2136 2137 2138 2139
            }
        }
    }
}

2140 2141 2142
impl ::Decoder for Decoder {
    type Error = DecoderError;

S
Sean McArthur 已提交
2143
    fn read_nil(&mut self) -> DecodeResult<()> {
A
Adolfo Ochagavía 已提交
2144
        expect!(self.pop(), Null)
2145 2146
    }

2147 2148 2149 2150 2151 2152 2153 2154 2155 2156
    read_primitive! { read_uint, uint }
    read_primitive! { read_u8, u8 }
    read_primitive! { read_u16, u16 }
    read_primitive! { read_u32, u32 }
    read_primitive! { read_u64, u64 }
    read_primitive! { read_int, int }
    read_primitive! { read_i8, i8 }
    read_primitive! { read_i16, i16 }
    read_primitive! { read_i32, i32 }
    read_primitive! { read_i64, i64 }
2157

2158
    fn read_f32(&mut self) -> DecodeResult<f32> { self.read_f64().map(|x| x as f32) }
2159

S
Sean McArthur 已提交
2160 2161
    fn read_f64(&mut self) -> DecodeResult<f64> {
        match self.pop() {
2162 2163 2164 2165
            Json::I64(f) => Ok(f as f64),
            Json::U64(f) => Ok(f as f64),
            Json::F64(f) => Ok(f),
            Json::String(s) => {
2166
                // re: #12967.. a type w/ numeric keys (ie HashMap<uint, V> etc)
A
Adolfo Ochagavía 已提交
2167
                // is going to have a string here, as per JSON spec.
A
Alex Crichton 已提交
2168
                match s.parse().ok() {
2169
                    Some(f) => Ok(f),
A
Alex Crichton 已提交
2170
                    None => Err(ExpectedError("Number".to_string(), s)),
2171
                }
2172
            },
2173
            Json::Null => Ok(f64::NAN),
A
Alex Crichton 已提交
2174
            value => Err(ExpectedError("Number".to_string(), format!("{}", value)))
2175 2176
        }
    }
2177

2178 2179 2180
    fn read_bool(&mut self) -> DecodeResult<bool> {
        expect!(self.pop(), Boolean)
    }
2181

S
Sean McArthur 已提交
2182 2183
    fn read_char(&mut self) -> DecodeResult<char> {
        let s = try!(self.read_str());
2184
        {
2185
            let mut it = s.chars();
2186 2187
            match (it.next(), it.next()) {
                // exactly one character
S
Sean McArthur 已提交
2188
                (Some(c), None) => return Ok(c),
2189 2190 2191
                _ => ()
            }
        }
A
Alex Crichton 已提交
2192
        Err(ExpectedError("single character string".to_string(), format!("{}", s)))
2193 2194
    }

2195
    fn read_str(&mut self) -> DecodeResult<string::String> {
A
Adolfo Ochagavía 已提交
2196
        expect!(self.pop(), String)
2197 2198
    }

E
Erick Tryzelaar 已提交
2199
    fn read_enum<T, F>(&mut self, _name: &str, f: F) -> DecodeResult<T> where
2200 2201
        F: FnOnce(&mut Decoder) -> DecodeResult<T>,
    {
2202 2203 2204
        f(self)
    }

2205 2206 2207
    fn read_enum_variant<T, F>(&mut self, names: &[&str],
                               mut f: F) -> DecodeResult<T>
        where F: FnMut(&mut Decoder, uint) -> DecodeResult<T>,
2208
    {
S
Sean McArthur 已提交
2209
        let name = match self.pop() {
2210 2211
            Json::String(s) => s,
            Json::Object(mut o) => {
A
Alex Crichton 已提交
2212
                let n = match o.remove(&"variant".to_string()) {
2213
                    Some(Json::String(s)) => s,
2214
                    Some(val) => {
A
Alex Crichton 已提交
2215
                        return Err(ExpectedError("String".to_string(), format!("{}", val)))
2216 2217
                    }
                    None => {
A
Alex Crichton 已提交
2218
                        return Err(MissingFieldError("variant".to_string()))
2219
                    }
2220
                };
A
Alex Crichton 已提交
2221
                match o.remove(&"fields".to_string()) {
2222
                    Some(Json::Array(l)) => {
A
Aaron Turon 已提交
2223
                        for field in l.into_iter().rev() {
A
Adolfo Ochagavía 已提交
2224
                            self.stack.push(field);
2225 2226
                        }
                    },
2227
                    Some(val) => {
A
Alex Crichton 已提交
2228
                        return Err(ExpectedError("Array".to_string(), format!("{}", val)))
2229 2230
                    }
                    None => {
A
Alex Crichton 已提交
2231
                        return Err(MissingFieldError("fields".to_string()))
2232
                    }
2233
                }
2234
                n
2235
            }
2236
            json => {
A
Alex Crichton 已提交
2237
                return Err(ExpectedError("String or Object".to_string(), format!("{}", json)))
2238
            }
2239
        };
2240
        let idx = match names.iter().position(|n| *n == &name[..]) {
2241
            Some(idx) => idx,
S
Sean McArthur 已提交
2242
            None => return Err(UnknownVariantError(name))
2243 2244 2245 2246
        };
        f(self, idx)
    }

E
Erick Tryzelaar 已提交
2247
    fn read_enum_variant_arg<T, F>(&mut self, _idx: uint, f: F) -> DecodeResult<T> where
2248 2249
        F: FnOnce(&mut Decoder) -> DecodeResult<T>,
    {
2250 2251 2252
        f(self)
    }

2253
    fn read_enum_struct_variant<T, F>(&mut self, names: &[&str], f: F) -> DecodeResult<T> where
2254
        F: FnMut(&mut Decoder, uint) -> DecodeResult<T>,
2255
    {
2256 2257 2258 2259
        self.read_enum_variant(names, f)
    }


2260
    fn read_enum_struct_variant_field<T, F>(&mut self,
E
Erick Tryzelaar 已提交
2261
                                         _name: &str,
2262
                                         idx: uint,
2263 2264 2265 2266
                                         f: F)
                                         -> DecodeResult<T> where
        F: FnOnce(&mut Decoder) -> DecodeResult<T>,
    {
2267 2268 2269
        self.read_enum_variant_arg(idx, f)
    }

E
Erick Tryzelaar 已提交
2270
    fn read_struct<T, F>(&mut self, _name: &str, _len: uint, f: F) -> DecodeResult<T> where
2271 2272
        F: FnOnce(&mut Decoder) -> DecodeResult<T>,
    {
S
Sean McArthur 已提交
2273 2274 2275
        let value = try!(f(self));
        self.pop();
        Ok(value)
2276 2277
    }

2278 2279
    fn read_struct_field<T, F>(&mut self,
                               name: &str,
E
Erick Tryzelaar 已提交
2280
                               _idx: uint,
2281 2282 2283 2284
                               f: F)
                               -> DecodeResult<T> where
        F: FnOnce(&mut Decoder) -> DecodeResult<T>,
    {
S
Sean McArthur 已提交
2285 2286
        let mut obj = try!(expect!(self.pop(), Object));

2287
        let value = match obj.remove(&name.to_string()) {
2288 2289 2290
            None => {
                // Add a Null and try to parse it as an Option<_>
                // to get None as a default value.
2291
                self.stack.push(Json::Null);
2292 2293 2294 2295 2296
                match f(self) {
                    Ok(x) => x,
                    Err(_) => return Err(MissingFieldError(name.to_string())),
                }
            },
S
Sean McArthur 已提交
2297 2298 2299
            Some(json) => {
                self.stack.push(json);
                try!(f(self))
2300
            }
S
Sean McArthur 已提交
2301
        };
2302
        self.stack.push(Json::Object(obj));
S
Sean McArthur 已提交
2303
        Ok(value)
2304 2305
    }

2306 2307 2308 2309
    fn read_tuple<T, F>(&mut self, tuple_len: uint, f: F) -> DecodeResult<T> where
        F: FnOnce(&mut Decoder) -> DecodeResult<T>,
    {
        self.read_seq(move |d, len| {
2310 2311 2312 2313 2314
            if len == tuple_len {
                f(d)
            } else {
                Err(ExpectedError(format!("Tuple{}", tuple_len), format!("Tuple{}", len)))
            }
2315
        })
2316 2317
    }

2318 2319 2320
    fn read_tuple_arg<T, F>(&mut self, idx: uint, f: F) -> DecodeResult<T> where
        F: FnOnce(&mut Decoder) -> DecodeResult<T>,
    {
2321 2322 2323
        self.read_seq_elt(idx, f)
    }

2324
    fn read_tuple_struct<T, F>(&mut self,
E
Erick Tryzelaar 已提交
2325
                               _name: &str,
2326 2327 2328 2329 2330
                               len: uint,
                               f: F)
                               -> DecodeResult<T> where
        F: FnOnce(&mut Decoder) -> DecodeResult<T>,
    {
2331
        self.read_tuple(len, f)
2332 2333
    }

2334 2335 2336 2337 2338 2339
    fn read_tuple_struct_arg<T, F>(&mut self,
                                   idx: uint,
                                   f: F)
                                   -> DecodeResult<T> where
        F: FnOnce(&mut Decoder) -> DecodeResult<T>,
    {
2340 2341 2342
        self.read_tuple_arg(idx, f)
    }

2343 2344
    fn read_option<T, F>(&mut self, mut f: F) -> DecodeResult<T> where
        F: FnMut(&mut Decoder, bool) -> DecodeResult<T>,
2345
    {
S
Sean McArthur 已提交
2346
        match self.pop() {
2347
            Json::Null => f(self, false),
2348 2349 2350 2351
            value => { self.stack.push(value); f(self, true) }
        }
    }

2352 2353 2354
    fn read_seq<T, F>(&mut self, f: F) -> DecodeResult<T> where
        F: FnOnce(&mut Decoder, uint) -> DecodeResult<T>,
    {
C
Corey Farwell 已提交
2355 2356 2357
        let array = try!(expect!(self.pop(), Array));
        let len = array.len();
        for v in array.into_iter().rev() {
S
Sean McArthur 已提交
2358 2359
            self.stack.push(v);
        }
2360 2361 2362
        f(self, len)
    }

E
Erick Tryzelaar 已提交
2363
    fn read_seq_elt<T, F>(&mut self, _idx: uint, f: F) -> DecodeResult<T> where
2364 2365
        F: FnOnce(&mut Decoder) -> DecodeResult<T>,
    {
2366 2367 2368
        f(self)
    }

2369 2370 2371
    fn read_map<T, F>(&mut self, f: F) -> DecodeResult<T> where
        F: FnOnce(&mut Decoder, uint) -> DecodeResult<T>,
    {
S
Sean McArthur 已提交
2372 2373
        let obj = try!(expect!(self.pop(), Object));
        let len = obj.len();
2374
        for (key, value) in obj {
S
Sean McArthur 已提交
2375
            self.stack.push(value);
2376
            self.stack.push(Json::String(key));
S
Sean McArthur 已提交
2377
        }
2378 2379 2380
        f(self, len)
    }

E
Erick Tryzelaar 已提交
2381
    fn read_map_elt_key<T, F>(&mut self, _idx: uint, f: F) -> DecodeResult<T> where
2382 2383
       F: FnOnce(&mut Decoder) -> DecodeResult<T>,
    {
2384 2385 2386
        f(self)
    }

E
Erick Tryzelaar 已提交
2387
    fn read_map_elt_val<T, F>(&mut self, _idx: uint, f: F) -> DecodeResult<T> where
2388 2389
       F: FnOnce(&mut Decoder) -> DecodeResult<T>,
    {
2390 2391
        f(self)
    }
2392 2393 2394 2395

    fn error(&mut self, err: &str) -> DecoderError {
        ApplicationError(err.to_string())
    }
2396 2397
}

2398
/// A trait for converting values to JSON
2399
pub trait ToJson {
2400 2401 2402
    /// Converts the value of `self` to an instance of JSON
    fn to_json(&self) -> Json;
}
2403

2404
macro_rules! to_json_impl_i64 {
2405 2406
    ($($t:ty), +) => (
        $(impl ToJson for $t {
2407
            fn to_json(&self) -> Json { Json::I64(*self as i64) }
2408 2409
        })+
    )
2410
}
2411

2412
to_json_impl_i64! { int, i8, i16, i32, i64 }
2413

2414
macro_rules! to_json_impl_u64 {
A
Adolfo Ochagavía 已提交
2415 2416
    ($($t:ty), +) => (
        $(impl ToJson for $t {
2417
            fn to_json(&self) -> Json { Json::U64(*self as u64) }
A
Adolfo Ochagavía 已提交
2418 2419
        })+
    )
2420
}
2421

2422
to_json_impl_u64! { uint, u8, u16, u32, u64 }
2423

A
Adolfo Ochagavía 已提交
2424 2425
impl ToJson for Json {
    fn to_json(&self) -> Json { self.clone() }
2426 2427
}

2428
impl ToJson for f32 {
M
mrec 已提交
2429
    fn to_json(&self) -> Json { (*self as f64).to_json() }
2430 2431
}

2432
impl ToJson for f64 {
M
mrec 已提交
2433 2434
    fn to_json(&self) -> Json {
        match self.classify() {
T
Tobias Bucher 已提交
2435
            Fp::Nan | Fp::Infinite => Json::Null,
2436
            _                  => Json::F64(*self)
M
mrec 已提交
2437 2438
        }
    }
2439 2440
}

2441
impl ToJson for () {
2442
    fn to_json(&self) -> Json { Json::Null }
2443 2444
}

2445
impl ToJson for bool {
2446
    fn to_json(&self) -> Json { Json::Boolean(*self) }
2447 2448
}

2449
impl ToJson for str {
A
Alex Crichton 已提交
2450
    fn to_json(&self) -> Json { Json::String(self.to_string()) }
2451 2452
}

2453
impl ToJson for string::String {
2454
    fn to_json(&self) -> Json { Json::String((*self).clone()) }
2455 2456
}

2457 2458 2459 2460 2461 2462 2463 2464 2465
macro_rules! tuple_impl {
    // use variables to indicate the arity of the tuple
    ($($tyvar:ident),* ) => {
        // the trailing commas are for the 1 tuple
        impl<
            $( $tyvar : ToJson ),*
            > ToJson for ( $( $tyvar ),* , ) {

            #[inline]
2466
            #[allow(non_snake_case)]
2467 2468
            fn to_json(&self) -> Json {
                match *self {
2469
                    ($(ref $tyvar),*,) => Json::Array(vec![$($tyvar.to_json()),*])
2470
                }
A
Adolfo Ochagavía 已提交
2471
            }
2472
        }
2473 2474 2475
    }
}

2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487
tuple_impl!{A}
tuple_impl!{A, B}
tuple_impl!{A, B, C}
tuple_impl!{A, B, C, D}
tuple_impl!{A, B, C, D, E}
tuple_impl!{A, B, C, D, E, F}
tuple_impl!{A, B, C, D, E, F, G}
tuple_impl!{A, B, C, D, E, F, G, H}
tuple_impl!{A, B, C, D, E, F, G, H, I}
tuple_impl!{A, B, C, D, E, F, G, H, I, J}
tuple_impl!{A, B, C, D, E, F, G, H, I, J, K}
tuple_impl!{A, B, C, D, E, F, G, H, I, J, K, L}
2488

J
Jorge Aparicio 已提交
2489
impl<A: ToJson> ToJson for [A] {
2490
    fn to_json(&self) -> Json { Json::Array(self.iter().map(|elt| elt.to_json()).collect()) }
2491 2492
}

A
Adolfo Ochagavía 已提交
2493
impl<A: ToJson> ToJson for Vec<A> {
2494
    fn to_json(&self) -> Json { Json::Array(self.iter().map(|elt| elt.to_json()).collect()) }
2495 2496
}

A
Alexis Beingessner 已提交
2497
impl<A: ToJson> ToJson for BTreeMap<string::String, A> {
B
Ben Striegel 已提交
2498
    fn to_json(&self) -> Json {
A
Alexis Beingessner 已提交
2499
        let mut d = BTreeMap::new();
2500
        for (key, value) in self {
2501
            d.insert((*key).clone(), value.to_json());
2502
        }
2503
        Json::Object(d)
2504 2505 2506
    }
}

2507
impl<A: ToJson> ToJson for HashMap<string::String, A> {
G
Graydon Hoare 已提交
2508
    fn to_json(&self) -> Json {
A
Alexis Beingessner 已提交
2509
        let mut d = BTreeMap::new();
2510
        for (key, value) in self {
2511
            d.insert((*key).clone(), value.to_json());
G
Graydon Hoare 已提交
2512
        }
2513
        Json::Object(d)
G
Graydon Hoare 已提交
2514 2515 2516
    }
}

2517
impl<A:ToJson> ToJson for Option<A> {
B
Ben Striegel 已提交
2518 2519
    fn to_json(&self) -> Json {
        match *self {
2520
            None => Json::Null,
A
Adolfo Ochagavía 已提交
2521
            Some(ref value) => value.to_json()
2522 2523 2524 2525
        }
    }
}

2526 2527 2528 2529
struct FormatShim<'a, 'b: 'a> {
    inner: &'a mut fmt::Formatter<'b>,
}

2530
impl<'a, 'b> fmt::Write for FormatShim<'a, 'b> {
2531
    fn write_str(&mut self, s: &str) -> fmt::Result {
2532 2533 2534 2535
        match self.inner.write_str(s) {
            Ok(_) => Ok(()),
            Err(_) => Err(fmt::Error)
        }
2536 2537 2538
    }
}

2539
impl fmt::Display for Json {
2540
    /// Encodes a json value into a string
2541
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2542 2543
        let mut shim = FormatShim { inner: f };
        let mut encoder = Encoder::new(&mut shim);
2544 2545 2546 2547
        match self.encode(&mut encoder) {
            Ok(_) => Ok(()),
            Err(_) => Err(fmt::Error)
        }
2548 2549 2550
    }
}

2551
impl<'a> fmt::Display for PrettyJson<'a> {
2552 2553 2554 2555
    /// Encodes a json value into a string
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        let mut shim = FormatShim { inner: f };
        let mut encoder = PrettyEncoder::new(&mut shim);
2556 2557 2558 2559
        match self.inner.encode(&mut encoder) {
            Ok(_) => Ok(()),
            Err(_) => Err(fmt::Error)
        }
2560 2561 2562
    }
}

2563
impl<'a, T: Encodable> fmt::Display for AsJson<'a, T> {
2564 2565 2566 2567
    /// Encodes a json value into a string
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        let mut shim = FormatShim { inner: f };
        let mut encoder = Encoder::new(&mut shim);
2568 2569 2570 2571
        match self.inner.encode(&mut encoder) {
            Ok(_) => Ok(()),
            Err(_) => Err(fmt::Error)
        }
2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582
    }
}

impl<'a, T> AsPrettyJson<'a, T> {
    /// Set the indentation level for the emitted JSON
    pub fn indent(mut self, indent: uint) -> AsPrettyJson<'a, T> {
        self.indent = Some(indent);
        self
    }
}

2583
impl<'a, T: Encodable> fmt::Display for AsPrettyJson<'a, T> {
2584 2585 2586 2587 2588 2589 2590 2591
    /// Encodes a json value into a string
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        let mut shim = FormatShim { inner: f };
        let mut encoder = PrettyEncoder::new(&mut shim);
        match self.indent {
            Some(n) => encoder.set_indent(n),
            None => {}
        }
2592 2593 2594 2595
        match self.inner.encode(&mut encoder) {
            Ok(_) => Ok(()),
            Err(_) => Err(fmt::Error)
        }
2596
    }
2597 2598
}

B
Brendan Zabarauskas 已提交
2599
impl FromStr for Json {
A
Alex Crichton 已提交
2600 2601 2602
    type Err = BuilderError;
    fn from_str(s: &str) -> Result<Json, BuilderError> {
        from_str(s)
A
Adolfo Ochagavía 已提交
2603 2604 2605
    }
}

2606 2607
#[cfg(test)]
mod tests {
2608
    extern crate test;
S
Steven Fackler 已提交
2609 2610
    use self::Animal::*;
    use self::DecodeEnum::*;
2611
    use self::test::Bencher;
A
Alex Crichton 已提交
2612
    use {Encodable, Decodable};
2613 2614 2615 2616 2617
    use super::Json::*;
    use super::ErrorCode::*;
    use super::ParserError::*;
    use super::DecoderError::*;
    use super::JsonEvent::*;
2618
    use super::{Json, from_str, DecodeResult, DecoderError, JsonEvent, Parser,
2619
                StackElement, Stack, Decoder, Encoder, EncoderError};
J
Jorge Aparicio 已提交
2620
    use std::{i64, u64, f32, f64};
A
Alexis Beingessner 已提交
2621
    use std::collections::BTreeMap;
2622
    use std::num::Float;
2623
    use std::string;
2624

J
Jorge Aparicio 已提交
2625
    #[derive(RustcDecodable, Eq, PartialEq, Debug)]
2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640
    struct OptionData {
        opt: Option<uint>,
    }

    #[test]
    fn test_decode_option_none() {
        let s ="{}";
        let obj: OptionData = super::decode(s).unwrap();
        assert_eq!(obj, OptionData { opt: None });
    }

    #[test]
    fn test_decode_option_some() {
        let s = "{ \"opt\": 10 }";
        let obj: OptionData = super::decode(s).unwrap();
A
Alfie John 已提交
2641
        assert_eq!(obj, OptionData { opt: Some(10) });
2642 2643 2644 2645 2646
    }

    #[test]
    fn test_decode_option_malformed() {
        check_err::<OptionData>("{ \"opt\": [] }",
A
Alex Crichton 已提交
2647
                                ExpectedError("Number".to_string(), "[]".to_string()));
2648
        check_err::<OptionData>("{ \"opt\": false }",
A
Alex Crichton 已提交
2649
                                ExpectedError("Number".to_string(), "false".to_string()));
2650 2651
    }

J
Jorge Aparicio 已提交
2652
    #[derive(PartialEq, RustcEncodable, RustcDecodable, Debug)]
2653 2654
    enum Animal {
        Dog,
2655
        Frog(string::String, int)
2656 2657
    }

J
Jorge Aparicio 已提交
2658
    #[derive(PartialEq, RustcEncodable, RustcDecodable, Debug)]
2659 2660 2661
    struct Inner {
        a: (),
        b: uint,
2662
        c: Vec<string::String>,
2663 2664
    }

J
Jorge Aparicio 已提交
2665
    #[derive(PartialEq, RustcEncodable, RustcDecodable, Debug)]
2666
    struct Outer {
K
Kevin Ballard 已提交
2667
        inner: Vec<Inner>,
2668 2669
    }

2670
    fn mk_object(items: &[(string::String, Json)]) -> Json {
A
Alexis Beingessner 已提交
2671
        let mut d = BTreeMap::new();
2672

2673
        for item in items {
2674
            match *item {
2675
                (ref key, ref value) => { d.insert((*key).clone(), (*value).clone()); },
2676
            }
2677 2678
        };

L
Luqman Aden 已提交
2679
        Object(d)
2680 2681
    }

A
Adolfo Ochagavía 已提交
2682 2683 2684
    #[test]
    fn test_from_str_trait() {
        let s = "null";
2685
        assert!(s.parse::<Json>().unwrap() == s.parse().unwrap());
A
Adolfo Ochagavía 已提交
2686 2687
    }

2688 2689
    #[test]
    fn test_write_null() {
B
Barosl Lee 已提交
2690
        assert_eq!(Null.to_string(), "null");
2691
        assert_eq!(Null.pretty().to_string(), "null");
2692 2693
    }

2694 2695
    #[test]
    fn test_write_i64() {
B
Barosl Lee 已提交
2696
        assert_eq!(U64(0).to_string(), "0");
2697
        assert_eq!(U64(0).pretty().to_string(), "0");
2698

B
Barosl Lee 已提交
2699
        assert_eq!(U64(1234).to_string(), "1234");
2700
        assert_eq!(U64(1234).pretty().to_string(), "1234");
2701

B
Barosl Lee 已提交
2702
        assert_eq!(I64(-5678).to_string(), "-5678");
2703
        assert_eq!(I64(-5678).pretty().to_string(), "-5678");
2704 2705

        assert_eq!(U64(7650007200025252000).to_string(), "7650007200025252000");
2706
        assert_eq!(U64(7650007200025252000).pretty().to_string(), "7650007200025252000");
2707
    }
2708

2709
    #[test]
2710
    fn test_write_f64() {
B
Barosl Lee 已提交
2711
        assert_eq!(F64(3.0).to_string(), "3.0");
2712
        assert_eq!(F64(3.0).pretty().to_string(), "3.0");
2713

B
Barosl Lee 已提交
2714
        assert_eq!(F64(3.1).to_string(), "3.1");
2715
        assert_eq!(F64(3.1).pretty().to_string(), "3.1");
2716

B
Barosl Lee 已提交
2717
        assert_eq!(F64(-1.5).to_string(), "-1.5");
2718
        assert_eq!(F64(-1.5).pretty().to_string(), "-1.5");
2719

B
Barosl Lee 已提交
2720
        assert_eq!(F64(0.5).to_string(), "0.5");
2721
        assert_eq!(F64(0.5).pretty().to_string(), "0.5");
M
mrec 已提交
2722

B
Barosl Lee 已提交
2723
        assert_eq!(F64(f64::NAN).to_string(), "null");
2724
        assert_eq!(F64(f64::NAN).pretty().to_string(), "null");
M
mrec 已提交
2725

B
Barosl Lee 已提交
2726
        assert_eq!(F64(f64::INFINITY).to_string(), "null");
2727
        assert_eq!(F64(f64::INFINITY).pretty().to_string(), "null");
M
mrec 已提交
2728

B
Barosl Lee 已提交
2729
        assert_eq!(F64(f64::NEG_INFINITY).to_string(), "null");
2730
        assert_eq!(F64(f64::NEG_INFINITY).pretty().to_string(), "null");
2731 2732 2733 2734
    }

    #[test]
    fn test_write_str() {
A
Alex Crichton 已提交
2735
        assert_eq!(String("".to_string()).to_string(), "\"\"");
2736
        assert_eq!(String("".to_string()).pretty().to_string(), "\"\"");
2737

A
Alex Crichton 已提交
2738
        assert_eq!(String("homura".to_string()).to_string(), "\"homura\"");
2739
        assert_eq!(String("madoka".to_string()).pretty().to_string(), "\"madoka\"");
2740 2741 2742 2743
    }

    #[test]
    fn test_write_bool() {
B
Barosl Lee 已提交
2744
        assert_eq!(Boolean(true).to_string(), "true");
2745
        assert_eq!(Boolean(true).pretty().to_string(), "true");
2746

B
Barosl Lee 已提交
2747
        assert_eq!(Boolean(false).to_string(), "false");
2748
        assert_eq!(Boolean(false).pretty().to_string(), "false");
2749 2750 2751
    }

    #[test]
C
Corey Farwell 已提交
2752
    fn test_write_array() {
B
Barosl Lee 已提交
2753
        assert_eq!(Array(vec![]).to_string(), "[]");
2754
        assert_eq!(Array(vec![]).pretty().to_string(), "[]");
2755

B
Barosl Lee 已提交
2756
        assert_eq!(Array(vec![Boolean(true)]).to_string(), "[true]");
2757
        assert_eq!(
2758
            Array(vec![Boolean(true)]).pretty().to_string(),
2759
            "\
2760 2761
            [\n  \
                true\n\
2762
            ]"
2763
        );
2764

C
Corey Farwell 已提交
2765
        let long_test_array = Array(vec![
2766 2767
            Boolean(false),
            Null,
A
Alex Crichton 已提交
2768
            Array(vec![String("foo\nbar".to_string()), F64(3.5)])]);
2769

B
Barosl Lee 已提交
2770
        assert_eq!(long_test_array.to_string(),
2771
            "[false,null,[\"foo\\nbar\",3.5]]");
2772
        assert_eq!(
2773
            long_test_array.pretty().to_string(),
2774
            "\
2775 2776 2777 2778 2779 2780 2781
            [\n  \
                false,\n  \
                null,\n  \
                [\n    \
                    \"foo\\nbar\",\n    \
                    3.5\n  \
                ]\n\
2782
            ]"
2783 2784 2785
        );
    }

2786
    #[test]
2787
    fn test_write_object() {
B
Barosl Lee 已提交
2788
        assert_eq!(mk_object(&[]).to_string(), "{}");
2789
        assert_eq!(mk_object(&[]).pretty().to_string(), "{}");
2790

2791
        assert_eq!(
N
Nick Cameron 已提交
2792
            mk_object(&[
A
Alex Crichton 已提交
2793
                ("a".to_string(), Boolean(true))
B
Barosl Lee 已提交
2794
            ]).to_string(),
2795
            "{\"a\":true}"
2796
        );
2797
        assert_eq!(
2798
            mk_object(&[("a".to_string(), Boolean(true))]).pretty().to_string(),
2799
            "\
2800 2801
            {\n  \
                \"a\": true\n\
2802
            }"
2803 2804
        );

N
Nick Cameron 已提交
2805
        let complex_obj = mk_object(&[
A
Alex Crichton 已提交
2806 2807 2808
                ("b".to_string(), Array(vec![
                    mk_object(&[("c".to_string(), String("\x0c\r".to_string()))]),
                    mk_object(&[("d".to_string(), String("".to_string()))])
2809
                ]))
2810 2811 2812
            ]);

        assert_eq!(
B
Barosl Lee 已提交
2813
            complex_obj.to_string(),
2814
            "{\
2815 2816 2817 2818
                \"b\":[\
                    {\"c\":\"\\f\\r\"},\
                    {\"d\":\"\"}\
                ]\
2819
            }"
2820 2821
        );
        assert_eq!(
2822
            complex_obj.pretty().to_string(),
2823
            "\
2824 2825 2826 2827 2828 2829 2830 2831 2832
            {\n  \
                \"b\": [\n    \
                    {\n      \
                        \"c\": \"\\f\\r\"\n    \
                    },\n    \
                    {\n      \
                        \"d\": \"\"\n    \
                    }\n  \
                ]\n\
2833
            }"
2834
        );
2835

N
Nick Cameron 已提交
2836
        let a = mk_object(&[
A
Alex Crichton 已提交
2837 2838 2839 2840
            ("a".to_string(), Boolean(true)),
            ("b".to_string(), Array(vec![
                mk_object(&[("c".to_string(), String("\x0c\r".to_string()))]),
                mk_object(&[("d".to_string(), String("".to_string()))])
2841
            ]))
G
Graydon Hoare 已提交
2842
        ]);
2843

2844 2845
        // We can't compare the strings directly because the object fields be
        // printed in a different order.
2846 2847
        assert_eq!(a.clone(), a.to_string().parse().unwrap());
        assert_eq!(a.clone(), a.pretty().to_string().parse().unwrap());
A
Alex Crichton 已提交
2848 2849
    }

2850
    #[test]
2851
    fn test_write_enum() {
2852
        let animal = Dog;
2853
        assert_eq!(
2854
            format!("{}", super::as_json(&animal)),
2855
            "\"Dog\""
2856 2857
        );
        assert_eq!(
2858
            format!("{}", super::as_pretty_json(&animal)),
2859
            "\"Dog\""
2860
        );
2861

A
Alex Crichton 已提交
2862
        let animal = Frog("Henry".to_string(), 349);
2863
        assert_eq!(
2864
            format!("{}", super::as_json(&animal)),
2865
            "{\"variant\":\"Frog\",\"fields\":[\"Henry\",349]}"
2866 2867
        );
        assert_eq!(
2868
            format!("{}", super::as_pretty_json(&animal)),
2869 2870 2871 2872 2873 2874
            "{\n  \
               \"variant\": \"Frog\",\n  \
               \"fields\": [\n    \
                 \"Henry\",\n    \
                 349\n  \
               ]\n\
2875
             }"
2876
        );
2877 2878
    }

2879
    macro_rules! check_encoder_for_simple {
2880
        ($value:expr, $expected:expr) => ({
2881
            let s = format!("{}", super::as_json(&$value));
2882 2883
            assert_eq!(s, $expected);

2884
            let s = format!("{}", super::as_pretty_json(&$value));
2885 2886
            assert_eq!(s, $expected);
        })
2887
    }
2888

2889
    #[test]
2890
    fn test_write_some() {
2891
        check_encoder_for_simple!(Some("jodhpurs".to_string()), "\"jodhpurs\"");
2892 2893
    }

2894
    #[test]
2895
    fn test_write_none() {
2896 2897 2898 2899 2900 2901 2902
        check_encoder_for_simple!(None::<string::String>, "null");
    }

    #[test]
    fn test_write_char() {
        check_encoder_for_simple!('a', "\"a\"");
        check_encoder_for_simple!('\t', "\"\\t\"");
2903 2904 2905
        check_encoder_for_simple!('\u{0000}', "\"\\u0000\"");
        check_encoder_for_simple!('\u{001b}', "\"\\u001b\"");
        check_encoder_for_simple!('\u{007f}', "\"\\u007f\"");
2906 2907 2908
        check_encoder_for_simple!('\u{00a0}', "\"\u{00a0}\"");
        check_encoder_for_simple!('\u{abcd}', "\"\u{abcd}\"");
        check_encoder_for_simple!('\u{10ffff}', "\"\u{10ffff}\"");
2909 2910
    }

2911
    #[test]
2912
    fn test_trailing_characters() {
2913 2914 2915 2916 2917 2918
        assert_eq!(from_str("nulla"),  Err(SyntaxError(TrailingCharacters, 1, 5)));
        assert_eq!(from_str("truea"),  Err(SyntaxError(TrailingCharacters, 1, 5)));
        assert_eq!(from_str("falsea"), Err(SyntaxError(TrailingCharacters, 1, 6)));
        assert_eq!(from_str("1a"),     Err(SyntaxError(TrailingCharacters, 1, 2)));
        assert_eq!(from_str("[]a"),    Err(SyntaxError(TrailingCharacters, 1, 3)));
        assert_eq!(from_str("{}a"),    Err(SyntaxError(TrailingCharacters, 1, 3)));
2919 2920 2921 2922
    }

    #[test]
    fn test_read_identifiers() {
2923 2924 2925 2926 2927 2928
        assert_eq!(from_str("n"),    Err(SyntaxError(InvalidSyntax, 1, 2)));
        assert_eq!(from_str("nul"),  Err(SyntaxError(InvalidSyntax, 1, 4)));
        assert_eq!(from_str("t"),    Err(SyntaxError(InvalidSyntax, 1, 2)));
        assert_eq!(from_str("truz"), Err(SyntaxError(InvalidSyntax, 1, 4)));
        assert_eq!(from_str("f"),    Err(SyntaxError(InvalidSyntax, 1, 2)));
        assert_eq!(from_str("faz"),  Err(SyntaxError(InvalidSyntax, 1, 3)));
2929

E
Erick Tryzelaar 已提交
2930 2931 2932 2933 2934 2935
        assert_eq!(from_str("null"), Ok(Null));
        assert_eq!(from_str("true"), Ok(Boolean(true)));
        assert_eq!(from_str("false"), Ok(Boolean(false)));
        assert_eq!(from_str(" null "), Ok(Null));
        assert_eq!(from_str(" true "), Ok(Boolean(true)));
        assert_eq!(from_str(" false "), Ok(Boolean(false)));
2936 2937
    }

2938 2939
    #[test]
    fn test_decode_identifiers() {
2940
        let v: () = super::decode("null").unwrap();
2941 2942
        assert_eq!(v, ());

2943
        let v: bool = super::decode("true").unwrap();
2944 2945
        assert_eq!(v, true);

2946
        let v: bool = super::decode("false").unwrap();
2947 2948 2949
        assert_eq!(v, false);
    }

2950
    #[test]
2951
    fn test_read_number() {
2952 2953
        assert_eq!(from_str("+"),   Err(SyntaxError(InvalidSyntax, 1, 1)));
        assert_eq!(from_str("."),   Err(SyntaxError(InvalidSyntax, 1, 1)));
M
mrec 已提交
2954
        assert_eq!(from_str("NaN"), Err(SyntaxError(InvalidSyntax, 1, 1)));
2955 2956 2957 2958 2959
        assert_eq!(from_str("-"),   Err(SyntaxError(InvalidNumber, 1, 2)));
        assert_eq!(from_str("00"),  Err(SyntaxError(InvalidNumber, 1, 2)));
        assert_eq!(from_str("1."),  Err(SyntaxError(InvalidNumber, 1, 3)));
        assert_eq!(from_str("1e"),  Err(SyntaxError(InvalidNumber, 1, 3)));
        assert_eq!(from_str("1e+"), Err(SyntaxError(InvalidNumber, 1, 4)));
2960

2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975
        assert_eq!(from_str("18446744073709551616"), Err(SyntaxError(InvalidNumber, 1, 20)));
        assert_eq!(from_str("-9223372036854775809"), Err(SyntaxError(InvalidNumber, 1, 21)));

        assert_eq!(from_str("3"), Ok(U64(3)));
        assert_eq!(from_str("3.1"), Ok(F64(3.1)));
        assert_eq!(from_str("-1.2"), Ok(F64(-1.2)));
        assert_eq!(from_str("0.4"), Ok(F64(0.4)));
        assert_eq!(from_str("0.4e5"), Ok(F64(0.4e5)));
        assert_eq!(from_str("0.4e+15"), Ok(F64(0.4e15)));
        assert_eq!(from_str("0.4e-01"), Ok(F64(0.4e-01)));
        assert_eq!(from_str(" 3 "), Ok(U64(3)));

        assert_eq!(from_str("-9223372036854775808"), Ok(I64(i64::MIN)));
        assert_eq!(from_str("9223372036854775807"), Ok(U64(i64::MAX as u64)));
        assert_eq!(from_str("18446744073709551615"), Ok(U64(u64::MAX)));
2976 2977
    }

2978 2979
    #[test]
    fn test_decode_numbers() {
2980
        let v: f64 = super::decode("3").unwrap();
D
Daniel Micay 已提交
2981
        assert_eq!(v, 3.0);
2982

2983
        let v: f64 = super::decode("3.1").unwrap();
D
Daniel Micay 已提交
2984
        assert_eq!(v, 3.1);
2985

2986
        let v: f64 = super::decode("-1.2").unwrap();
D
Daniel Micay 已提交
2987
        assert_eq!(v, -1.2);
2988

2989
        let v: f64 = super::decode("0.4").unwrap();
D
Daniel Micay 已提交
2990
        assert_eq!(v, 0.4);
2991

2992
        let v: f64 = super::decode("0.4e5").unwrap();
D
Daniel Micay 已提交
2993
        assert_eq!(v, 0.4e5);
2994

2995
        let v: f64 = super::decode("0.4e15").unwrap();
D
Daniel Micay 已提交
2996
        assert_eq!(v, 0.4e15);
2997

2998
        let v: f64 = super::decode("0.4e-01").unwrap();
D
Daniel Micay 已提交
2999
        assert_eq!(v, 0.4e-01);
3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011

        let v: u64 = super::decode("0").unwrap();
        assert_eq!(v, 0);

        let v: u64 = super::decode("18446744073709551615").unwrap();
        assert_eq!(v, u64::MAX);

        let v: i64 = super::decode("-9223372036854775808").unwrap();
        assert_eq!(v, i64::MIN);

        let v: i64 = super::decode("9223372036854775807").unwrap();
        assert_eq!(v, i64::MAX);
3012 3013

        let res: DecodeResult<i64> = super::decode("765.25252");
A
Alex Crichton 已提交
3014 3015
        assert_eq!(res, Err(ExpectedError("Integer".to_string(),
                                          "765.25252".to_string())));
3016 3017
    }

G
Gary Linscott 已提交
3018
    #[test]
3019
    fn test_read_str() {
3020 3021 3022
        assert_eq!(from_str("\""),    Err(SyntaxError(EOFWhileParsingString, 1, 2)));
        assert_eq!(from_str("\"lol"), Err(SyntaxError(EOFWhileParsingString, 1, 5)));

A
Alex Crichton 已提交
3023 3024 3025 3026 3027 3028 3029 3030 3031 3032
        assert_eq!(from_str("\"\""), Ok(String("".to_string())));
        assert_eq!(from_str("\"foo\""), Ok(String("foo".to_string())));
        assert_eq!(from_str("\"\\\"\""), Ok(String("\"".to_string())));
        assert_eq!(from_str("\"\\b\""), Ok(String("\x08".to_string())));
        assert_eq!(from_str("\"\\n\""), Ok(String("\n".to_string())));
        assert_eq!(from_str("\"\\r\""), Ok(String("\r".to_string())));
        assert_eq!(from_str("\"\\t\""), Ok(String("\t".to_string())));
        assert_eq!(from_str(" \"foo\" "), Ok(String("foo".to_string())));
        assert_eq!(from_str("\"\\u12ab\""), Ok(String("\u{12ab}".to_string())));
        assert_eq!(from_str("\"\\uAB12\""), Ok(String("\u{AB12}".to_string())));
3033 3034
    }

3035
    #[test]
3036
    fn test_decode_str() {
3037 3038 3039 3040 3041 3042 3043
        let s = [("\"\"", ""),
                 ("\"foo\"", "foo"),
                 ("\"\\\"\"", "\""),
                 ("\"\\b\"", "\x08"),
                 ("\"\\n\"", "\n"),
                 ("\"\\r\"", "\r"),
                 ("\"\\t\"", "\t"),
A
Alex Crichton 已提交
3044 3045
                 ("\"\\u12ab\"", "\u{12ab}"),
                 ("\"\\uAB12\"", "\u{AB12}")];
3046

3047
        for &(i, o) in &s {
3048
            let v: string::String = super::decode(i).unwrap();
3049
            assert_eq!(v, o);
3050
        }
3051 3052
    }

3053
    #[test]
C
Corey Farwell 已提交
3054
    fn test_read_array() {
3055
        assert_eq!(from_str("["),     Err(SyntaxError(EOFWhileParsingValue, 1, 2)));
C
Corey Farwell 已提交
3056
        assert_eq!(from_str("[1"),    Err(SyntaxError(EOFWhileParsingArray, 1, 3)));
3057 3058 3059
        assert_eq!(from_str("[1,"),   Err(SyntaxError(EOFWhileParsingValue, 1, 4)));
        assert_eq!(from_str("[1,]"),  Err(SyntaxError(InvalidSyntax,        1, 4)));
        assert_eq!(from_str("[6 7]"), Err(SyntaxError(InvalidSyntax,        1, 4)));
3060

C
Corey Farwell 已提交
3061 3062 3063 3064 3065
        assert_eq!(from_str("[]"), Ok(Array(vec![])));
        assert_eq!(from_str("[ ]"), Ok(Array(vec![])));
        assert_eq!(from_str("[true]"), Ok(Array(vec![Boolean(true)])));
        assert_eq!(from_str("[ false ]"), Ok(Array(vec![Boolean(false)])));
        assert_eq!(from_str("[null]"), Ok(Array(vec![Null])));
E
Erick Tryzelaar 已提交
3066
        assert_eq!(from_str("[3, 1]"),
C
Corey Farwell 已提交
3067
                     Ok(Array(vec![U64(3), U64(1)])));
E
Erick Tryzelaar 已提交
3068
        assert_eq!(from_str("\n[3, 2]\n"),
C
Corey Farwell 已提交
3069
                     Ok(Array(vec![U64(3), U64(2)])));
E
Erick Tryzelaar 已提交
3070
        assert_eq!(from_str("[2, [4, 1]]"),
C
Corey Farwell 已提交
3071
               Ok(Array(vec![U64(2), Array(vec![U64(4), U64(1)])])));
3072 3073
    }

3074
    #[test]
C
Corey Farwell 已提交
3075
    fn test_decode_array() {
3076
        let v: Vec<()> = super::decode("[]").unwrap();
3077
        assert_eq!(v, []);
3078

3079
        let v: Vec<()> = super::decode("[null]").unwrap();
3080
        assert_eq!(v, [()]);
3081

3082
        let v: Vec<bool> = super::decode("[true]").unwrap();
3083
        assert_eq!(v, [true]);
3084

3085
        let v: Vec<int> = super::decode("[3, 1]").unwrap();
3086
        assert_eq!(v, [3, 1]);
3087

3088
        let v: Vec<Vec<uint>> = super::decode("[[3], [1, 2]]").unwrap();
3089
        assert_eq!(v, [vec![3], vec![1, 2]]);
3090 3091
    }

3092 3093 3094
    #[test]
    fn test_decode_tuple() {
        let t: (uint, uint, uint) = super::decode("[1, 2, 3]").unwrap();
A
Alfie John 已提交
3095
        assert_eq!(t, (1, 2, 3));
3096 3097

        let t: (uint, string::String) = super::decode("[1, \"two\"]").unwrap();
A
Alfie John 已提交
3098
        assert_eq!(t, (1, "two".to_string()));
3099 3100 3101 3102 3103 3104 3105 3106 3107
    }

    #[test]
    fn test_decode_tuple_malformed_types() {
        assert!(super::decode::<(uint, string::String)>("[1, 2]").is_err());
    }

    #[test]
    fn test_decode_tuple_malformed_length() {
3108
        assert!(super::decode::<(uint, uint)>("[1, 2, 3]").is_err());
3109 3110
    }

3111
    #[test]
3112
    fn test_read_object() {
3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124
        assert_eq!(from_str("{"),       Err(SyntaxError(EOFWhileParsingObject, 1, 2)));
        assert_eq!(from_str("{ "),      Err(SyntaxError(EOFWhileParsingObject, 1, 3)));
        assert_eq!(from_str("{1"),      Err(SyntaxError(KeyMustBeAString,      1, 2)));
        assert_eq!(from_str("{ \"a\""), Err(SyntaxError(EOFWhileParsingObject, 1, 6)));
        assert_eq!(from_str("{\"a\""),  Err(SyntaxError(EOFWhileParsingObject, 1, 5)));
        assert_eq!(from_str("{\"a\" "), Err(SyntaxError(EOFWhileParsingObject, 1, 6)));

        assert_eq!(from_str("{\"a\" 1"),   Err(SyntaxError(ExpectedColon,         1, 6)));
        assert_eq!(from_str("{\"a\":"),    Err(SyntaxError(EOFWhileParsingValue,  1, 6)));
        assert_eq!(from_str("{\"a\":1"),   Err(SyntaxError(EOFWhileParsingObject, 1, 7)));
        assert_eq!(from_str("{\"a\":1 1"), Err(SyntaxError(InvalidSyntax,         1, 8)));
        assert_eq!(from_str("{\"a\":1,"),  Err(SyntaxError(EOFWhileParsingObject, 1, 8)));
3125

N
Nick Cameron 已提交
3126
        assert_eq!(from_str("{}").unwrap(), mk_object(&[]));
E
Erick Tryzelaar 已提交
3127
        assert_eq!(from_str("{\"a\": 3}").unwrap(),
A
Alex Crichton 已提交
3128
                  mk_object(&[("a".to_string(), U64(3))]));
3129

E
Erick Tryzelaar 已提交
3130 3131
        assert_eq!(from_str(
                      "{ \"a\": null, \"b\" : true }").unwrap(),
N
Nick Cameron 已提交
3132
                  mk_object(&[
A
Alex Crichton 已提交
3133 3134
                      ("a".to_string(), Null),
                      ("b".to_string(), Boolean(true))]));
E
Erick Tryzelaar 已提交
3135
        assert_eq!(from_str("\n{ \"a\": null, \"b\" : true }\n").unwrap(),
N
Nick Cameron 已提交
3136
                  mk_object(&[
A
Alex Crichton 已提交
3137 3138
                      ("a".to_string(), Null),
                      ("b".to_string(), Boolean(true))]));
E
Erick Tryzelaar 已提交
3139 3140
        assert_eq!(from_str(
                      "{\"a\" : 1.0 ,\"b\": [ true ]}").unwrap(),
N
Nick Cameron 已提交
3141
                  mk_object(&[
A
Alex Crichton 已提交
3142 3143
                      ("a".to_string(), F64(1.0)),
                      ("b".to_string(), Array(vec![Boolean(true)]))
3144
                  ]));
E
Erick Tryzelaar 已提交
3145
        assert_eq!(from_str(
3146 3147 3148 3149 3150 3151 3152 3153
                      "{\
                          \"a\": 1.0, \
                          \"b\": [\
                              true,\
                              \"foo\\nbar\", \
                              { \"c\": {\"d\": null} } \
                          ]\
                      }").unwrap(),
N
Nick Cameron 已提交
3154
                  mk_object(&[
A
Alex Crichton 已提交
3155 3156
                      ("a".to_string(), F64(1.0)),
                      ("b".to_string(), Array(vec![
B
Ben Striegel 已提交
3157
                          Boolean(true),
A
Alex Crichton 已提交
3158
                          String("foo\nbar".to_string()),
N
Nick Cameron 已提交
3159
                          mk_object(&[
A
Alex Crichton 已提交
3160
                              ("c".to_string(), mk_object(&[("d".to_string(), Null)]))
3161 3162
                          ])
                      ]))
3163
                  ]));
3164 3165
    }

3166
    #[test]
3167
    fn test_decode_struct() {
3168
        let s = "{
3169 3170 3171
            \"inner\": [
                { \"a\": null, \"b\": 2, \"c\": [\"abc\", \"xyz\"] }
            ]
3172
        }";
3173 3174

        let v: Outer = super::decode(s).unwrap();
3175 3176 3177
        assert_eq!(
            v,
            Outer {
K
Kevin Ballard 已提交
3178
                inner: vec![
A
Alex Crichton 已提交
3179
                    Inner { a: (), b: 2, c: vec!["abc".to_string(), "xyz".to_string()] }
3180 3181 3182 3183 3184
                ]
            }
        );
    }

3185
    #[derive(RustcDecodable)]
M
mrec 已提交
3186 3187 3188 3189 3190 3191
    struct FloatStruct {
        f: f64,
        a: Vec<f64>
    }
    #[test]
    fn test_decode_struct_with_nan() {
3192 3193 3194
        let s = "{\"f\":null,\"a\":[null,123]}";
        let obj: FloatStruct = super::decode(s).unwrap();
        assert!(obj.f.is_nan());
N
NODA, Kai 已提交
3195 3196
        assert!(obj.a[0].is_nan());
        assert_eq!(obj.a[1], 123f64);
M
mrec 已提交
3197 3198
    }

3199 3200
    #[test]
    fn test_decode_option() {
3201
        let value: Option<string::String> = super::decode("null").unwrap();
3202 3203
        assert_eq!(value, None);

3204
        let value: Option<string::String> = super::decode("\"jodhpurs\"").unwrap();
A
Alex Crichton 已提交
3205
        assert_eq!(value, Some("jodhpurs".to_string()));
3206 3207
    }

3208
    #[test]
3209
    fn test_decode_enum() {
3210
        let value: Animal = super::decode("\"Dog\"").unwrap();
3211 3212
        assert_eq!(value, Dog);

3213
        let s = "{\"variant\":\"Frog\",\"fields\":[\"Henry\",349]}";
3214
        let value: Animal = super::decode(s).unwrap();
A
Alex Crichton 已提交
3215
        assert_eq!(value, Frog("Henry".to_string(), 349));
3216 3217
    }

3218
    #[test]
3219
    fn test_decode_map() {
3220
        let s = "{\"a\": \"Dog\", \"b\": {\"variant\":\"Frog\",\
3221
                  \"fields\":[\"Henry\", 349]}}";
A
Alexis Beingessner 已提交
3222
        let mut map: BTreeMap<string::String, Animal> = super::decode(s).unwrap();
3223

A
Alex Crichton 已提交
3224 3225
        assert_eq!(map.remove(&"a".to_string()), Some(Dog));
        assert_eq!(map.remove(&"b".to_string()), Some(Frog("Henry".to_string(), 349)));
3226 3227
    }

3228
    #[test]
3229
    fn test_multiline_errors() {
E
Erick Tryzelaar 已提交
3230
        assert_eq!(from_str("{\n  \"foo\":\n \"bar\""),
A
Alfie John 已提交
3231
            Err(SyntaxError(EOFWhileParsingObject, 3, 8)));
3232
    }
3233

3234
    #[derive(RustcDecodable)]
M
mrec 已提交
3235
    #[allow(dead_code)]
3236 3237 3238
    struct DecodeStruct {
        x: f64,
        y: bool,
3239
        z: string::String,
K
Kevin Ballard 已提交
3240
        w: Vec<DecodeStruct>
3241
    }
3242
    #[derive(RustcDecodable)]
3243 3244
    enum DecodeEnum {
        A(f64),
3245
        B(string::String)
3246
    }
3247
    fn check_err<T: Decodable>(to_parse: &'static str, expected: DecoderError) {
S
Sean McArthur 已提交
3248
        let res: DecodeResult<T> = match from_str(to_parse) {
3249
            Err(e) => Err(ParseError(e)),
S
Sean McArthur 已提交
3250 3251
            Ok(json) => Decodable::decode(&mut Decoder::new(json))
        };
3252
        match res {
3253
            Ok(_) => panic!("`{:?}` parsed & decoded ok, expecting error `{:?}`",
S
Sean McArthur 已提交
3254
                              to_parse, expected),
3255
            Err(ParseError(e)) => panic!("`{:?}` is not valid json: {:?}",
S
Sean McArthur 已提交
3256
                                           to_parse, e),
3257
            Err(e) => {
S
Sean McArthur 已提交
3258
                assert_eq!(e, expected);
3259 3260 3261 3262 3263
            }
        }
    }
    #[test]
    fn test_decode_errors_struct() {
A
Alex Crichton 已提交
3264
        check_err::<DecodeStruct>("[]", ExpectedError("Object".to_string(), "[]".to_string()));
3265
        check_err::<DecodeStruct>("{\"x\": true, \"y\": true, \"z\": \"\", \"w\": []}",
A
Alex Crichton 已提交
3266
                                  ExpectedError("Number".to_string(), "true".to_string()));
3267
        check_err::<DecodeStruct>("{\"x\": 1, \"y\": [], \"z\": \"\", \"w\": []}",
A
Alex Crichton 已提交
3268
                                  ExpectedError("Boolean".to_string(), "[]".to_string()));
3269
        check_err::<DecodeStruct>("{\"x\": 1, \"y\": true, \"z\": {}, \"w\": []}",
A
Alex Crichton 已提交
3270
                                  ExpectedError("String".to_string(), "{}".to_string()));
3271
        check_err::<DecodeStruct>("{\"x\": 1, \"y\": true, \"z\": \"\", \"w\": null}",
A
Alex Crichton 已提交
3272
                                  ExpectedError("Array".to_string(), "null".to_string()));
3273
        check_err::<DecodeStruct>("{\"x\": 1, \"y\": true, \"z\": \"\"}",
A
Alex Crichton 已提交
3274
                                  MissingFieldError("w".to_string()));
3275 3276 3277 3278
    }
    #[test]
    fn test_decode_errors_enum() {
        check_err::<DecodeEnum>("{}",
A
Alex Crichton 已提交
3279
                                MissingFieldError("variant".to_string()));
3280
        check_err::<DecodeEnum>("{\"variant\": 1}",
A
Alex Crichton 已提交
3281
                                ExpectedError("String".to_string(), "1".to_string()));
3282
        check_err::<DecodeEnum>("{\"variant\": \"A\"}",
A
Alex Crichton 已提交
3283
                                MissingFieldError("fields".to_string()));
3284
        check_err::<DecodeEnum>("{\"variant\": \"A\", \"fields\": null}",
A
Alex Crichton 已提交
3285
                                ExpectedError("Array".to_string(), "null".to_string()));
3286
        check_err::<DecodeEnum>("{\"variant\": \"C\", \"fields\": []}",
A
Alex Crichton 已提交
3287
                                UnknownVariantError("C".to_string()));
3288
    }
3289 3290 3291 3292

    #[test]
    fn test_find(){
        let json_value = from_str("{\"dog\" : \"cat\"}").unwrap();
3293 3294
        let found_str = json_value.find("dog");
        assert!(found_str.unwrap().as_string().unwrap() == "cat");
3295 3296 3297 3298 3299
    }

    #[test]
    fn test_find_path(){
        let json_value = from_str("{\"dog\":{\"cat\": {\"mouse\" : \"cheese\"}}}").unwrap();
3300 3301
        let found_str = json_value.find_path(&["dog", "cat", "mouse"]);
        assert!(found_str.unwrap().as_string().unwrap() == "cheese");
3302 3303 3304 3305 3306
    }

    #[test]
    fn test_search(){
        let json_value = from_str("{\"dog\":{\"cat\": {\"mouse\" : \"cheese\"}}}").unwrap();
3307
        let found_str = json_value.search("mouse").and_then(|j| j.as_string());
3308
        assert!(found_str.unwrap() == "cheese");
3309 3310
    }

3311 3312 3313
    #[test]
    fn test_index(){
        let json_value = from_str("{\"animals\":[\"dog\",\"cat\",\"mouse\"]}").unwrap();
C
Corey Farwell 已提交
3314 3315 3316 3317
        let ref array = json_value["animals"];
        assert_eq!(array[0].as_string().unwrap(), "dog");
        assert_eq!(array[1].as_string().unwrap(), "cat");
        assert_eq!(array[2].as_string().unwrap(), "mouse");
3318 3319
    }

3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333
    #[test]
    fn test_is_object(){
        let json_value = from_str("{}").unwrap();
        assert!(json_value.is_object());
    }

    #[test]
    fn test_as_object(){
        let json_value = from_str("{}").unwrap();
        let json_object = json_value.as_object();
        assert!(json_object.is_some());
    }

    #[test]
C
Corey Farwell 已提交
3334
    fn test_is_array(){
3335
        let json_value = from_str("[1, 2, 3]").unwrap();
C
Corey Farwell 已提交
3336
        assert!(json_value.is_array());
3337 3338 3339
    }

    #[test]
C
Corey Farwell 已提交
3340
    fn test_as_array(){
3341
        let json_value = from_str("[1, 2, 3]").unwrap();
C
Corey Farwell 已提交
3342
        let json_array = json_value.as_array();
3343
        let expected_length = 3;
C
Corey Farwell 已提交
3344
        assert!(json_array.is_some() && json_array.unwrap().len() == expected_length);
3345 3346 3347
    }

    #[test]
3348
    fn test_is_string(){
3349
        let json_value = from_str("\"dog\"").unwrap();
3350
        assert!(json_value.is_string());
3351 3352 3353
    }

    #[test]
3354
    fn test_as_string(){
3355
        let json_value = from_str("\"dog\"").unwrap();
3356
        let json_str = json_value.as_string();
3357
        let expected_str = "dog";
3358 3359 3360 3361 3362 3363 3364 3365 3366 3367
        assert_eq!(json_str, Some(expected_str));
    }

    #[test]
    fn test_is_number(){
        let json_value = from_str("12").unwrap();
        assert!(json_value.is_number());
    }

    #[test]
3368
    fn test_is_i64(){
3369
        let json_value = from_str("-12").unwrap();
3370 3371
        assert!(json_value.is_i64());

3372 3373 3374
        let json_value = from_str("12").unwrap();
        assert!(!json_value.is_i64());

3375 3376 3377 3378
        let json_value = from_str("12.0").unwrap();
        assert!(!json_value.is_i64());
    }

3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390
    #[test]
    fn test_is_u64(){
        let json_value = from_str("12").unwrap();
        assert!(json_value.is_u64());

        let json_value = from_str("-12").unwrap();
        assert!(!json_value.is_u64());

        let json_value = from_str("12.0").unwrap();
        assert!(!json_value.is_u64());
    }

3391 3392
    #[test]
    fn test_is_f64(){
3393
        let json_value = from_str("12").unwrap();
3394 3395
        assert!(!json_value.is_f64());

3396 3397 3398
        let json_value = from_str("-12").unwrap();
        assert!(!json_value.is_f64());

3399 3400
        let json_value = from_str("12.0").unwrap();
        assert!(json_value.is_f64());
3401 3402 3403

        let json_value = from_str("-12.0").unwrap();
        assert!(json_value.is_f64());
3404 3405 3406 3407
    }

    #[test]
    fn test_as_i64(){
3408
        let json_value = from_str("-12").unwrap();
3409
        let json_num = json_value.as_i64();
3410 3411 3412 3413 3414 3415 3416
        assert_eq!(json_num, Some(-12));
    }

    #[test]
    fn test_as_u64(){
        let json_value = from_str("12").unwrap();
        let json_num = json_value.as_u64();
3417 3418 3419 3420 3421 3422 3423 3424
        assert_eq!(json_num, Some(12));
    }

    #[test]
    fn test_as_f64(){
        let json_value = from_str("12.0").unwrap();
        let json_num = json_value.as_f64();
        assert_eq!(json_num, Some(12f64));
3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453
    }

    #[test]
    fn test_is_boolean(){
        let json_value = from_str("false").unwrap();
        assert!(json_value.is_boolean());
    }

    #[test]
    fn test_as_boolean(){
        let json_value = from_str("false").unwrap();
        let json_bool = json_value.as_boolean();
        let expected_bool = false;
        assert!(json_bool.is_some() && json_bool.unwrap() == expected_bool);
    }

    #[test]
    fn test_is_null(){
        let json_value = from_str("null").unwrap();
        assert!(json_value.is_null());
    }

    #[test]
    fn test_as_null(){
        let json_value = from_str("null").unwrap();
        let json_null = json_value.as_null();
        let expected_null = ();
        assert!(json_null.is_some() && json_null.unwrap() == expected_null);
    }
3454 3455 3456 3457

    #[test]
    fn test_encode_hashmap_with_numeric_key() {
        use std::str::from_utf8;
A
Alex Crichton 已提交
3458
        use std::old_io::Writer;
3459
        use std::collections::HashMap;
3460 3461
        let mut hm: HashMap<uint, bool> = HashMap::new();
        hm.insert(1, true);
D
Daniel Micay 已提交
3462
        let mut mem_buf = Vec::new();
3463
        write!(&mut mem_buf, "{}", super::as_pretty_json(&hm)).unwrap();
3464
        let json_str = from_utf8(&mem_buf[..]).unwrap();
3465
        match from_str(json_str) {
3466
            Err(_) => panic!("Unable to parse json_str: {:?}", json_str),
3467 3468 3469
            _ => {} // it parsed and we are good to go
        }
    }
3470

3471 3472 3473
    #[test]
    fn test_prettyencode_hashmap_with_numeric_key() {
        use std::str::from_utf8;
A
Alex Crichton 已提交
3474
        use std::old_io::Writer;
3475
        use std::collections::HashMap;
3476 3477
        let mut hm: HashMap<uint, bool> = HashMap::new();
        hm.insert(1, true);
D
Daniel Micay 已提交
3478
        let mut mem_buf = Vec::new();
3479
        write!(&mut mem_buf, "{}", super::as_pretty_json(&hm)).unwrap();
3480
        let json_str = from_utf8(&mem_buf[..]).unwrap();
3481
        match from_str(json_str) {
3482
            Err(_) => panic!("Unable to parse json_str: {:?}", json_str),
3483 3484 3485
            _ => {} // it parsed and we are good to go
        }
    }
3486

3487 3488 3489
    #[test]
    fn test_prettyencoder_indent_level_param() {
        use std::str::from_utf8;
A
Alexis Beingessner 已提交
3490
        use std::collections::BTreeMap;
3491

A
Alexis Beingessner 已提交
3492
        let mut tree = BTreeMap::new();
3493

A
Alex Crichton 已提交
3494 3495
        tree.insert("hello".to_string(), String("guten tag".to_string()));
        tree.insert("goodbye".to_string(), String("sayonara".to_string()));
3496

C
Corey Farwell 已提交
3497
        let json = Array(
3498 3499 3500 3501
            // The following layout below should look a lot like
            // the pretty-printed JSON (indent * x)
            vec!
            ( // 0x
A
Alex Crichton 已提交
3502
                String("greetings".to_string()), // 1x
3503 3504
                Object(tree), // 1x + 2x + 2x + 1x
            ) // 0x
C
Corey Farwell 已提交
3505
            // End JSON array (7 lines)
3506 3507 3508 3509
        );

        // Helper function for counting indents
        fn indents(source: &str) -> uint {
3510
            let trimmed = source.trim_left_matches(' ');
3511 3512 3513 3514
            source.len() - trimmed.len()
        }

        // Test up to 4 spaces of indents (more?)
A
Alfie John 已提交
3515
        for i in 0..4 {
D
Daniel Micay 已提交
3516
            let mut writer = Vec::new();
3517 3518
            write!(&mut writer, "{}",
                   super::as_pretty_json(&json).indent(i)).unwrap();
3519

3520
            let printed = from_utf8(&writer[..]).unwrap();
3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538

            // Check for indents at each line
            let lines: Vec<&str> = printed.lines().collect();
            assert_eq!(lines.len(), 7); // JSON should be 7 lines

            assert_eq!(indents(lines[0]), 0 * i); // [
            assert_eq!(indents(lines[1]), 1 * i); //   "greetings",
            assert_eq!(indents(lines[2]), 1 * i); //   {
            assert_eq!(indents(lines[3]), 2 * i); //     "hello": "guten tag",
            assert_eq!(indents(lines[4]), 2 * i); //     "goodbye": "sayonara"
            assert_eq!(indents(lines[5]), 1 * i); //   },
            assert_eq!(indents(lines[6]), 0 * i); // ]

            // Finally, test that the pretty-printed JSON is valid
            from_str(printed).ok().expect("Pretty-printed JSON is invalid!");
        }
    }

3539 3540 3541 3542
    #[test]
    fn test_hashmap_with_enum_key() {
        use std::collections::HashMap;
        use json;
3543
        #[derive(RustcEncodable, Eq, Hash, PartialEq, RustcDecodable, Debug)]
3544 3545 3546 3547 3548 3549 3550 3551
        enum Enum {
            Foo,
            #[allow(dead_code)]
            Bar,
        }
        let mut map = HashMap::new();
        map.insert(Enum::Foo, 0);
        let result = json::encode(&map).unwrap();
3552
        assert_eq!(&result[..], r#"{"Foo":0}"#);
3553
        let decoded: HashMap<Enum, _> = json::decode(&result).unwrap();
3554 3555 3556
        assert_eq!(map, decoded);
    }

3557 3558
    #[test]
    fn test_hashmap_with_numeric_key_can_handle_double_quote_delimited_key() {
3559
        use std::collections::HashMap;
3560 3561 3562
        use Decodable;
        let json_str = "{\"1\":true}";
        let json_obj = match from_str(json_str) {
3563
            Err(_) => panic!("Unable to parse json_str: {:?}", json_str),
3564 3565 3566
            Ok(o) => o
        };
        let mut decoder = Decoder::new(json_obj);
S
Sean McArthur 已提交
3567
        let _hm: HashMap<uint, bool> = Decodable::decode(&mut decoder).unwrap();
3568
    }
3569

3570 3571 3572 3573 3574 3575
    #[test]
    fn test_hashmap_with_numeric_key_will_error_with_string_keys() {
        use std::collections::HashMap;
        use Decodable;
        let json_str = "{\"a\":true}";
        let json_obj = match from_str(json_str) {
3576
            Err(_) => panic!("Unable to parse json_str: {:?}", json_str),
3577 3578 3579 3580
            Ok(o) => o
        };
        let mut decoder = Decoder::new(json_obj);
        let result: Result<HashMap<uint, bool>, DecoderError> = Decodable::decode(&mut decoder);
A
Alex Crichton 已提交
3581
        assert_eq!(result, Err(ExpectedError("Number".to_string(), "a".to_string())));
3582 3583
    }

3584 3585
    fn assert_stream_equal(src: &str,
                           expected: Vec<(JsonEvent, Vec<StackElement>)>) {
3586 3587 3588 3589 3590 3591 3592
        let mut parser = Parser::new(src.chars());
        let mut i = 0;
        loop {
            let evt = match parser.next() {
                Some(e) => e,
                None => { break; }
            };
E
Erick Tryzelaar 已提交
3593
            let (ref expected_evt, ref expected_stack) = expected[i];
3594
            if !parser.stack().is_equal_to(expected_stack) {
3595
                panic!("Parser stack is not equal to {:?}", expected_stack);
3596 3597 3598 3599 3600 3601
            }
            assert_eq!(&evt, expected_evt);
            i+=1;
        }
    }
    #[test]
3602
    #[cfg_attr(target_pointer_width = "32", ignore)] // FIXME(#14064)
3603 3604
    fn test_streaming_parser() {
        assert_stream_equal(
3605
            r#"{ "foo":"bar", "array" : [0, 1, 2, 3, 4, 5], "idents":[null,true,false]}"#,
3606 3607
            vec![
                (ObjectStart,             vec![]),
3608 3609 3610 3611 3612 3613 3614 3615 3616 3617
                  (StringValue("bar".to_string()),   vec![StackElement::Key("foo")]),
                  (ArrayStart,            vec![StackElement::Key("array")]),
                    (U64Value(0),         vec![StackElement::Key("array"), StackElement::Index(0)]),
                    (U64Value(1),         vec![StackElement::Key("array"), StackElement::Index(1)]),
                    (U64Value(2),         vec![StackElement::Key("array"), StackElement::Index(2)]),
                    (U64Value(3),         vec![StackElement::Key("array"), StackElement::Index(3)]),
                    (U64Value(4),         vec![StackElement::Key("array"), StackElement::Index(4)]),
                    (U64Value(5),         vec![StackElement::Key("array"), StackElement::Index(5)]),
                  (ArrayEnd,              vec![StackElement::Key("array")]),
                  (ArrayStart,            vec![StackElement::Key("idents")]),
N
fallout  
Nick Cameron 已提交
3618 3619 3620 3621 3622 3623
                    (NullValue,           vec![StackElement::Key("idents"),
                                               StackElement::Index(0)]),
                    (BooleanValue(true),  vec![StackElement::Key("idents"),
                                               StackElement::Index(1)]),
                    (BooleanValue(false), vec![StackElement::Key("idents"),
                                               StackElement::Index(2)]),
3624
                  (ArrayEnd,              vec![StackElement::Key("idents")]),
3625
                (ObjectEnd,               vec![]),
3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638
            ]
        );
    }
    fn last_event(src: &str) -> JsonEvent {
        let mut parser = Parser::new(src.chars());
        let mut evt = NullValue;
        loop {
            evt = match parser.next() {
                Some(e) => e,
                None => return evt,
            }
        }
    }
3639

3640
    #[test]
3641
    #[cfg_attr(target_pointer_width = "32", ignore)] // FIXME(#14064)
3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653
    fn test_read_object_streaming() {
        assert_eq!(last_event("{ "),      Error(SyntaxError(EOFWhileParsingObject, 1, 3)));
        assert_eq!(last_event("{1"),      Error(SyntaxError(KeyMustBeAString,      1, 2)));
        assert_eq!(last_event("{ \"a\""), Error(SyntaxError(EOFWhileParsingObject, 1, 6)));
        assert_eq!(last_event("{\"a\""),  Error(SyntaxError(EOFWhileParsingObject, 1, 5)));
        assert_eq!(last_event("{\"a\" "), Error(SyntaxError(EOFWhileParsingObject, 1, 6)));

        assert_eq!(last_event("{\"a\" 1"),   Error(SyntaxError(ExpectedColon,         1, 6)));
        assert_eq!(last_event("{\"a\":"),    Error(SyntaxError(EOFWhileParsingValue,  1, 6)));
        assert_eq!(last_event("{\"a\":1"),   Error(SyntaxError(EOFWhileParsingObject, 1, 7)));
        assert_eq!(last_event("{\"a\":1 1"), Error(SyntaxError(InvalidSyntax,         1, 8)));
        assert_eq!(last_event("{\"a\":1,"),  Error(SyntaxError(EOFWhileParsingObject, 1, 8)));
3654
        assert_eq!(last_event("{\"a\":1,}"), Error(SyntaxError(TrailingComma, 1, 8)));
3655 3656 3657

        assert_stream_equal(
            "{}",
3658
            vec![(ObjectStart, vec![]), (ObjectEnd, vec![])]
3659 3660 3661
        );
        assert_stream_equal(
            "{\"a\": 3}",
3662 3663
            vec![
                (ObjectStart,        vec![]),
3664
                  (U64Value(3),      vec![StackElement::Key("a")]),
3665
                (ObjectEnd,          vec![]),
3666 3667 3668 3669
            ]
        );
        assert_stream_equal(
            "{ \"a\": null, \"b\" : true }",
3670 3671
            vec![
                (ObjectStart,           vec![]),
3672 3673
                  (NullValue,           vec![StackElement::Key("a")]),
                  (BooleanValue(true),  vec![StackElement::Key("b")]),
3674
                (ObjectEnd,             vec![]),
3675 3676 3677 3678
            ]
        );
        assert_stream_equal(
            "{\"a\" : 1.0 ,\"b\": [ true ]}",
3679 3680
            vec![
                (ObjectStart,           vec![]),
3681 3682 3683 3684
                  (F64Value(1.0),       vec![StackElement::Key("a")]),
                  (ArrayStart,          vec![StackElement::Key("b")]),
                    (BooleanValue(true),vec![StackElement::Key("b"), StackElement::Index(0)]),
                  (ArrayEnd,            vec![StackElement::Key("b")]),
3685
                (ObjectEnd,             vec![]),
3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696
            ]
        );
        assert_stream_equal(
            r#"{
                "a": 1.0,
                "b": [
                    true,
                    "foo\nbar",
                    { "c": {"d": null} }
                ]
            }"#,
3697 3698
            vec![
                (ObjectStart,                   vec![]),
3699 3700
                  (F64Value(1.0),               vec![StackElement::Key("a")]),
                  (ArrayStart,                  vec![StackElement::Key("b")]),
N
fallout  
Nick Cameron 已提交
3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718
                    (BooleanValue(true),        vec![StackElement::Key("b"),
                                                     StackElement::Index(0)]),
                    (StringValue("foo\nbar".to_string()),  vec![StackElement::Key("b"),
                                                                StackElement::Index(1)]),
                    (ObjectStart,               vec![StackElement::Key("b"),
                                                     StackElement::Index(2)]),
                      (ObjectStart,             vec![StackElement::Key("b"),
                                                     StackElement::Index(2),
                                                     StackElement::Key("c")]),
                        (NullValue,             vec![StackElement::Key("b"),
                                                     StackElement::Index(2),
                                                     StackElement::Key("c"),
                                                     StackElement::Key("d")]),
                      (ObjectEnd,               vec![StackElement::Key("b"),
                                                     StackElement::Index(2),
                                                     StackElement::Key("c")]),
                    (ObjectEnd,                 vec![StackElement::Key("b"),
                                                     StackElement::Index(2)]),
3719
                  (ArrayEnd,                    vec![StackElement::Key("b")]),
3720
                (ObjectEnd,                     vec![]),
3721 3722 3723 3724
            ]
        );
    }
    #[test]
3725
    #[cfg_attr(target_pointer_width = "32", ignore)] // FIXME(#14064)
C
Corey Farwell 已提交
3726
    fn test_read_array_streaming() {
3727 3728
        assert_stream_equal(
            "[]",
3729
            vec![
C
Corey Farwell 已提交
3730 3731
                (ArrayStart, vec![]),
                (ArrayEnd,   vec![]),
3732 3733 3734 3735
            ]
        );
        assert_stream_equal(
            "[ ]",
3736
            vec![
C
Corey Farwell 已提交
3737 3738
                (ArrayStart, vec![]),
                (ArrayEnd,   vec![]),
3739 3740 3741 3742
            ]
        );
        assert_stream_equal(
            "[true]",
3743
            vec![
C
Corey Farwell 已提交
3744
                (ArrayStart,             vec![]),
3745
                    (BooleanValue(true), vec![StackElement::Index(0)]),
C
Corey Farwell 已提交
3746
                (ArrayEnd,               vec![]),
3747 3748 3749 3750
            ]
        );
        assert_stream_equal(
            "[ false ]",
3751
            vec![
C
Corey Farwell 已提交
3752
                (ArrayStart,              vec![]),
3753
                    (BooleanValue(false), vec![StackElement::Index(0)]),
C
Corey Farwell 已提交
3754
                (ArrayEnd,                vec![]),
3755 3756 3757 3758
            ]
        );
        assert_stream_equal(
            "[null]",
3759
            vec![
C
Corey Farwell 已提交
3760
                (ArrayStart,    vec![]),
3761
                    (NullValue, vec![StackElement::Index(0)]),
C
Corey Farwell 已提交
3762
                (ArrayEnd,      vec![]),
3763 3764 3765 3766
            ]
        );
        assert_stream_equal(
            "[3, 1]",
3767
            vec![
C
Corey Farwell 已提交
3768
                (ArrayStart,      vec![]),
3769 3770
                    (U64Value(3), vec![StackElement::Index(0)]),
                    (U64Value(1), vec![StackElement::Index(1)]),
C
Corey Farwell 已提交
3771
                (ArrayEnd,        vec![]),
3772 3773 3774 3775
            ]
        );
        assert_stream_equal(
            "\n[3, 2]\n",
3776
            vec![
C
Corey Farwell 已提交
3777
                (ArrayStart,      vec![]),
3778 3779
                    (U64Value(3), vec![StackElement::Index(0)]),
                    (U64Value(2), vec![StackElement::Index(1)]),
C
Corey Farwell 已提交
3780
                (ArrayEnd,        vec![]),
3781 3782 3783 3784
            ]
        );
        assert_stream_equal(
            "[2, [4, 1]]",
3785
            vec![
C
Corey Farwell 已提交
3786
                (ArrayStart,           vec![]),
3787 3788 3789 3790 3791
                    (U64Value(2),      vec![StackElement::Index(0)]),
                    (ArrayStart,       vec![StackElement::Index(1)]),
                        (U64Value(4),  vec![StackElement::Index(1), StackElement::Index(0)]),
                        (U64Value(1),  vec![StackElement::Index(1), StackElement::Index(1)]),
                    (ArrayEnd,         vec![StackElement::Index(1)]),
C
Corey Farwell 已提交
3792
                (ArrayEnd,             vec![]),
3793 3794 3795 3796 3797 3798
            ]
        );

        assert_eq!(last_event("["), Error(SyntaxError(EOFWhileParsingValue, 1,  2)));

        assert_eq!(from_str("["),     Err(SyntaxError(EOFWhileParsingValue, 1, 2)));
C
Corey Farwell 已提交
3799
        assert_eq!(from_str("[1"),    Err(SyntaxError(EOFWhileParsingArray, 1, 3)));
3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839
        assert_eq!(from_str("[1,"),   Err(SyntaxError(EOFWhileParsingValue, 1, 4)));
        assert_eq!(from_str("[1,]"),  Err(SyntaxError(InvalidSyntax,        1, 4)));
        assert_eq!(from_str("[6 7]"), Err(SyntaxError(InvalidSyntax,        1, 4)));

    }
    #[test]
    fn test_trailing_characters_streaming() {
        assert_eq!(last_event("nulla"),  Error(SyntaxError(TrailingCharacters, 1, 5)));
        assert_eq!(last_event("truea"),  Error(SyntaxError(TrailingCharacters, 1, 5)));
        assert_eq!(last_event("falsea"), Error(SyntaxError(TrailingCharacters, 1, 6)));
        assert_eq!(last_event("1a"),     Error(SyntaxError(TrailingCharacters, 1, 2)));
        assert_eq!(last_event("[]a"),    Error(SyntaxError(TrailingCharacters, 1, 3)));
        assert_eq!(last_event("{}a"),    Error(SyntaxError(TrailingCharacters, 1, 3)));
    }
    #[test]
    fn test_read_identifiers_streaming() {
        assert_eq!(Parser::new("null".chars()).next(), Some(NullValue));
        assert_eq!(Parser::new("true".chars()).next(), Some(BooleanValue(true)));
        assert_eq!(Parser::new("false".chars()).next(), Some(BooleanValue(false)));

        assert_eq!(last_event("n"),    Error(SyntaxError(InvalidSyntax, 1, 2)));
        assert_eq!(last_event("nul"),  Error(SyntaxError(InvalidSyntax, 1, 4)));
        assert_eq!(last_event("t"),    Error(SyntaxError(InvalidSyntax, 1, 2)));
        assert_eq!(last_event("truz"), Error(SyntaxError(InvalidSyntax, 1, 4)));
        assert_eq!(last_event("f"),    Error(SyntaxError(InvalidSyntax, 1, 2)));
        assert_eq!(last_event("faz"),  Error(SyntaxError(InvalidSyntax, 1, 3)));
    }

    #[test]
    fn test_stack() {
        let mut stack = Stack::new();

        assert!(stack.is_empty());
        assert!(stack.len() == 0);
        assert!(!stack.last_is_index());

        stack.push_index(0);
        stack.bump_index();

        assert!(stack.len() == 1);
3840 3841 3842
        assert!(stack.is_equal_to(&[StackElement::Index(1)]));
        assert!(stack.starts_with(&[StackElement::Index(1)]));
        assert!(stack.ends_with(&[StackElement::Index(1)]));
3843
        assert!(stack.last_is_index());
3844
        assert!(stack.get(0) == StackElement::Index(1));
3845

A
Alex Crichton 已提交
3846
        stack.push_key("foo".to_string());
3847 3848

        assert!(stack.len() == 2);
3849 3850 3851 3852 3853
        assert!(stack.is_equal_to(&[StackElement::Index(1), StackElement::Key("foo")]));
        assert!(stack.starts_with(&[StackElement::Index(1), StackElement::Key("foo")]));
        assert!(stack.starts_with(&[StackElement::Index(1)]));
        assert!(stack.ends_with(&[StackElement::Index(1), StackElement::Key("foo")]));
        assert!(stack.ends_with(&[StackElement::Key("foo")]));
3854
        assert!(!stack.last_is_index());
3855 3856
        assert!(stack.get(0) == StackElement::Index(1));
        assert!(stack.get(1) == StackElement::Key("foo"));
3857

A
Alex Crichton 已提交
3858
        stack.push_key("bar".to_string());
3859 3860

        assert!(stack.len() == 3);
N
fallout  
Nick Cameron 已提交
3861 3862 3863
        assert!(stack.is_equal_to(&[StackElement::Index(1),
                                    StackElement::Key("foo"),
                                    StackElement::Key("bar")]));
3864 3865
        assert!(stack.starts_with(&[StackElement::Index(1)]));
        assert!(stack.starts_with(&[StackElement::Index(1), StackElement::Key("foo")]));
N
fallout  
Nick Cameron 已提交
3866 3867 3868
        assert!(stack.starts_with(&[StackElement::Index(1),
                                    StackElement::Key("foo"),
                                    StackElement::Key("bar")]));
3869 3870
        assert!(stack.ends_with(&[StackElement::Key("bar")]));
        assert!(stack.ends_with(&[StackElement::Key("foo"), StackElement::Key("bar")]));
N
fallout  
Nick Cameron 已提交
3871 3872 3873
        assert!(stack.ends_with(&[StackElement::Index(1),
                                  StackElement::Key("foo"),
                                  StackElement::Key("bar")]));
3874
        assert!(!stack.last_is_index());
3875 3876 3877
        assert!(stack.get(0) == StackElement::Index(1));
        assert!(stack.get(1) == StackElement::Key("foo"));
        assert!(stack.get(2) == StackElement::Key("bar"));
3878 3879 3880 3881

        stack.pop();

        assert!(stack.len() == 2);
3882 3883 3884 3885 3886
        assert!(stack.is_equal_to(&[StackElement::Index(1), StackElement::Key("foo")]));
        assert!(stack.starts_with(&[StackElement::Index(1), StackElement::Key("foo")]));
        assert!(stack.starts_with(&[StackElement::Index(1)]));
        assert!(stack.ends_with(&[StackElement::Index(1), StackElement::Key("foo")]));
        assert!(stack.ends_with(&[StackElement::Key("foo")]));
3887
        assert!(!stack.last_is_index());
3888 3889
        assert!(stack.get(0) == StackElement::Index(1));
        assert!(stack.get(1) == StackElement::Key("foo"));
3890 3891
    }

3892 3893
    #[test]
    fn test_to_json() {
A
Alexis Beingessner 已提交
3894
        use std::collections::{HashMap,BTreeMap};
3895 3896
        use super::ToJson;

C
Corey Farwell 已提交
3897 3898
        let array2 = Array(vec!(U64(1), U64(2)));
        let array3 = Array(vec!(U64(1), U64(2), U64(3)));
3899
        let object = {
A
Alexis Beingessner 已提交
3900
            let mut tree_map = BTreeMap::new();
3901 3902
            tree_map.insert("a".to_string(), U64(1));
            tree_map.insert("b".to_string(), U64(2));
A
Adolfo Ochagavía 已提交
3903
            Object(tree_map)
3904 3905
        };

C
Corey Farwell 已提交
3906
        assert_eq!(array2.to_json(), array2);
3907
        assert_eq!(object.to_json(), object);
3908
        assert_eq!(3_isize.to_json(), I64(3));
3909 3910 3911 3912
        assert_eq!(4_i8.to_json(), I64(4));
        assert_eq!(5_i16.to_json(), I64(5));
        assert_eq!(6_i32.to_json(), I64(6));
        assert_eq!(7_i64.to_json(), I64(7));
3913
        assert_eq!(8_usize.to_json(), U64(8));
3914 3915 3916 3917 3918 3919
        assert_eq!(9_u8.to_json(), U64(9));
        assert_eq!(10_u16.to_json(), U64(10));
        assert_eq!(11_u32.to_json(), U64(11));
        assert_eq!(12_u64.to_json(), U64(12));
        assert_eq!(13.0_f32.to_json(), F64(13.0_f64));
        assert_eq!(14.0_f64.to_json(), F64(14.0_f64));
3920
        assert_eq!(().to_json(), Null);
M
mrec 已提交
3921 3922
        assert_eq!(f32::INFINITY.to_json(), Null);
        assert_eq!(f64::NAN.to_json(), Null);
3923 3924
        assert_eq!(true.to_json(), Boolean(true));
        assert_eq!(false.to_json(), Boolean(false));
A
Alex Crichton 已提交
3925 3926
        assert_eq!("abc".to_json(), String("abc".to_string()));
        assert_eq!("abc".to_string().to_json(), String("abc".to_string()));
3927 3928 3929 3930 3931 3932
        assert_eq!((1_usize, 2_usize).to_json(), array2);
        assert_eq!((1_usize, 2_usize, 3_usize).to_json(), array3);
        assert_eq!([1_usize, 2_usize].to_json(), array2);
        assert_eq!((&[1_usize, 2_usize, 3_usize]).to_json(), array3);
        assert_eq!((vec![1_usize, 2_usize]).to_json(), array2);
        assert_eq!(vec!(1_usize, 2_usize, 3_usize).to_json(), array3);
A
Alexis Beingessner 已提交
3933
        let mut tree_map = BTreeMap::new();
3934
        tree_map.insert("a".to_string(), 1 as usize);
3935
        tree_map.insert("b".to_string(), 2);
3936 3937
        assert_eq!(tree_map.to_json(), object);
        let mut hash_map = HashMap::new();
3938
        hash_map.insert("a".to_string(), 1 as usize);
A
Alex Crichton 已提交
3939
        hash_map.insert("b".to_string(), 2);
3940
        assert_eq!(hash_map.to_json(), object);
T
Tobias Bucher 已提交
3941
        assert_eq!(Some(15).to_json(), I64(15));
3942
        assert_eq!(Some(15 as usize).to_json(), U64(15));
3943 3944 3945
        assert_eq!(None::<int>.to_json(), Null);
    }

3946 3947 3948 3949 3950 3951 3952
    #[test]
    fn test_encode_hashmap_with_arbitrary_key() {
        use std::collections::HashMap;
        #[derive(PartialEq, Eq, Hash, RustcEncodable)]
        struct ArbitraryType(uint);
        let mut hm: HashMap<ArbitraryType, bool> = HashMap::new();
        hm.insert(ArbitraryType(1), true);
3953 3954
        let mut mem_buf = string::String::new();
        let mut encoder = Encoder::new(&mut mem_buf);
3955
        let result = hm.encode(&mut encoder);
3956
        match result.err().unwrap() {
3957 3958 3959 3960 3961
            EncoderError::BadHashmapKey => (),
            _ => panic!("expected bad hash map key")
        }
    }

3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996
    #[bench]
    fn bench_streaming_small(b: &mut Bencher) {
        b.iter( || {
            let mut parser = Parser::new(
                r#"{
                    "a": 1.0,
                    "b": [
                        true,
                        "foo\nbar",
                        { "c": {"d": null} }
                    ]
                }"#.chars()
            );
            loop {
                match parser.next() {
                    None => return,
                    _ => {}
                }
            }
        });
    }
    #[bench]
    fn bench_small(b: &mut Bencher) {
        b.iter( || {
            let _ = from_str(r#"{
                "a": 1.0,
                "b": [
                    true,
                    "foo\nbar",
                    { "c": {"d": null} }
                ]
            }"#);
        });
    }

3997
    fn big_json() -> string::String {
A
Alex Crichton 已提交
3998
        let mut src = "[\n".to_string();
T
Tobias Bucher 已提交
3999
        for _ in 0..500 {
4000 4001
            src.push_str(r#"{ "a": true, "b": null, "c":3.1415, "d": "Hello world", "e": \
                            [1,2,3]},"#);
4002
        }
4003
        src.push_str("{}]");
4004 4005 4006 4007 4008 4009 4010
        return src;
    }

    #[bench]
    fn bench_streaming_large(b: &mut Bencher) {
        let src = big_json();
        b.iter( || {
4011
            let mut parser = Parser::new(src.chars());
4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022
            loop {
                match parser.next() {
                    None => return,
                    _ => {}
                }
            }
        });
    }
    #[bench]
    fn bench_large(b: &mut Bencher) {
        let src = big_json();
4023
        b.iter( || { let _ = from_str(&src); });
4024
    }
4025
}