json.rs 132.6 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 100 101 102 103 104 105 106 107 108 109 110 111 112 113
//!         data_vector: vec![2,3,4,5],
//!     };
//!
//!     // Serialize using `json::encode`
//!     let encoded = json::encode(&object);
//!
//!     // 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 146 147 148 149 150 151 152 153
//! }
//!
//! 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(),
//!     });
//!     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
217
#[derive(Clone, PartialEq, PartialOrd, Show)]
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.
238
#[derive(Clone, Copy, PartialEq, Show)]
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,
}

259
#[derive(Clone, Copy, PartialEq, Show)]
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;

269
#[derive(Clone, PartialEq, Show)]
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
}

278 279 280 281 282 283
#[derive(Copy, Show)]
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) -> string::String {
320 321 322 323 324 325
    let mut s = String::new();
    {
        let mut encoder = Encoder::new(&mut s);
        let _ = object.encode(&mut encoder);
    }
    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::Writer, 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::Writer, 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::Writer, 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"),
460 461
        _ if v.fract() != 0f64 => f64::to_str_digits(v, 6u),
        _ => f64::to_str_digits(v, 6u) + ".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::Writer+'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::Writer) -> 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,
    {
539
        if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
A
Adolfo Ochagavía 已提交
540 541
        f(self)
    }
542

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

749 750 751 752 753
    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) }
754

755 756 757 758 759
    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) }
760

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

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

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

785 786 787
    fn emit_enum<F>(&mut self, _name: &str, f: F) -> EncodeResult where
        F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
    {
788
        if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
789 790 791
        f(self)
    }

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

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

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

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


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

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

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

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

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

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

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

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

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

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

1008 1009
impl Encodable for Json {
    fn encode<E: ::Encoder>(&self, e: &mut E) -> Result<(), E::Error> {
1010
        match *self {
1011 1012 1013 1014 1015 1016 1017 1018
            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(),
1019 1020 1021 1022
        }
    }
}

1023 1024 1025 1026 1027
/// 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 }
}
1028

1029 1030 1031 1032 1033
/// 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 }
}
1034

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

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

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

    /// 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.
1068 1069
    pub fn search<'a>(&'a self, key: &str) -> Option<&'a Json> {
        match self {
1070
            &Json::Object(ref map) => {
A
Aaron Turon 已提交
1071
                match map.get(key) {
1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087
                    Some(json_value) => Some(json_value),
                    None => {
                        for (_, v) in map.iter() {
                            match v.search(key) {
                                x if x.is_some() => return x,
                                _ => ()
                            }
                        }
                        None
                    }
                }
            },
            _ => None
        }
    }

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

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

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

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

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

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

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

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

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

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

1162
    /// If the Json value is a number, return or cast it to a i64.
1163
    /// Returns None otherwise.
1164 1165
    pub fn as_i64(&self) -> Option<i64> {
        match *self {
1166 1167
            Json::I64(n) => Some(n),
            Json::U64(n) => num::cast(n),
1168 1169 1170 1171 1172 1173 1174 1175
            _ => 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 {
1176 1177
            Json::I64(n) => num::cast(n),
            Json::U64(n) => Some(n),
1178 1179 1180 1181
            _ => None
        }
    }

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

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

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

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

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

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

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

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

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

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

1257
#[derive(PartialEq, Show)]
1258
enum ParserState {
C
Corey Farwell 已提交
1259
    // Parse a value in an array, true means first element.
1260
    ParseArray(bool),
C
Corey Farwell 已提交
1261
    // Parse ',' or ']' after an element in an array.
C
Corey Farwell 已提交
1262
    ParseArrayComma,
1263 1264 1265 1266
    // 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 已提交
1267
    // Initial state.
1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283
    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 已提交
1284 1285
/// For example, StackElement::Key("foo"), StackElement::Key("bar"),
/// StackElement::Index(3) and StackElement::Key("x") are the
1286
/// StackElements compositing the stack that represents foo.bar[3].x
1287
#[derive(PartialEq, Clone, Show)]
1288 1289 1290 1291 1292 1293 1294
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.
1295
#[derive(PartialEq, Clone, Show)]
1296 1297 1298 1299 1300 1301 1302
enum InternalStackElement {
    InternalIndex(u32),
    InternalKey(u16, u16), // start, size
}

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

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

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

    /// 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 已提交
1316
        match self.stack[idx] {
1317
            InternalIndex(i) => StackElement::Index(i),
A
Adolfo Ochagavía 已提交
1318
            InternalKey(start, size) => {
1319
                StackElement::Key(str::from_utf8(
1320
                    &self.str_buffer[start as uint .. start as uint + size as uint])
1321
                        .unwrap())
A
Adolfo Ochagavía 已提交
1322
            }
1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359
        }
    }

    /// 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; }
        for i in range(0, rhs.len()) {
            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; }
        for i in range(0, rhs.len()) {
            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();
        for i in range(0, rhs.len()) {
            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,
1360
            Some(&InternalIndex(i)) => Some(StackElement::Index(i)),
1361
            Some(&InternalKey(start, size)) => {
1362
                Some(StackElement::Key(str::from_utf8(
1363
                    &self.str_buffer[start as uint .. (start+size) as uint]
1364 1365 1366 1367 1368
                ).unwrap()))
            }
        }
    }

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

1377
    // Used by Parser to insert StackElement::Index elements at the top of the stack.
1378 1379 1380 1381 1382 1383 1384 1385 1386 1387
    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 已提交
1388
                self.str_buffer.truncate(new_size);
1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407
            }
            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 已提交
1408
            InternalIndex(i) => { i + 1 }
S
Steve Klabnik 已提交
1409
            _ => { panic!(); }
1410
        };
1411
        self.stack[len - 1] = InternalIndex(idx);
1412 1413 1414 1415 1416
    }
}

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

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

1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449
    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());
    }
1450 1451
}

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

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

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

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

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

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

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

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

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

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

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

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

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

1535 1536 1537 1538 1539
            if neg {
                res *= -1.0;
            }

            F64Value(res)
1540
        } else {
1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552
            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)
            }
1553
        }
E
Elly Jones 已提交
1554 1555
    }

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

1560 1561 1562
        match self.ch_or_null() {
            '0' => {
                self.bump();
1563

M
mrec 已提交
1564
                // A leading '0' must be the only digit before the decimal point.
1565
                match self.ch_or_null() {
1566
                    '0' ... '9' => return self.error(InvalidNumber),
1567 1568 1569
                    _ => ()
                }
            },
1570
            '1' ... '9' => {
1571 1572
                while !self.eof() {
                    match self.ch_or_null() {
1573
                        c @ '0' ... '9' => {
1574 1575 1576 1577 1578 1579
                            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); }

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

        Ok(accum)
E
Elly Jones 已提交
1590 1591
    }

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

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

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

1613
        Ok(res)
E
Elly Jones 已提交
1614 1615
    }

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

1619 1620
        let mut exp = 0u;
        let mut neg_exp = false;
1621

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

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

1640 1641 1642
                    self.bump();
                }
                _ => break
1643 1644 1645
            }
        }

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

1653
        Ok(res)
E
Elly Jones 已提交
1654 1655
    }

1656
    fn decode_hex_escape(&mut self) -> Result<u16, ParserError> {
1657 1658
        let mut i = 0u;
        let mut n = 0u16;
A
Adolfo Ochagavía 已提交
1659
        while i < 4 && !self.eof() {
1660 1661
            self.bump();
            n = match self.ch_or_null() {
1662
                c @ '0' ... '9' => n * 16 + ((c as u16) - ('0' as u16)),
A
Adolfo Ochagavía 已提交
1663 1664 1665 1666 1667 1668
                '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,
1669
                _ => return self.error(InvalidEscape)
1670 1671 1672 1673 1674 1675
            };

            i += 1u;
        }

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

        Ok(n)
    }

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

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

H
Huon Wilson 已提交
1693
            if escape {
1694
                match self.ch_or_null() {
1695 1696 1697 1698 1699 1700 1701 1702
                    '"' => 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'),
1703
                    'u' => match try!(self.decode_hex_escape()) {
1704 1705 1706
                        0xDC00 ... 0xDFFF => {
                            return self.error(LoneLeadingSurrogateInHexEscape)
                        }
1707 1708 1709

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

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

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

1746 1747 1748 1749
    // 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 已提交
1750
    // stream int the form of a stack that can be queried by the user using the
1751 1752 1753 1754
    // stack() method.
    fn parse(&mut self) -> JsonEvent {
        loop {
            // The only paths where the loop can spin a new iteration
C
Corey Farwell 已提交
1755
            // are in the cases ParseArrayComma and ParseObjectComma if ','
1756
            // is parsed. In these cases the state is set to (respectively)
1757
            // ParseArray(false) and ParseObject(false), which always return,
1758 1759 1760
            // 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();
1761

1762 1763 1764 1765
            match self.state {
                ParseStart => {
                    return self.parse_start();
                }
1766
                ParseArray(first) => {
C
Corey Farwell 已提交
1767
                    return self.parse_array(first);
1768
                }
C
Corey Farwell 已提交
1769 1770
                ParseArrayComma => {
                    match self.parse_array_comma_or_end() {
1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796
                        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 {
1797 1798 1799 1800
            Error(_) => ParseFinished,
            ArrayStart => ParseArray(true),
            ObjectStart => ParseObject(true),
            _ => ParseBeforeFinish,
1801 1802 1803
        };
        return val;
    }
1804

C
Corey Farwell 已提交
1805
    fn parse_array(&mut self, first: bool) -> JsonEvent {
1806
        if self.ch_is(']') {
1807
            if !first {
1808
                self.error_event(InvalidSyntax)
1809
            } else {
1810 1811 1812
                self.state = if self.stack.is_empty() {
                    ParseBeforeFinish
                } else if self.stack.last_is_index() {
C
Corey Farwell 已提交
1813
                    ParseArrayComma
1814 1815
                } else {
                    ParseObjectComma
1816 1817 1818
                };
                self.bump();
                ArrayEnd
1819
            }
1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831
        } 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
1832
        }
1833
    }
1834

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

1859 1860 1861
    fn parse_object(&mut self, first: bool) -> JsonEvent {
        if self.ch_is('}') {
            if !first {
1862 1863 1864 1865 1866
                if self.stack.is_empty() {
                    return self.error_event(TrailingComma);
                } else {
                    self.stack.pop();
                }
1867
            }
1868 1869 1870 1871
            self.state = if self.stack.is_empty() {
                ParseBeforeFinish
            } else if self.stack.last_is_index() {
                ParseArrayComma
1872
            } else {
1873 1874
                ParseObjectComma
            };
1875 1876 1877 1878 1879 1880 1881 1882 1883 1884
            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() {
1885
            Ok(s) => s,
1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897
            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);
1898 1899 1900
        self.bump();
        self.parse_whitespace();

1901
        let val = self.parse_value();
1902

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

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

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

1953 1954 1955 1956 1957 1958 1959 1960
    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))
        }
    }
1961

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

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

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

    // 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); }
1988
            ref tok => { panic!("unexpected token {:?}", tok.clone()); }
1989
        }
A
Adolfo Ochagavía 已提交
1990
        result
1991 1992 1993 1994 1995 1996 1997
    }

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

    fn build_value(&mut self) -> Result<Json, BuilderError> {
1998 1999 2000 2001 2002 2003
        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)),
2004
            Some(StringValue(ref mut s)) => {
2005
                let mut temp = string::String::new();
2006
                swap(s, &mut temp);
2007
                Ok(Json::String(temp))
2008
            }
2009 2010 2011 2012 2013 2014
            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),
2015 2016
        }
    }
2017

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

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

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

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

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

A
Alex Crichton 已提交
2060 2061
/// 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 已提交
2062
    let contents = match rdr.read_to_end() {
2063
        Ok(c)  => c,
2064
        Err(e) => return Err(io_error_to_error(e))
A
Alex Crichton 已提交
2065
    };
A
Alex Crichton 已提交
2066
    let s = match str::from_utf8(contents.as_slice()).ok() {
2067 2068
        Some(s) => s,
        _       => return Err(SyntaxError(NotUtf8, 0, 0))
A
Alex Crichton 已提交
2069
    };
2070
    let mut builder = Builder::new(s.chars());
2071
    builder.build()
E
Elly Jones 已提交
2072 2073
}

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

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

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

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

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

2117 2118 2119 2120
macro_rules! read_primitive {
    ($name:ident, $ty:ty) => {
        fn $name(&mut self) -> DecodeResult<$ty> {
            match self.pop() {
B
Barosl Lee 已提交
2121 2122
                Json::I64(f) => match num::cast(f) {
                    Some(f) => Ok(f),
A
Alex Crichton 已提交
2123
                    None => Err(ExpectedError("Number".to_string(), format!("{}", f))),
2124
                },
B
Barosl Lee 已提交
2125 2126
                Json::U64(f) => match num::cast(f) {
                    Some(f) => Ok(f),
A
Alex Crichton 已提交
2127
                    None => Err(ExpectedError("Number".to_string(), format!("{}", f))),
B
Barosl Lee 已提交
2128
                },
A
Alex Crichton 已提交
2129
                Json::F64(f) => Err(ExpectedError("Integer".to_string(), format!("{}", f))),
B
Barosl Lee 已提交
2130 2131
                // 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 已提交
2132
                Json::String(s) => match s.parse() {
B
Barosl Lee 已提交
2133
                    Some(f) => Ok(f),
A
Alex Crichton 已提交
2134
                    None => Err(ExpectedError("Number".to_string(), s)),
2135
                },
A
Alex Crichton 已提交
2136
                value => Err(ExpectedError("Number".to_string(), format!("{}", value))),
2137 2138 2139 2140 2141
            }
        }
    }
}

2142 2143 2144
impl ::Decoder for Decoder {
    type Error = DecoderError;

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

2149 2150 2151 2152 2153 2154 2155 2156 2157 2158
    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 }
2159

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

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

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

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

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

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

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

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

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


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

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

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

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

2308 2309 2310 2311
    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| {
2312 2313 2314 2315 2316
            if len == tuple_len {
                f(d)
            } else {
                Err(ExpectedError(format!("Tuple{}", tuple_len), format!("Tuple{}", len)))
            }
2317
        })
2318 2319
    }

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

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

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

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

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

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

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

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

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

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

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

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

2414
to_json_impl_i64! { int, i8, i16, i32, i64 }
2415

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

2424
to_json_impl_u64! { uint, u8, u16, u32, u64 }
2425

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

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

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

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

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

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

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

2459 2460 2461 2462 2463 2464 2465 2466 2467
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]
2468
            #[allow(non_snake_case)]
2469 2470
            fn to_json(&self) -> Json {
                match *self {
2471
                    ($(ref $tyvar),*,) => Json::Array(vec![$($tyvar.to_json()),*])
2472
                }
A
Adolfo Ochagavía 已提交
2473
            }
2474
        }
2475 2476 2477
    }
}

2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489
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}
2490

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

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

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

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

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

2528 2529 2530 2531 2532 2533
struct FormatShim<'a, 'b: 'a> {
    inner: &'a mut fmt::Formatter<'b>,
}

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

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

2553
impl<'a> fmt::Display for PrettyJson<'a> {
2554 2555 2556 2557
    /// 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);
2558 2559 2560 2561
        match self.inner.encode(&mut encoder) {
            Ok(_) => Ok(()),
            Err(_) => Err(fmt::Error)
        }
2562 2563 2564
    }
}

2565
impl<'a, T: Encodable> fmt::Display for AsJson<'a, T> {
2566 2567 2568 2569
    /// 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);
2570 2571 2572 2573
        match self.inner.encode(&mut encoder) {
            Ok(_) => Ok(()),
            Err(_) => Err(fmt::Error)
        }
2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584
    }
}

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
    }
}

2585
impl<'a, T: Encodable> fmt::Display for AsPrettyJson<'a, T> {
2586 2587 2588 2589 2590 2591 2592 2593
    /// 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 => {}
        }
2594 2595 2596 2597
        match self.inner.encode(&mut encoder) {
            Ok(_) => Ok(()),
            Err(_) => Err(fmt::Error)
        }
2598
    }
2599 2600
}

B
Brendan Zabarauskas 已提交
2601
impl FromStr for Json {
A
Adolfo Ochagavía 已提交
2602 2603 2604 2605 2606
    fn from_str(s: &str) -> Option<Json> {
        from_str(s).ok()
    }
}

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

2626
    #[derive(RustcDecodable, Eq, PartialEq, Show)]
2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647
    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();
        assert_eq!(obj, OptionData { opt: Some(10u) });
    }

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

2653
    #[derive(PartialEq, RustcEncodable, RustcDecodable, Show)]
2654 2655
    enum Animal {
        Dog,
2656
        Frog(string::String, int)
2657 2658
    }

2659
    #[derive(PartialEq, RustcEncodable, RustcDecodable, Show)]
2660 2661 2662
    struct Inner {
        a: (),
        b: uint,
2663
        c: Vec<string::String>,
2664 2665
    }

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

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

D
Daniel Micay 已提交
2674
        for item in items.iter() {
2675
            match *item {
2676
                (ref key, ref value) => { d.insert((*key).clone(), (*value).clone()); },
2677
            }
2678 2679
        };

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

N
Nick Cameron 已提交
2837
        let a = mk_object(&[
A
Alex Crichton 已提交
2838 2839 2840 2841
            ("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()))])
2842
            ]))
G
Graydon Hoare 已提交
2843
        ]);
2844

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

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

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

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

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

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

2895
    #[test]
2896
    fn test_write_none() {
2897 2898 2899 2900 2901 2902 2903
        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\"");
2904 2905 2906
        check_encoder_for_simple!('\u{0000}', "\"\\u0000\"");
        check_encoder_for_simple!('\u{001b}', "\"\\u001b\"");
        check_encoder_for_simple!('\u{007f}', "\"\\u007f\"");
2907 2908 2909
        check_encoder_for_simple!('\u{00a0}', "\"\u{00a0}\"");
        check_encoder_for_simple!('\u{abcd}', "\"\u{abcd}\"");
        check_encoder_for_simple!('\u{10ffff}', "\"\u{10ffff}\"");
2910 2911
    }

2912
    #[test]
2913
    fn test_trailing_characters() {
2914 2915 2916 2917 2918 2919
        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)));
2920 2921 2922 2923
    }

    #[test]
    fn test_read_identifiers() {
2924 2925 2926 2927 2928 2929
        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)));
2930

E
Erick Tryzelaar 已提交
2931 2932 2933 2934 2935 2936
        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)));
2937 2938
    }

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

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

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

2951
    #[test]
2952
    fn test_read_number() {
2953 2954
        assert_eq!(from_str("+"),   Err(SyntaxError(InvalidSyntax, 1, 1)));
        assert_eq!(from_str("."),   Err(SyntaxError(InvalidSyntax, 1, 1)));
M
mrec 已提交
2955
        assert_eq!(from_str("NaN"), Err(SyntaxError(InvalidSyntax, 1, 1)));
2956 2957 2958 2959 2960
        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)));
2961

2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976
        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)));
2977 2978
    }

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

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

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

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

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

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

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

        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);
3013 3014

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

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

A
Alex Crichton 已提交
3024 3025 3026 3027 3028 3029 3030 3031 3032 3033
        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())));
3034 3035
    }

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

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

3054
    #[test]
C
Corey Farwell 已提交
3055
    fn test_read_array() {
3056
        assert_eq!(from_str("["),     Err(SyntaxError(EOFWhileParsingValue, 1, 2)));
C
Corey Farwell 已提交
3057
        assert_eq!(from_str("[1"),    Err(SyntaxError(EOFWhileParsingArray, 1, 3)));
3058 3059 3060
        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)));
3061

C
Corey Farwell 已提交
3062 3063 3064 3065 3066
        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 已提交
3067
        assert_eq!(from_str("[3, 1]"),
C
Corey Farwell 已提交
3068
                     Ok(Array(vec![U64(3), U64(1)])));
E
Erick Tryzelaar 已提交
3069
        assert_eq!(from_str("\n[3, 2]\n"),
C
Corey Farwell 已提交
3070
                     Ok(Array(vec![U64(3), U64(2)])));
E
Erick Tryzelaar 已提交
3071
        assert_eq!(from_str("[2, [4, 1]]"),
C
Corey Farwell 已提交
3072
               Ok(Array(vec![U64(2), Array(vec![U64(4), U64(1)])])));
3073 3074
    }

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

3080
        let v: Vec<()> = super::decode("[null]").unwrap();
K
Kevin Ballard 已提交
3081
        assert_eq!(v, vec![()]);
3082

3083
        let v: Vec<bool> = super::decode("[true]").unwrap();
K
Kevin Ballard 已提交
3084
        assert_eq!(v, vec![true]);
3085

3086
        let v: Vec<int> = super::decode("[3, 1]").unwrap();
K
Kevin Ballard 已提交
3087
        assert_eq!(v, vec![3, 1]);
3088

3089
        let v: Vec<Vec<uint>> = super::decode("[[3], [1, 2]]").unwrap();
K
Kevin Ballard 已提交
3090
        assert_eq!(v, vec![vec![3], vec![1, 2]]);
3091 3092
    }

3093 3094 3095
    #[test]
    fn test_decode_tuple() {
        let t: (uint, uint, uint) = super::decode("[1, 2, 3]").unwrap();
3096
        assert_eq!(t, (1u, 2, 3));
3097 3098

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

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

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

3112
    #[test]
3113
    fn test_read_object() {
3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125
        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)));
3126

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3312 3313 3314
    #[test]
    fn test_index(){
        let json_value = from_str("{\"animals\":[\"dog\",\"cat\",\"mouse\"]}").unwrap();
C
Corey Farwell 已提交
3315 3316 3317 3318
        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");
3319 3320
    }

3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334
    #[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 已提交
3335
    fn test_is_array(){
3336
        let json_value = from_str("[1, 2, 3]").unwrap();
C
Corey Farwell 已提交
3337
        assert!(json_value.is_array());
3338 3339 3340
    }

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

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

    #[test]
3355
    fn test_as_string(){
3356
        let json_value = from_str("\"dog\"").unwrap();
3357
        let json_str = json_value.as_string();
3358
        let expected_str = "dog";
3359 3360 3361 3362 3363 3364 3365 3366 3367 3368
        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]
3369
    fn test_is_i64(){
3370
        let json_value = from_str("-12").unwrap();
3371 3372
        assert!(json_value.is_i64());

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

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

3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391
    #[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());
    }

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

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

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

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

    #[test]
    fn test_as_i64(){
3409
        let json_value = from_str("-12").unwrap();
3410
        let json_num = json_value.as_i64();
3411 3412 3413 3414 3415 3416 3417
        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();
3418 3419 3420 3421 3422 3423 3424 3425
        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));
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 3454
    }

    #[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);
    }
3455 3456 3457 3458

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

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

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

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

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

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

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

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

J
Jorge Aparicio 已提交
3521
            let printed = from_utf8(&writer[]).unwrap();
3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539

            // 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!");
        }
    }

3540 3541
    #[test]
    fn test_hashmap_with_numeric_key_can_handle_double_quote_delimited_key() {
3542
        use std::collections::HashMap;
3543 3544 3545
        use Decodable;
        let json_str = "{\"1\":true}";
        let json_obj = match from_str(json_str) {
3546
            Err(_) => panic!("Unable to parse json_str: {:?}", json_str),
3547 3548 3549
            Ok(o) => o
        };
        let mut decoder = Decoder::new(json_obj);
S
Sean McArthur 已提交
3550
        let _hm: HashMap<uint, bool> = Decodable::decode(&mut decoder).unwrap();
3551
    }
3552

3553 3554 3555 3556 3557 3558
    #[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) {
3559
            Err(_) => panic!("Unable to parse json_str: {:?}", json_str),
3560 3561 3562 3563
            Ok(o) => o
        };
        let mut decoder = Decoder::new(json_obj);
        let result: Result<HashMap<uint, bool>, DecoderError> = Decodable::decode(&mut decoder);
A
Alex Crichton 已提交
3564
        assert_eq!(result, Err(ExpectedError("Number".to_string(), "a".to_string())));
3565 3566
    }

3567 3568
    fn assert_stream_equal(src: &str,
                           expected: Vec<(JsonEvent, Vec<StackElement>)>) {
3569 3570 3571 3572 3573 3574 3575
        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 已提交
3576
            let (ref expected_evt, ref expected_stack) = expected[i];
3577
            if !parser.stack().is_equal_to(expected_stack.as_slice()) {
3578
                panic!("Parser stack is not equal to {:?}", expected_stack);
3579 3580 3581 3582 3583 3584
            }
            assert_eq!(&evt, expected_evt);
            i+=1;
        }
    }
    #[test]
3585
    #[cfg_attr(target_pointer_width = "32", ignore)] // FIXME(#14064)
3586 3587
    fn test_streaming_parser() {
        assert_stream_equal(
3588
            r#"{ "foo":"bar", "array" : [0, 1, 2, 3, 4, 5], "idents":[null,true,false]}"#,
3589 3590
            vec![
                (ObjectStart,             vec![]),
3591 3592 3593 3594 3595 3596 3597 3598 3599 3600
                  (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 已提交
3601 3602 3603 3604 3605 3606
                    (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)]),
3607
                  (ArrayEnd,              vec![StackElement::Key("idents")]),
3608
                (ObjectEnd,               vec![]),
3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621
            ]
        );
    }
    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,
            }
        }
    }
3622

3623
    #[test]
3624
    #[cfg_attr(target_pointer_width = "32", ignore)] // FIXME(#14064)
3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636
    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)));
3637
        assert_eq!(last_event("{\"a\":1,}"), Error(SyntaxError(TrailingComma, 1, 8)));
3638 3639 3640

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

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

        assert_eq!(from_str("["),     Err(SyntaxError(EOFWhileParsingValue, 1, 2)));
C
Corey Farwell 已提交
3782
        assert_eq!(from_str("[1"),    Err(SyntaxError(EOFWhileParsingArray, 1, 3)));
3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822
        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);
3823 3824 3825
        assert!(stack.is_equal_to(&[StackElement::Index(1)]));
        assert!(stack.starts_with(&[StackElement::Index(1)]));
        assert!(stack.ends_with(&[StackElement::Index(1)]));
3826
        assert!(stack.last_is_index());
3827
        assert!(stack.get(0) == StackElement::Index(1));
3828

A
Alex Crichton 已提交
3829
        stack.push_key("foo".to_string());
3830 3831

        assert!(stack.len() == 2);
3832 3833 3834 3835 3836
        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")]));
3837
        assert!(!stack.last_is_index());
3838 3839
        assert!(stack.get(0) == StackElement::Index(1));
        assert!(stack.get(1) == StackElement::Key("foo"));
3840

A
Alex Crichton 已提交
3841
        stack.push_key("bar".to_string());
3842 3843

        assert!(stack.len() == 3);
N
fallout  
Nick Cameron 已提交
3844 3845 3846
        assert!(stack.is_equal_to(&[StackElement::Index(1),
                                    StackElement::Key("foo"),
                                    StackElement::Key("bar")]));
3847 3848
        assert!(stack.starts_with(&[StackElement::Index(1)]));
        assert!(stack.starts_with(&[StackElement::Index(1), StackElement::Key("foo")]));
N
fallout  
Nick Cameron 已提交
3849 3850 3851
        assert!(stack.starts_with(&[StackElement::Index(1),
                                    StackElement::Key("foo"),
                                    StackElement::Key("bar")]));
3852 3853
        assert!(stack.ends_with(&[StackElement::Key("bar")]));
        assert!(stack.ends_with(&[StackElement::Key("foo"), StackElement::Key("bar")]));
N
fallout  
Nick Cameron 已提交
3854 3855 3856
        assert!(stack.ends_with(&[StackElement::Index(1),
                                  StackElement::Key("foo"),
                                  StackElement::Key("bar")]));
3857
        assert!(!stack.last_is_index());
3858 3859 3860
        assert!(stack.get(0) == StackElement::Index(1));
        assert!(stack.get(1) == StackElement::Key("foo"));
        assert!(stack.get(2) == StackElement::Key("bar"));
3861 3862 3863 3864

        stack.pop();

        assert!(stack.len() == 2);
3865 3866 3867 3868 3869
        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")]));
3870
        assert!(!stack.last_is_index());
3871 3872
        assert!(stack.get(0) == StackElement::Index(1));
        assert!(stack.get(1) == StackElement::Key("foo"));
3873 3874
    }

3875 3876
    #[test]
    fn test_to_json() {
A
Alexis Beingessner 已提交
3877
        use std::collections::{HashMap,BTreeMap};
3878 3879
        use super::ToJson;

C
Corey Farwell 已提交
3880 3881
        let array2 = Array(vec!(U64(1), U64(2)));
        let array3 = Array(vec!(U64(1), U64(2), U64(3)));
3882
        let object = {
A
Alexis Beingessner 已提交
3883
            let mut tree_map = BTreeMap::new();
3884 3885
            tree_map.insert("a".to_string(), U64(1));
            tree_map.insert("b".to_string(), U64(2));
A
Adolfo Ochagavía 已提交
3886
            Object(tree_map)
3887 3888
        };

C
Corey Farwell 已提交
3889
        assert_eq!(array2.to_json(), array2);
3890
        assert_eq!(object.to_json(), object);
3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902
        assert_eq!(3_i.to_json(), I64(3));
        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));
        assert_eq!(8_u.to_json(), U64(8));
        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));
3903
        assert_eq!(().to_json(), Null);
M
mrec 已提交
3904 3905
        assert_eq!(f32::INFINITY.to_json(), Null);
        assert_eq!(f64::NAN.to_json(), Null);
3906 3907
        assert_eq!(true.to_json(), Boolean(true));
        assert_eq!(false.to_json(), Boolean(false));
A
Alex Crichton 已提交
3908 3909
        assert_eq!("abc".to_json(), String("abc".to_string()));
        assert_eq!("abc".to_string().to_json(), String("abc".to_string()));
C
Corey Farwell 已提交
3910 3911 3912 3913 3914 3915
        assert_eq!((1u, 2u).to_json(), array2);
        assert_eq!((1u, 2u, 3u).to_json(), array3);
        assert_eq!([1u, 2].to_json(), array2);
        assert_eq!((&[1u, 2, 3]).to_json(), array3);
        assert_eq!((vec![1u, 2]).to_json(), array2);
        assert_eq!(vec!(1u, 2, 3).to_json(), array3);
A
Alexis Beingessner 已提交
3916
        let mut tree_map = BTreeMap::new();
3917 3918
        tree_map.insert("a".to_string(), 1u);
        tree_map.insert("b".to_string(), 2);
3919 3920
        assert_eq!(tree_map.to_json(), object);
        let mut hash_map = HashMap::new();
A
Alex Crichton 已提交
3921 3922
        hash_map.insert("a".to_string(), 1u);
        hash_map.insert("b".to_string(), 2);
3923
        assert_eq!(hash_map.to_json(), object);
3924 3925
        assert_eq!(Some(15i).to_json(), I64(15));
        assert_eq!(Some(15u).to_json(), U64(15));
3926 3927 3928
        assert_eq!(None::<int>.to_json(), Null);
    }

3929 3930 3931
    #[test]
    fn test_encode_hashmap_with_arbitrary_key() {
        use std::str::from_utf8;
A
Alex Crichton 已提交
3932
        use std::old_io::Writer;
3933 3934 3935 3936 3937 3938 3939 3940 3941
        use std::collections::HashMap;
        use std::fmt;
        #[derive(PartialEq, Eq, Hash, RustcEncodable)]
        struct ArbitraryType(uint);
        let mut hm: HashMap<ArbitraryType, bool> = HashMap::new();
        hm.insert(ArbitraryType(1), true);
        let mut mem_buf = Vec::new();
        let mut encoder = Encoder::new(&mut mem_buf as &mut fmt::Writer);
        let result = hm.encode(&mut encoder);
3942
        match result.err().unwrap() {
3943 3944 3945 3946 3947
            EncoderError::BadHashmapKey => (),
            _ => panic!("expected bad hash map key")
        }
    }

3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982
    #[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} }
                ]
            }"#);
        });
    }

3983
    fn big_json() -> string::String {
A
Alex Crichton 已提交
3984
        let mut src = "[\n".to_string();
3985
        for _ in 0i..500 {
3986 3987
            src.push_str(r#"{ "a": true, "b": null, "c":3.1415, "d": "Hello world", "e": \
                            [1,2,3]},"#);
3988
        }
3989
        src.push_str("{}]");
3990 3991 3992 3993 3994 3995 3996
        return src;
    }

    #[bench]
    fn bench_streaming_large(b: &mut Bencher) {
        let src = big_json();
        b.iter( || {
3997
            let mut parser = Parser::new(src.chars());
3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008
            loop {
                match parser.next() {
                    None => return,
                    _ => {}
                }
            }
        });
    }
    #[bench]
    fn bench_large(b: &mut Bencher) {
        let src = big_json();
4009
        b.iter( || { let _ = from_str(src.as_slice()); });
4010
    }
4011
}