json.rs 127.7 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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
//! * `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 ({ ... }).
//! A simple JSON document encoding a person, his/her age, address and phone numbers could look like
//!
//! ```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
Adolfo Ochagavía 已提交
204 205
use std::{char, f64, fmt, io, num, str};
use std::mem::{swap, transmute};
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)]
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 263 264 265 266 267 268
    SyntaxError(ErrorCode, uint, uint),
    IoError(io::IoErrorKind, &'static str),
}

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

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

301
/// Shortcut function to decode a JSON `&str` into an object
302
pub fn decode<T: ::Decodable>(s: &str) -> DecodeResult<T> {
303 304 305 306 307 308 309 310 311 312
    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`
313
pub fn encode<T: ::Encodable>(object: &T) -> string::String {
314 315 316 317 318 319
    let mut s = String::new();
    {
        let mut encoder = Encoder::new(&mut s);
        let _ = object.encode(&mut encoder);
    }
    s
320 321
}

322 323 324 325 326 327 328 329
impl fmt::Show for ErrorCode {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        error_str(*self).fmt(f)
    }
}

fn io_error_to_error(io: io::IoError) -> ParserError {
    IoError(io.kind, io.desc)
330
}
331

332 333
impl std::error::Error for DecoderError {
    fn description(&self) -> &str { "decoder error" }
334
    fn detail(&self) -> Option<std::string::String> { Some(format!("{:?}", self)) }
335 336
}

337
pub type EncodeResult = fmt::Result;
338
pub type DecodeResult<T> = Result<T, DecoderError>;
A
Alex Crichton 已提交
339

340
fn escape_str(wr: &mut fmt::Writer, v: &str) -> fmt::Result {
341 342 343 344
    try!(wr.write_str("\""));

    let mut start = 0;

345 346
    for (i, byte) in v.bytes().enumerate() {
        let escaped = match byte {
347 348
            b'"' => "\\\"",
            b'\\' => "\\\\",
R
Rolf Timmermans 已提交
349 350 351 352 353 354 355 356
            b'\x00' => "\\u0000",
            b'\x01' => "\\u0001",
            b'\x02' => "\\u0002",
            b'\x03' => "\\u0003",
            b'\x04' => "\\u0004",
            b'\x05' => "\\u0005",
            b'\x06' => "\\u0006",
            b'\x07' => "\\u0007",
357
            b'\x08' => "\\b",
R
Rolf Timmermans 已提交
358
            b'\t' => "\\t",
359
            b'\n' => "\\n",
R
Rolf Timmermans 已提交
360 361
            b'\x0b' => "\\u000b",
            b'\x0c' => "\\f",
362
            b'\r' => "\\r",
R
Rolf Timmermans 已提交
363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381
            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",
382 383 384 385
            _ => { continue; }
        };

        if start < i {
386
            try!(wr.write_str(v.index(&(start..i))));
E
Elly Jones 已提交
387
        }
388 389 390 391

        try!(wr.write_str(escaped));

        start = i + 1;
392
    }
393

394
    if start != v.len() {
395
        try!(wr.write_str(v.index(&(start..))));
396 397 398
    }

    wr.write_str("\"")
399 400
}

401
fn escape_char(writer: &mut fmt::Writer, v: char) -> fmt::Result {
402
    let mut buf = [0; 4];
403
    let n = v.encode_utf8(&mut buf).unwrap();
404
    let buf = unsafe { str::from_utf8_unchecked(buf.index(&(0..n))) };
405
    escape_str(writer, buf)
406 407
}

408 409
fn spaces(wr: &mut fmt::Writer, mut n: uint) -> fmt::Result {
    const BUF: &'static str = "                ";
410

411 412 413
    while n >= BUF.len() {
        try!(wr.write_str(BUF));
        n -= BUF.len();
414 415 416
    }

    if n > 0 {
417
        wr.write_str(BUF.index(&(0..n)))
418 419
    } else {
        Ok(())
420
    }
E
Elly Jones 已提交
421 422
}

423
fn fmt_number_or_null(v: f64) -> string::String {
M
mrec 已提交
424
    match v.classify() {
T
Tobias Bucher 已提交
425
        Fp::Nan | Fp::Infinite => string::String::from_str("null"),
426 427
        _ if v.fract() != 0f64 => f64::to_str_digits(v, 6u),
        _ => f64::to_str_digits(v, 6u) + ".0",
M
mrec 已提交
428 429 430
    }
}

431
/// A structure for implementing serialization to JSON.
E
Erik Price 已提交
432
pub struct Encoder<'a> {
433
    writer: &'a mut (fmt::Writer+'a),
434 435
}

E
Erik Price 已提交
436
impl<'a> Encoder<'a> {
437 438
    /// Creates a new JSON encoder whose output will be written to the writer
    /// specified.
439
    pub fn new(writer: &'a mut fmt::Writer) -> Encoder<'a> {
A
Adolfo Ochagavía 已提交
440
        Encoder { writer: writer }
441
    }
442 443
}

444 445 446
impl<'a> ::Encoder for Encoder<'a> {
    type Error = fmt::Error;

A
Adolfo Ochagavía 已提交
447
    fn emit_nil(&mut self) -> EncodeResult { write!(self.writer, "null") }
448

449 450 451 452 453
    fn emit_uint(&mut self, v: uint) -> EncodeResult { write!(self.writer, "{}", v) }
    fn emit_u64(&mut self, v: u64) -> EncodeResult { write!(self.writer, "{}", v) }
    fn emit_u32(&mut self, v: u32) -> EncodeResult { write!(self.writer, "{}", v) }
    fn emit_u16(&mut self, v: u16) -> EncodeResult { write!(self.writer, "{}", v) }
    fn emit_u8(&mut self, v: u8) -> EncodeResult { write!(self.writer, "{}", v) }
454

455 456 457 458 459
    fn emit_int(&mut self, v: int) -> EncodeResult { write!(self.writer, "{}", v) }
    fn emit_i64(&mut self, v: i64) -> EncodeResult { write!(self.writer, "{}", v) }
    fn emit_i32(&mut self, v: i32) -> EncodeResult { write!(self.writer, "{}", v) }
    fn emit_i16(&mut self, v: i16) -> EncodeResult { write!(self.writer, "{}", v) }
    fn emit_i8(&mut self, v: i8) -> EncodeResult { write!(self.writer, "{}", v) }
460

S
Sean McArthur 已提交
461
    fn emit_bool(&mut self, v: bool) -> EncodeResult {
462
        if v {
A
Adolfo Ochagavía 已提交
463
            write!(self.writer, "true")
464
        } else {
A
Adolfo Ochagavía 已提交
465
            write!(self.writer, "false")
466 467 468
        }
    }

S
Sean McArthur 已提交
469
    fn emit_f64(&mut self, v: f64) -> EncodeResult {
A
Adolfo Ochagavía 已提交
470
        write!(self.writer, "{}", fmt_number_or_null(v))
A
Alex Crichton 已提交
471
    }
B
Barosl Lee 已提交
472 473 474
    fn emit_f32(&mut self, v: f32) -> EncodeResult {
        self.emit_f64(v as f64)
    }
475

476
    fn emit_char(&mut self, v: char) -> EncodeResult {
477
        escape_char(self.writer, v)
478
    }
S
Sean McArthur 已提交
479
    fn emit_str(&mut self, v: &str) -> EncodeResult {
480
        escape_str(self.writer, v)
A
Alex Crichton 已提交
481
    }
482

483 484 485
    fn emit_enum<F>(&mut self, _name: &str, f: F) -> EncodeResult where
        F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
    {
A
Adolfo Ochagavía 已提交
486 487
        f(self)
    }
488

489 490 491 492 493 494 495
    fn emit_enum_variant<F>(&mut self,
                            name: &str,
                            _id: uint,
                            cnt: uint,
                            f: F) -> EncodeResult where
        F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
    {
496 497 498 499
        // enums are encoded as strings or objects
        // Bunny => "Bunny"
        // Kangaroo(34,"William") => {"variant": "Kangaroo", "fields": [34,"William"]}
        if cnt == 0 {
500
            escape_str(self.writer, name)
501
        } else {
A
Adolfo Ochagavía 已提交
502
            try!(write!(self.writer, "{{\"variant\":"));
503
            try!(escape_str(self.writer, name));
A
Adolfo Ochagavía 已提交
504
            try!(write!(self.writer, ",\"fields\":["));
505
            try!(f(self));
A
Adolfo Ochagavía 已提交
506
            write!(self.writer, "]}}")
507 508
        }
    }
509

510 511 512
    fn emit_enum_variant_arg<F>(&mut self, idx: uint, f: F) -> EncodeResult where
        F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
    {
513
        if idx != 0 {
A
Adolfo Ochagavía 已提交
514
            try!(write!(self.writer, ","));
515
        }
S
Sean McArthur 已提交
516
        f(self)
517 518
    }

519 520 521 522 523 524 525
    fn emit_enum_struct_variant<F>(&mut self,
                                   name: &str,
                                   id: uint,
                                   cnt: uint,
                                   f: F) -> EncodeResult where
        F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
    {
526 527 528
        self.emit_enum_variant(name, id, cnt, f)
    }

529 530 531 532 533 534
    fn emit_enum_struct_variant_field<F>(&mut self,
                                         _: &str,
                                         idx: uint,
                                         f: F) -> EncodeResult where
        F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
    {
535 536 537
        self.emit_enum_variant_arg(idx, f)
    }

538 539 540
    fn emit_struct<F>(&mut self, _: &str, _: uint, f: F) -> EncodeResult where
        F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
    {
A
Adolfo Ochagavía 已提交
541
        try!(write!(self.writer, "{{"));
542
        try!(f(self));
A
Adolfo Ochagavía 已提交
543
        write!(self.writer, "}}")
544
    }
545

546 547 548
    fn emit_struct_field<F>(&mut self, name: &str, idx: uint, f: F) -> EncodeResult where
        F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
    {
A
Adolfo Ochagavía 已提交
549
        if idx != 0 { try!(write!(self.writer, ",")); }
550 551
        try!(escape_str(self.writer, name));
        try!(write!(self.writer, ":"));
S
Sean McArthur 已提交
552
        f(self)
553 554
    }

555 556 557
    fn emit_tuple<F>(&mut self, len: uint, f: F) -> EncodeResult where
        F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
    {
558 559
        self.emit_seq(len, f)
    }
560 561 562
    fn emit_tuple_arg<F>(&mut self, idx: uint, f: F) -> EncodeResult where
        F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
    {
563 564 565
        self.emit_seq_elt(idx, f)
    }

566 567 568
    fn emit_tuple_struct<F>(&mut self, _name: &str, len: uint, f: F) -> EncodeResult where
        F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
    {
569 570
        self.emit_seq(len, f)
    }
571 572 573
    fn emit_tuple_struct_arg<F>(&mut self, idx: uint, f: F) -> EncodeResult where
        F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
    {
574 575 576
        self.emit_seq_elt(idx, f)
    }

577 578 579
    fn emit_option<F>(&mut self, f: F) -> EncodeResult where
        F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
    {
S
Sean McArthur 已提交
580 581 582
        f(self)
    }
    fn emit_option_none(&mut self) -> EncodeResult { self.emit_nil() }
583 584 585
    fn emit_option_some<F>(&mut self, f: F) -> EncodeResult where
        F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
    {
S
Sean McArthur 已提交
586 587
        f(self)
    }
588

589 590 591
    fn emit_seq<F>(&mut self, _len: uint, f: F) -> EncodeResult where
        F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
    {
A
Adolfo Ochagavía 已提交
592
        try!(write!(self.writer, "["));
S
Sean McArthur 已提交
593
        try!(f(self));
A
Adolfo Ochagavía 已提交
594
        write!(self.writer, "]")
595 596
    }

597 598 599
    fn emit_seq_elt<F>(&mut self, idx: uint, f: F) -> EncodeResult where
        F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
    {
600
        if idx != 0 {
A
Adolfo Ochagavía 已提交
601
            try!(write!(self.writer, ","));
602 603 604 605
        }
        f(self)
    }

606 607 608
    fn emit_map<F>(&mut self, _len: uint, f: F) -> EncodeResult where
        F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
    {
A
Adolfo Ochagavía 已提交
609
        try!(write!(self.writer, "{{"));
610
        try!(f(self));
A
Adolfo Ochagavía 已提交
611
        write!(self.writer, "}}")
612
    }
613

614 615 616
    fn emit_map_elt_key<F>(&mut self, idx: uint, mut f: F) -> EncodeResult where
        F: FnMut(&mut Encoder<'a>) -> EncodeResult,
    {
A
Adolfo Ochagavía 已提交
617
        if idx != 0 { try!(write!(self.writer, ",")) }
618 619
        // ref #12967, make sure to wrap a key in double quotes,
        // in the event that its of a type that omits them (eg numbers)
D
Daniel Micay 已提交
620
        let mut buf = Vec::new();
N
Nick Cameron 已提交
621 622 623 624 625
        // FIXME(14302) remove the transmute and unsafe block.
        unsafe {
            let mut check_encoder = Encoder::new(&mut buf);
            try!(f(transmute(&mut check_encoder)));
        }
626
        let out = str::from_utf8(buf.index(&FullRange)).unwrap();
A
Adolfo Ochagavía 已提交
627 628
        let needs_wrapping = out.char_at(0) != '"' && out.char_at_reverse(out.len()) != '"';
        if needs_wrapping { try!(write!(self.writer, "\"")); }
S
Sean McArthur 已提交
629
        try!(f(self));
A
Adolfo Ochagavía 已提交
630
        if needs_wrapping { try!(write!(self.writer, "\"")); }
S
Sean McArthur 已提交
631
        Ok(())
632 633
    }

634 635 636
    fn emit_map_elt_val<F>(&mut self, _idx: uint, f: F) -> EncodeResult where
        F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
    {
A
Adolfo Ochagavía 已提交
637
        try!(write!(self.writer, ":"));
638 639 640 641
        f(self)
    }
}

642 643
/// Another encoder for JSON, but prints out human-readable JSON instead of
/// compact data
E
Erik Price 已提交
644
pub struct PrettyEncoder<'a> {
645
    writer: &'a mut (fmt::Writer+'a),
646
    curr_indent: uint,
647
    indent: uint,
648 649
}

E
Erik Price 已提交
650
impl<'a> PrettyEncoder<'a> {
651
    /// Creates a new encoder whose output will be written to the specified writer
652
    pub fn new(writer: &'a mut fmt::Writer) -> PrettyEncoder<'a> {
653 654 655 656 657
        PrettyEncoder { writer: writer, curr_indent: 0, indent: 2, }
    }

    /// Set the number of spaces to indent for each level.
    /// This is safe to set during encoding.
N
Niko Matsakis 已提交
658
    pub fn set_indent(&mut self, indent: uint) {
659
        // self.indent very well could be 0 so we need to use checked division.
660
        let level = self.curr_indent.checked_div(self.indent).unwrap_or(0);
661 662
        self.indent = indent;
        self.curr_indent = level * self.indent;
663
    }
664
}
665

666 667 668
impl<'a> ::Encoder for PrettyEncoder<'a> {
    type Error = fmt::Error;

A
Adolfo Ochagavía 已提交
669
    fn emit_nil(&mut self) -> EncodeResult { write!(self.writer, "null") }
670

671 672 673 674 675
    fn emit_uint(&mut self, v: uint) -> EncodeResult { write!(self.writer, "{}", v) }
    fn emit_u64(&mut self, v: u64) -> EncodeResult { write!(self.writer, "{}", v) }
    fn emit_u32(&mut self, v: u32) -> EncodeResult { write!(self.writer, "{}", v) }
    fn emit_u16(&mut self, v: u16) -> EncodeResult { write!(self.writer, "{}", v) }
    fn emit_u8(&mut self, v: u8) -> EncodeResult { write!(self.writer, "{}", v) }
676

677 678 679 680 681
    fn emit_int(&mut self, v: int) -> EncodeResult { write!(self.writer, "{}", v) }
    fn emit_i64(&mut self, v: i64) -> EncodeResult { write!(self.writer, "{}", v) }
    fn emit_i32(&mut self, v: i32) -> EncodeResult { write!(self.writer, "{}", v) }
    fn emit_i16(&mut self, v: i16) -> EncodeResult { write!(self.writer, "{}", v) }
    fn emit_i8(&mut self, v: i8) -> EncodeResult { write!(self.writer, "{}", v) }
682

S
Sean McArthur 已提交
683
    fn emit_bool(&mut self, v: bool) -> EncodeResult {
684
        if v {
A
Adolfo Ochagavía 已提交
685
            write!(self.writer, "true")
686
        } else {
A
Adolfo Ochagavía 已提交
687
            write!(self.writer, "false")
688 689 690
        }
    }

S
Sean McArthur 已提交
691
    fn emit_f64(&mut self, v: f64) -> EncodeResult {
A
Adolfo Ochagavía 已提交
692
        write!(self.writer, "{}", fmt_number_or_null(v))
A
Alex Crichton 已提交
693
    }
694 695 696
    fn emit_f32(&mut self, v: f32) -> EncodeResult {
        self.emit_f64(v as f64)
    }
697

698
    fn emit_char(&mut self, v: char) -> EncodeResult {
699
        escape_char(self.writer, v)
700
    }
S
Sean McArthur 已提交
701
    fn emit_str(&mut self, v: &str) -> EncodeResult {
702
        escape_str(self.writer, v)
A
Alex Crichton 已提交
703
    }
704

705 706 707
    fn emit_enum<F>(&mut self, _name: &str, f: F) -> EncodeResult where
        F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
    {
708 709 710
        f(self)
    }

711 712 713 714 715 716 717 718
    fn emit_enum_variant<F>(&mut self,
                            name: &str,
                            _id: uint,
                            cnt: uint,
                            f: F)
                            -> EncodeResult where
        F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
    {
719
        if cnt == 0 {
720
            escape_str(self.writer, name)
721
        } else {
722
            try!(write!(self.writer, "{{\n"));
723 724
            self.curr_indent += self.indent;
            try!(spaces(self.writer, self.curr_indent));
725
            try!(write!(self.writer, "\"variant\": "));
726 727
            try!(escape_str(self.writer, name));
            try!(write!(self.writer, ",\n"));
728 729 730
            try!(spaces(self.writer, self.curr_indent));
            try!(write!(self.writer, "\"fields\": [\n"));
            self.curr_indent += self.indent;
S
Sean McArthur 已提交
731
            try!(f(self));
732
            self.curr_indent -= self.indent;
733
            try!(write!(self.writer, "\n"));
734
            try!(spaces(self.writer, self.curr_indent));
735 736 737 738
            self.curr_indent -= self.indent;
            try!(write!(self.writer, "]\n"));
            try!(spaces(self.writer, self.curr_indent));
            write!(self.writer, "}}")
739 740 741
        }
    }

742 743 744
    fn emit_enum_variant_arg<F>(&mut self, idx: uint, f: F) -> EncodeResult where
        F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
    {
745
        if idx != 0 {
A
Adolfo Ochagavía 已提交
746
            try!(write!(self.writer, ",\n"));
747
        }
748
        try!(spaces(self.writer, self.curr_indent));
749 750 751
        f(self)
    }

752 753 754 755 756 757 758
    fn emit_enum_struct_variant<F>(&mut self,
                                   name: &str,
                                   id: uint,
                                   cnt: uint,
                                   f: F) -> EncodeResult where
        F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
    {
759 760 761
        self.emit_enum_variant(name, id, cnt, f)
    }

762 763 764 765 766 767
    fn emit_enum_struct_variant_field<F>(&mut self,
                                         _: &str,
                                         idx: uint,
                                         f: F) -> EncodeResult where
        F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
    {
768 769 770 771
        self.emit_enum_variant_arg(idx, f)
    }


772 773 774
    fn emit_struct<F>(&mut self, _: &str, len: uint, f: F) -> EncodeResult where
        F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
    {
775
        if len == 0 {
A
Adolfo Ochagavía 已提交
776
            write!(self.writer, "{{}}")
777
        } else {
A
Adolfo Ochagavía 已提交
778
            try!(write!(self.writer, "{{"));
779
            self.curr_indent += self.indent;
780
            try!(f(self));
781
            self.curr_indent -= self.indent;
782
            try!(write!(self.writer, "\n"));
783
            try!(spaces(self.writer, self.curr_indent));
784
            write!(self.writer, "}}")
785 786
        }
    }
787

788 789 790
    fn emit_struct_field<F>(&mut self, name: &str, idx: uint, f: F) -> EncodeResult where
        F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
    {
791
        if idx == 0 {
A
Adolfo Ochagavía 已提交
792
            try!(write!(self.writer, "\n"));
793
        } else {
A
Adolfo Ochagavía 已提交
794
            try!(write!(self.writer, ",\n"));
795
        }
796
        try!(spaces(self.writer, self.curr_indent));
797 798
        try!(escape_str(self.writer, name));
        try!(write!(self.writer, ": "));
S
Sean McArthur 已提交
799
        f(self)
800 801
    }

802 803 804
    fn emit_tuple<F>(&mut self, len: uint, f: F) -> EncodeResult where
        F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
    {
805 806
        self.emit_seq(len, f)
    }
807 808 809
    fn emit_tuple_arg<F>(&mut self, idx: uint, f: F) -> EncodeResult where
        F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
    {
810 811 812
        self.emit_seq_elt(idx, f)
    }

813 814 815
    fn emit_tuple_struct<F>(&mut self, _: &str, len: uint, f: F) -> EncodeResult where
        F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
    {
816 817
        self.emit_seq(len, f)
    }
818 819 820
    fn emit_tuple_struct_arg<F>(&mut self, idx: uint, f: F) -> EncodeResult where
        F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
    {
821 822 823
        self.emit_seq_elt(idx, f)
    }

824 825 826
    fn emit_option<F>(&mut self, f: F) -> EncodeResult where
        F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
    {
S
Sean McArthur 已提交
827 828 829
        f(self)
    }
    fn emit_option_none(&mut self) -> EncodeResult { self.emit_nil() }
830 831 832
    fn emit_option_some<F>(&mut self, f: F) -> EncodeResult where
        F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
    {
S
Sean McArthur 已提交
833 834
        f(self)
    }
835

836 837 838
    fn emit_seq<F>(&mut self, len: uint, f: F) -> EncodeResult where
        F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
    {
839
        if len == 0 {
A
Adolfo Ochagavía 已提交
840
            write!(self.writer, "[]")
841
        } else {
A
Adolfo Ochagavía 已提交
842
            try!(write!(self.writer, "["));
843
            self.curr_indent += self.indent;
S
Sean McArthur 已提交
844
            try!(f(self));
845
            self.curr_indent -= self.indent;
846
            try!(write!(self.writer, "\n"));
847
            try!(spaces(self.writer, self.curr_indent));
848
            write!(self.writer, "]")
849 850 851
        }
    }

852 853 854
    fn emit_seq_elt<F>(&mut self, idx: uint, f: F) -> EncodeResult where
        F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
    {
855
        if idx == 0 {
A
Adolfo Ochagavía 已提交
856
            try!(write!(self.writer, "\n"));
857
        } else {
A
Adolfo Ochagavía 已提交
858
            try!(write!(self.writer, ",\n"));
859
        }
860
        try!(spaces(self.writer, self.curr_indent));
861 862 863
        f(self)
    }

864 865 866
    fn emit_map<F>(&mut self, len: uint, f: F) -> EncodeResult where
        F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
    {
867
        if len == 0 {
A
Adolfo Ochagavía 已提交
868
            write!(self.writer, "{{}}")
869
        } else {
A
Adolfo Ochagavía 已提交
870
            try!(write!(self.writer, "{{"));
871
            self.curr_indent += self.indent;
872
            try!(f(self));
873
            self.curr_indent -= self.indent;
874
            try!(write!(self.writer, "\n"));
875
            try!(spaces(self.writer, self.curr_indent));
876
            write!(self.writer, "}}")
877 878
        }
    }
879

880 881 882
    fn emit_map_elt_key<F>(&mut self, idx: uint, mut f: F) -> EncodeResult where
        F: FnMut(&mut PrettyEncoder<'a>) -> EncodeResult,
    {
883
        if idx == 0 {
A
Adolfo Ochagavía 已提交
884
            try!(write!(self.writer, "\n"));
885
        } else {
A
Adolfo Ochagavía 已提交
886
            try!(write!(self.writer, ",\n"));
887
        }
888
        try!(spaces(self.writer, self.curr_indent));
889 890
        // ref #12967, make sure to wrap a key in double quotes,
        // in the event that its of a type that omits them (eg numbers)
D
Daniel Micay 已提交
891
        let mut buf = Vec::new();
N
Nick Cameron 已提交
892 893 894 895 896
        // FIXME(14302) remove the transmute and unsafe block.
        unsafe {
            let mut check_encoder = PrettyEncoder::new(&mut buf);
            try!(f(transmute(&mut check_encoder)));
        }
897
        let out = str::from_utf8(buf.index(&FullRange)).unwrap();
A
Adolfo Ochagavía 已提交
898 899
        let needs_wrapping = out.char_at(0) != '"' && out.char_at_reverse(out.len()) != '"';
        if needs_wrapping { try!(write!(self.writer, "\"")); }
S
Sean McArthur 已提交
900
        try!(f(self));
A
Adolfo Ochagavía 已提交
901
        if needs_wrapping { try!(write!(self.writer, "\"")); }
S
Sean McArthur 已提交
902
        Ok(())
903 904
    }

905 906 907
    fn emit_map_elt_val<F>(&mut self, _idx: uint, f: F) -> EncodeResult where
        F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
    {
A
Adolfo Ochagavía 已提交
908
        try!(write!(self.writer, ": "));
S
Sean McArthur 已提交
909
        f(self)
910 911 912
    }
}

913 914
impl Encodable for Json {
    fn encode<E: ::Encoder>(&self, e: &mut E) -> Result<(), E::Error> {
915
        match *self {
916 917 918 919 920 921 922 923
            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(),
924 925 926 927
        }
    }
}

928 929 930 931 932
/// 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 }
}
933

934 935 936 937 938
/// 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 }
}
939

940 941 942 943 944
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 }
945
    }
946 947 948

     /// If the Json value is an Object, returns the value associated with the provided key.
    /// Otherwise, returns None.
949 950
    pub fn find<'a>(&'a self, key: &str) -> Option<&'a Json>{
        match self {
951
            &Json::Object(ref map) => map.get(key),
952 953 954 955
            _ => None
        }
    }

956
    /// Attempts to get a nested Json Object for each key in `keys`.
957
    /// If any key is found not to exist, find_path will return None.
958
    /// Otherwise, it will return the Json value associated with the final key.
959
    pub fn find_path<'a>(&'a self, keys: &[&str]) -> Option<&'a Json>{
960 961 962 963 964 965 966 967
        let mut target = self;
        for key in keys.iter() {
            match target.find(*key) {
                Some(t) => { target = t; },
                None => return None
            }
        }
        Some(target)
968 969 970 971 972
    }

    /// 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.
973 974
    pub fn search<'a>(&'a self, key: &str) -> Option<&'a Json> {
        match self {
975
            &Json::Object(ref map) => {
A
Aaron Turon 已提交
976
                match map.get(key) {
977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992
                    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
        }
    }

993 994
    /// Returns true if the Json value is an Object. Returns false otherwise.
    pub fn is_object<'a>(&'a self) -> bool {
995
        self.as_object().is_some()
996 997
    }

A
Alexis Beingessner 已提交
998
    /// If the Json value is an Object, returns the associated BTreeMap.
999
    /// Returns None otherwise.
1000
    pub fn as_object<'a>(&'a self) -> Option<&'a Object> {
1001
        match self {
1002
            &Json::Object(ref map) => Some(map),
1003 1004 1005 1006
            _ => None
        }
    }

C
Corey Farwell 已提交
1007
    /// Returns true if the Json value is an Array. Returns false otherwise.
C
Corey Farwell 已提交
1008 1009
    pub fn is_array<'a>(&'a self) -> bool {
        self.as_array().is_some()
1010 1011
    }

C
Corey Farwell 已提交
1012
    /// If the Json value is an Array, returns the associated vector.
1013
    /// Returns None otherwise.
1014
    pub fn as_array<'a>(&'a self) -> Option<&'a Array> {
1015
        match self {
1016
            &Json::Array(ref array) => Some(&*array),
1017 1018 1019 1020 1021
            _ => None
        }
    }

    /// Returns true if the Json value is a String. Returns false otherwise.
1022 1023
    pub fn is_string<'a>(&'a self) -> bool {
        self.as_string().is_some()
1024 1025 1026 1027
    }

    /// If the Json value is a String, returns the associated str.
    /// Returns None otherwise.
1028
    pub fn as_string<'a>(&'a self) -> Option<&'a str> {
1029
        match *self {
1030
            Json::String(ref s) => Some(s.index(&FullRange)),
1031 1032 1033 1034 1035 1036
            _ => None
        }
    }

    /// Returns true if the Json value is a Number. Returns false otherwise.
    pub fn is_number(&self) -> bool {
1037
        match *self {
1038
            Json::I64(_) | Json::U64(_) | Json::F64(_) => true,
1039 1040 1041 1042 1043 1044 1045
            _ => false,
        }
    }

    /// Returns true if the Json value is a i64. Returns false otherwise.
    pub fn is_i64(&self) -> bool {
        match *self {
1046
            Json::I64(_) => true,
1047 1048 1049 1050 1051 1052 1053
            _ => false,
        }
    }

    /// Returns true if the Json value is a u64. Returns false otherwise.
    pub fn is_u64(&self) -> bool {
        match *self {
1054
            Json::U64(_) => true,
1055 1056
            _ => false,
        }
1057 1058
    }

1059 1060 1061
    /// Returns true if the Json value is a f64. Returns false otherwise.
    pub fn is_f64(&self) -> bool {
        match *self {
1062
            Json::F64(_) => true,
1063 1064 1065 1066
            _ => false,
        }
    }

1067
    /// If the Json value is a number, return or cast it to a i64.
1068
    /// Returns None otherwise.
1069 1070
    pub fn as_i64(&self) -> Option<i64> {
        match *self {
1071 1072
            Json::I64(n) => Some(n),
            Json::U64(n) => num::cast(n),
1073 1074 1075 1076 1077 1078 1079 1080
            _ => 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 {
1081 1082
            Json::I64(n) => num::cast(n),
            Json::U64(n) => Some(n),
1083 1084 1085 1086
            _ => None
        }
    }

1087
    /// If the Json value is a number, return or cast it to a f64.
1088 1089 1090
    /// Returns None otherwise.
    pub fn as_f64(&self) -> Option<f64> {
        match *self {
1091 1092 1093
            Json::I64(n) => num::cast(n),
            Json::U64(n) => num::cast(n),
            Json::F64(n) => Some(n),
1094 1095 1096 1097 1098 1099
            _ => None
        }
    }

    /// Returns true if the Json value is a Boolean. Returns false otherwise.
    pub fn is_boolean(&self) -> bool {
1100
        self.as_boolean().is_some()
1101 1102 1103 1104 1105 1106
    }

    /// If the Json value is a Boolean, returns the associated bool.
    /// Returns None otherwise.
    pub fn as_boolean(&self) -> Option<bool> {
        match self {
1107
            &Json::Boolean(b) => Some(b),
1108 1109 1110 1111 1112 1113
            _ => None
        }
    }

    /// Returns true if the Json value is a Null. Returns false otherwise.
    pub fn is_null(&self) -> bool {
1114
        self.as_null().is_some()
1115 1116 1117 1118 1119 1120
    }

    /// If the Json value is a Null, returns ().
    /// Returns None otherwise.
    pub fn as_null(&self) -> Option<()> {
        match self {
1121
            &Json::Null => Some(()),
1122 1123 1124
            _ => None
        }
    }
E
Elly Jones 已提交
1125 1126
}

N
fallout  
Nick Cameron 已提交
1127
impl<'a> Index<&'a str>  for Json {
J
Jorge Aparicio 已提交
1128 1129 1130 1131 1132 1133 1134
    type Output = Json;

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

N
fallout  
Nick Cameron 已提交
1135
impl Index<uint> for Json {
J
Jorge Aparicio 已提交
1136 1137 1138 1139 1140 1141 1142 1143 1144 1145
    type Output = Json;

    fn index<'a>(&'a self, idx: &uint) -> &'a Json {
        match self {
            &Json::Array(ref v) => v.index(idx),
            _ => panic!("can only index Json with uint if it is an array")
        }
    }
}

1146
/// The output of the streaming parser.
1147
#[derive(PartialEq, Clone, Show)]
1148 1149 1150
pub enum JsonEvent {
    ObjectStart,
    ObjectEnd,
C
Corey Farwell 已提交
1151 1152
    ArrayStart,
    ArrayEnd,
1153
    BooleanValue(bool),
1154 1155 1156
    I64Value(i64),
    U64Value(u64),
    F64Value(f64),
1157
    StringValue(string::String),
1158 1159 1160 1161
    NullValue,
    Error(ParserError),
}

1162
#[derive(PartialEq, Show)]
1163
enum ParserState {
C
Corey Farwell 已提交
1164
    // Parse a value in an array, true means first element.
1165
    ParseArray(bool),
C
Corey Farwell 已提交
1166
    // Parse ',' or ']' after an element in an array.
C
Corey Farwell 已提交
1167
    ParseArrayComma,
1168 1169 1170 1171
    // 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 已提交
1172
    // Initial state.
1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188
    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 已提交
1189 1190
/// For example, StackElement::Key("foo"), StackElement::Key("bar"),
/// StackElement::Index(3) and StackElement::Key("x") are the
1191
/// StackElements compositing the stack that represents foo.bar[3].x
1192
#[derive(PartialEq, Clone, Show)]
1193 1194 1195 1196 1197 1198 1199
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.
1200
#[derive(PartialEq, Clone, Show)]
1201 1202 1203 1204 1205 1206 1207
enum InternalStackElement {
    InternalIndex(u32),
    InternalKey(u16, u16), // start, size
}

impl Stack {
    pub fn new() -> Stack {
A
Adolfo Ochagavía 已提交
1208
        Stack { stack: Vec::new(), str_buffer: Vec::new() }
1209 1210 1211 1212 1213
    }

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

A
Adolfo Ochagavía 已提交
1214 1215
    /// Returns true if the stack is empty.
    pub fn is_empty(&self) -> bool { self.stack.is_empty() }
1216 1217 1218 1219 1220

    /// 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 已提交
1221
        match self.stack[idx] {
1222
            InternalIndex(i) => StackElement::Index(i),
A
Adolfo Ochagavía 已提交
1223
            InternalKey(start, size) => {
1224 1225 1226
                StackElement::Key(str::from_utf8(
                    self.str_buffer.index(&((start as uint) .. (start as uint + size as uint))))
                        .unwrap())
A
Adolfo Ochagavía 已提交
1227
            }
1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264
        }
    }

    /// 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,
1265
            Some(&InternalIndex(i)) => Some(StackElement::Index(i)),
1266
            Some(&InternalKey(start, size)) => {
1267 1268
                Some(StackElement::Key(str::from_utf8(
                    self.str_buffer.index(&((start as uint) .. (start+size) as uint))
1269 1270 1271 1272 1273
                ).unwrap()))
            }
        }
    }

1274
    // Used by Parser to insert StackElement::Key elements at the top of the stack.
1275
    fn push_key(&mut self, key: string::String) {
1276 1277 1278 1279 1280 1281
        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);
        }
    }

1282
    // Used by Parser to insert StackElement::Index elements at the top of the stack.
1283 1284 1285 1286 1287 1288 1289 1290 1291 1292
    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 已提交
1293
                self.str_buffer.truncate(new_size);
1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312
            }
            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 已提交
1313
            InternalIndex(i) => { i + 1 }
S
Steve Klabnik 已提交
1314
            _ => { panic!(); }
1315
        };
1316
        self.stack[len - 1] = InternalIndex(idx);
1317 1318 1319 1320 1321
    }
}

/// A streaming JSON parser implemented as an iterator of JsonEvent, consuming
/// an iterator of char.
G
Gary Linscott 已提交
1322
pub struct Parser<T> {
1323 1324 1325 1326
    rdr: T,
    ch: Option<char>,
    line: uint,
    col: uint,
1327 1328 1329
    // We maintain a stack representing where we are in the logical structure
    // of the JSON stream.
    stack: Stack,
J
Joseph Crail 已提交
1330
    // A state machine is kept to make it possible to interrupt and resume parsing.
1331 1332 1333
    state: ParserState,
}

J
Jorge Aparicio 已提交
1334 1335 1336
impl<T: Iterator<Item=char>> Iterator for Parser<T> {
    type Item = JsonEvent;

1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354
    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());
    }
1355 1356
}

J
Jorge Aparicio 已提交
1357
impl<T: Iterator<Item=char>> Parser<T> {
1358
    /// Creates the JSON parser.
1359
    pub fn new(rdr: T) -> Parser<T> {
1360 1361
        let mut p = Parser {
            rdr: rdr,
1362
            ch: Some('\x00'),
1363 1364
            line: 1,
            col: 0,
1365 1366
            stack: Stack::new(),
            state: ParseStart,
1367 1368
        };
        p.bump();
1369
        return p;
1370
    }
E
Elly Jones 已提交
1371

1372 1373 1374
    /// Provides access to the current position in the logical structure of the
    /// JSON stream.
    pub fn stack<'l>(&'l self) -> &'l Stack {
1375
        return &self.stack;
1376
    }
1377

1378 1379
    fn eof(&self) -> bool { self.ch.is_none() }
    fn ch_or_null(&self) -> char { self.ch.unwrap_or('\x00') }
1380
    fn bump(&mut self) {
1381
        self.ch = self.rdr.next();
E
Elly Jones 已提交
1382

1383
        if self.ch_is('\n') {
1384 1385
            self.line += 1u;
            self.col = 1u;
G
Gary Linscott 已提交
1386 1387
        } else {
            self.col += 1u;
E
Elly Jones 已提交
1388
        }
1389 1390
    }

1391
    fn next_char(&mut self) -> Option<char> {
1392 1393 1394
        self.bump();
        self.ch
    }
1395 1396 1397
    fn ch_is(&self, c: char) -> bool {
        self.ch == Some(c)
    }
1398

1399 1400
    fn error<T>(&self, reason: ErrorCode) -> Result<T, ParserError> {
        Err(SyntaxError(reason, self.line, self.col))
1401 1402
    }

1403
    fn parse_whitespace(&mut self) {
1404 1405 1406 1407
        while self.ch_is(' ') ||
              self.ch_is('\n') ||
              self.ch_is('\t') ||
              self.ch_is('\r') { self.bump(); }
1408 1409
    }

1410
    fn parse_number(&mut self) -> JsonEvent {
1411
        let mut neg = false;
1412

1413
        if self.ch_is('-') {
1414
            self.bump();
1415
            neg = true;
E
Elly Jones 已提交
1416
        }
1417

1418
        let res = match self.parse_u64() {
1419 1420 1421
            Ok(res) => res,
            Err(e) => { return Error(e); }
        };
1422

1423 1424
        if self.ch_is('.') || self.ch_is('e') || self.ch_is('E') {
            let mut res = res as f64;
1425

1426 1427 1428 1429 1430 1431
            if self.ch_is('.') {
                res = match self.parse_decimal(res) {
                    Ok(res) => res,
                    Err(e) => { return Error(e); }
                };
            }
1432

1433 1434 1435 1436 1437 1438 1439
            if self.ch_is('e') || self.ch_is('E') {
                res = match self.parse_exponent(res) {
                    Ok(res) => res,
                    Err(e) => { return Error(e); }
                };
            }

1440 1441 1442 1443 1444
            if neg {
                res *= -1.0;
            }

            F64Value(res)
1445
        } else {
1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457
            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)
            }
1458
        }
E
Elly Jones 已提交
1459 1460
    }

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

1465 1466 1467
        match self.ch_or_null() {
            '0' => {
                self.bump();
1468

M
mrec 已提交
1469
                // A leading '0' must be the only digit before the decimal point.
1470
                match self.ch_or_null() {
1471
                    '0' ... '9' => return self.error(InvalidNumber),
1472 1473 1474
                    _ => ()
                }
            },
1475
            '1' ... '9' => {
1476 1477
                while !self.eof() {
                    match self.ch_or_null() {
1478
                        c @ '0' ... '9' => {
1479 1480 1481 1482 1483 1484
                            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); }

1485 1486 1487 1488
                            self.bump();
                        }
                        _ => break,
                    }
1489 1490
                }
            }
1491
            _ => return self.error(InvalidNumber),
E
Elly Jones 已提交
1492
        }
1493 1494

        Ok(accum)
E
Elly Jones 已提交
1495 1496
    }

A
Adolfo Ochagavía 已提交
1497
    fn parse_decimal(&mut self, mut res: f64) -> Result<f64, ParserError> {
1498 1499 1500
        self.bump();

        // Make sure a digit follows the decimal place.
1501
        match self.ch_or_null() {
1502
            '0' ... '9' => (),
1503
             _ => return self.error(InvalidNumber)
1504 1505
        }

D
Daniel Micay 已提交
1506
        let mut dec = 1.0;
1507
        while !self.eof() {
1508
            match self.ch_or_null() {
1509
                c @ '0' ... '9' => {
1510 1511 1512 1513 1514
                    dec /= 10.0;
                    res += (((c as int) - ('0' as int)) as f64) * dec;
                    self.bump();
                }
                _ => break,
E
Elly Jones 已提交
1515 1516
            }
        }
1517

1518
        Ok(res)
E
Elly Jones 已提交
1519 1520
    }

1521
    fn parse_exponent(&mut self, mut res: f64) -> Result<f64, ParserError> {
1522 1523
        self.bump();

1524 1525
        let mut exp = 0u;
        let mut neg_exp = false;
1526

1527 1528 1529 1530 1531
        if self.ch_is('+') {
            self.bump();
        } else if self.ch_is('-') {
            self.bump();
            neg_exp = true;
1532 1533 1534
        }

        // Make sure a digit follows the exponent place.
1535
        match self.ch_or_null() {
1536
            '0' ... '9' => (),
1537
            _ => return self.error(InvalidNumber)
1538 1539
        }
        while !self.eof() {
1540
            match self.ch_or_null() {
1541
                c @ '0' ... '9' => {
1542 1543
                    exp *= 10;
                    exp += (c as uint) - ('0' as uint);
1544

1545 1546 1547
                    self.bump();
                }
                _ => break
1548 1549 1550
            }
        }

1551
        let exp = 10_f64.powi(exp as i32);
1552 1553 1554 1555 1556 1557
        if neg_exp {
            res /= exp;
        } else {
            res *= exp;
        }

1558
        Ok(res)
E
Elly Jones 已提交
1559 1560
    }

1561
    fn decode_hex_escape(&mut self) -> Result<u16, ParserError> {
1562 1563
        let mut i = 0u;
        let mut n = 0u16;
A
Adolfo Ochagavía 已提交
1564
        while i < 4 && !self.eof() {
1565 1566
            self.bump();
            n = match self.ch_or_null() {
1567
                c @ '0' ... '9' => n * 16 + ((c as u16) - ('0' as u16)),
A
Adolfo Ochagavía 已提交
1568 1569 1570 1571 1572 1573
                '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,
1574
                _ => return self.error(InvalidEscape)
1575 1576 1577 1578 1579 1580
            };

            i += 1u;
        }

        // Error out if we didn't parse 4 digits.
A
Adolfo Ochagavía 已提交
1581
        if i != 4 {
1582
            return self.error(InvalidEscape);
1583 1584 1585 1586 1587
        }

        Ok(n)
    }

1588
    fn parse_str(&mut self) -> Result<string::String, ParserError> {
1589
        let mut escape = false;
1590
        let mut res = string::String::new();
1591

G
Gary Linscott 已提交
1592
        loop {
1593
            self.bump();
G
Gary Linscott 已提交
1594
            if self.eof() {
1595
                return self.error(EOFWhileParsingString);
G
Gary Linscott 已提交
1596
            }
1597

H
Huon Wilson 已提交
1598
            if escape {
1599
                match self.ch_or_null() {
1600 1601 1602 1603 1604 1605 1606 1607
                    '"' => 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'),
1608
                    'u' => match try!(self.decode_hex_escape()) {
1609 1610 1611
                        0xDC00 ... 0xDFFF => {
                            return self.error(LoneLeadingSurrogateInHexEscape)
                        }
1612 1613 1614

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

1621
                            let buf = [n1, try!(self.decode_hex_escape())];
A
Alex Crichton 已提交
1622 1623
                            match unicode_str::utf16_items(&buf).next() {
                                Some(Utf16Item::ScalarValue(c)) => res.push(c),
1624
                                _ => return self.error(LoneLeadingSurrogateInHexEscape),
1625
                            }
1626 1627
                        }

1628
                        n => match char::from_u32(n as u32) {
1629
                            Some(c) => res.push(c),
1630
                            None => return self.error(InvalidUnicodeCodePoint),
1631 1632
                        },
                    },
1633
                    _ => return self.error(InvalidEscape),
1634 1635
                }
                escape = false;
1636
            } else if self.ch_is('\\') {
1637 1638
                escape = true;
            } else {
1639
                match self.ch {
1640 1641
                    Some('"') => {
                        self.bump();
1642
                        return Ok(res);
1643
                    },
1644
                    Some(c) => res.push(c),
1645
                    None => unreachable!()
1646
                }
E
Elly Jones 已提交
1647 1648 1649 1650
            }
        }
    }

1651 1652 1653 1654
    // 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 已提交
1655
    // stream int the form of a stack that can be queried by the user using the
1656 1657 1658 1659
    // stack() method.
    fn parse(&mut self) -> JsonEvent {
        loop {
            // The only paths where the loop can spin a new iteration
C
Corey Farwell 已提交
1660
            // are in the cases ParseArrayComma and ParseObjectComma if ','
1661
            // is parsed. In these cases the state is set to (respectively)
1662
            // ParseArray(false) and ParseObject(false), which always return,
1663 1664 1665
            // 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();
1666

1667 1668 1669 1670
            match self.state {
                ParseStart => {
                    return self.parse_start();
                }
1671
                ParseArray(first) => {
C
Corey Farwell 已提交
1672
                    return self.parse_array(first);
1673
                }
C
Corey Farwell 已提交
1674 1675
                ParseArrayComma => {
                    match self.parse_array_comma_or_end() {
1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701
                        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 {
1702 1703 1704 1705
            Error(_) => ParseFinished,
            ArrayStart => ParseArray(true),
            ObjectStart => ParseObject(true),
            _ => ParseBeforeFinish,
1706 1707 1708
        };
        return val;
    }
1709

C
Corey Farwell 已提交
1710
    fn parse_array(&mut self, first: bool) -> JsonEvent {
1711
        if self.ch_is(']') {
1712
            if !first {
1713
                self.error_event(InvalidSyntax)
1714
            } else {
1715 1716 1717
                self.state = if self.stack.is_empty() {
                    ParseBeforeFinish
                } else if self.stack.last_is_index() {
C
Corey Farwell 已提交
1718
                    ParseArrayComma
1719 1720
                } else {
                    ParseObjectComma
1721 1722 1723
                };
                self.bump();
                ArrayEnd
1724
            }
1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736
        } 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
1737
        }
1738
    }
1739

C
Corey Farwell 已提交
1740
    fn parse_array_comma_or_end(&mut self) -> Option<JsonEvent> {
1741 1742
        if self.ch_is(',') {
            self.stack.bump_index();
1743
            self.state = ParseArray(false);
1744
            self.bump();
1745
            None
1746 1747
        } else if self.ch_is(']') {
            self.stack.pop();
1748 1749 1750 1751
            self.state = if self.stack.is_empty() {
                ParseBeforeFinish
            } else if self.stack.last_is_index() {
                ParseArrayComma
1752
            } else {
1753 1754
                ParseObjectComma
            };
1755
            self.bump();
1756
            Some(ArrayEnd)
1757
        } else if self.eof() {
1758
            Some(self.error_event(EOFWhileParsingArray))
1759
        } else {
1760
            Some(self.error_event(InvalidSyntax))
1761
        }
E
Elly Jones 已提交
1762 1763
    }

1764 1765 1766
    fn parse_object(&mut self, first: bool) -> JsonEvent {
        if self.ch_is('}') {
            if !first {
1767 1768 1769 1770 1771
                if self.stack.is_empty() {
                    return self.error_event(TrailingComma);
                } else {
                    self.stack.pop();
                }
1772
            }
1773 1774 1775 1776
            self.state = if self.stack.is_empty() {
                ParseBeforeFinish
            } else if self.stack.last_is_index() {
                ParseArrayComma
1777
            } else {
1778 1779
                ParseObjectComma
            };
1780 1781 1782 1783 1784 1785 1786 1787 1788 1789
            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() {
1790
            Ok(s) => s,
1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802
            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);
1803 1804 1805
        self.bump();
        self.parse_whitespace();

1806
        let val = self.parse_value();
1807

1808
        self.state = match val {
1809 1810 1811 1812
            Error(_) => ParseFinished,
            ArrayStart => ParseArray(true),
            ObjectStart => ParseObject(true),
            _ => ParseObjectComma,
1813 1814 1815 1816 1817
        };
        return val;
    }

    fn parse_object_end(&mut self) -> JsonEvent {
1818
        if self.ch_is('}') {
1819 1820 1821 1822
            self.state = if self.stack.is_empty() {
                ParseBeforeFinish
            } else if self.stack.last_is_index() {
                ParseArrayComma
1823
            } else {
1824 1825
                ParseObjectComma
            };
1826
            self.bump();
A
Adolfo Ochagavía 已提交
1827
            ObjectEnd
1828
        } else if self.eof() {
A
Adolfo Ochagavía 已提交
1829
            self.error_event(EOFWhileParsingObject)
1830
        } else {
A
Adolfo Ochagavía 已提交
1831
            self.error_event(InvalidSyntax)
1832
        }
1833
    }
1834

1835 1836 1837
    fn parse_value(&mut self) -> JsonEvent {
        if self.eof() { return self.error_event(EOFWhileParsingValue); }
        match self.ch_or_null() {
A
Adolfo Ochagavía 已提交
1838 1839 1840
            'n' => { self.parse_ident("ull", NullValue) }
            't' => { self.parse_ident("rue", BooleanValue(true)) }
            'f' => { self.parse_ident("alse", BooleanValue(false)) }
1841
            '0' ... '9' | '-' => self.parse_number(),
A
Adolfo Ochagavía 已提交
1842
            '"' => match self.parse_str() {
1843 1844 1845 1846 1847
                Ok(s) => StringValue(s),
                Err(e) => Error(e),
            },
            '[' => {
                self.bump();
C
Corey Farwell 已提交
1848
                ArrayStart
1849 1850 1851
            }
            '{' => {
                self.bump();
A
Adolfo Ochagavía 已提交
1852
                ObjectStart
1853
            }
A
Adolfo Ochagavía 已提交
1854
            _ => { self.error_event(InvalidSyntax) }
1855 1856
        }
    }
1857

1858 1859 1860 1861 1862 1863 1864 1865
    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))
        }
    }
1866

1867 1868 1869 1870 1871
    fn error_event(&mut self, reason: ErrorCode) -> JsonEvent {
        self.state = ParseFinished;
        Error(SyntaxError(reason, self.line, self.col))
    }
}
1872

1873 1874 1875 1876 1877
/// A Builder consumes a json::Parser to create a generic Json structure.
pub struct Builder<T> {
    parser: Parser<T>,
    token: Option<JsonEvent>,
}
1878

J
Jorge Aparicio 已提交
1879
impl<T: Iterator<Item=char>> Builder<T> {
1880 1881
    /// Create a JSON Builder.
    pub fn new(src: T) -> Builder<T> {
A
Adolfo Ochagavía 已提交
1882
        Builder { parser: Parser::new(src), token: None, }
1883 1884 1885 1886 1887 1888 1889 1890 1891 1892
    }

    // 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); }
1893
            ref tok => { panic!("unexpected token {:?}", tok.clone()); }
1894
        }
A
Adolfo Ochagavía 已提交
1895
        result
1896 1897 1898 1899 1900 1901 1902
    }

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

    fn build_value(&mut self) -> Result<Json, BuilderError> {
1903 1904 1905 1906 1907 1908
        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)),
1909
            Some(StringValue(ref mut s)) => {
1910
                let mut temp = string::String::new();
1911
                swap(s, &mut temp);
1912
                Ok(Json::String(temp))
1913
            }
1914 1915 1916 1917 1918 1919
            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),
1920 1921
        }
    }
1922

C
Corey Farwell 已提交
1923
    fn build_array(&mut self) -> Result<Json, BuilderError> {
1924 1925 1926 1927
        self.bump();
        let mut values = Vec::new();

        loop {
C
Corey Farwell 已提交
1928
            if self.token == Some(ArrayEnd) {
1929
                return Ok(Json::Array(values.into_iter().collect()));
1930 1931 1932 1933
            }
            match self.build_value() {
                Ok(v) => values.push(v),
                Err(e) => { return Err(e) }
1934
            }
1935
            self.bump();
1936
        }
1937
    }
1938

1939 1940 1941
    fn build_object(&mut self) -> Result<Json, BuilderError> {
        self.bump();

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

A
Adolfo Ochagavía 已提交
1944
        loop {
1945
            match self.token {
1946
                Some(ObjectEnd) => { return Ok(Json::Object(values)); }
1947 1948 1949 1950 1951
                Some(Error(e)) => { return Err(e); }
                None => { break; }
                _ => {}
            }
            let key = match self.parser.stack().top() {
1952
                Some(StackElement::Key(k)) => { k.to_string() }
S
Steve Klabnik 已提交
1953
                _ => { panic!("invalid state"); }
1954 1955 1956 1957 1958 1959 1960 1961
            };
            match self.build_value() {
                Ok(value) => { values.insert(key, value); }
                Err(e) => { return Err(e); }
            }
            self.bump();
        }
        return self.parser.error(EOFWhileParsingObject);
L
Lenny222 已提交
1962 1963 1964
    }
}

A
Alex Crichton 已提交
1965
/// Decodes a json value from an `&mut io::Reader`
1966
pub fn from_reader(rdr: &mut io::Reader) -> Result<Json, BuilderError> {
A
Alex Crichton 已提交
1967
    let contents = match rdr.read_to_end() {
1968
        Ok(c)  => c,
1969
        Err(e) => return Err(io_error_to_error(e))
A
Alex Crichton 已提交
1970
    };
A
Alex Crichton 已提交
1971
    let s = match str::from_utf8(contents.as_slice()).ok() {
1972 1973
        Some(s) => s,
        _       => return Err(SyntaxError(NotUtf8, 0, 0))
A
Alex Crichton 已提交
1974
    };
1975
    let mut builder = Builder::new(s.chars());
1976
    builder.build()
E
Elly Jones 已提交
1977 1978
}

1979
/// Decodes a json value from a string
1980 1981
pub fn from_str(s: &str) -> Result<Json, BuilderError> {
    let mut builder = Builder::new(s.chars());
A
Adolfo Ochagavía 已提交
1982
    builder.build()
1983 1984
}

1985
/// A structure to decode JSON to values in rust.
1986
pub struct Decoder {
1987
    stack: Vec<Json>,
1988 1989
}

1990 1991
impl Decoder {
    /// Creates a new decoder instance for decoding the specified JSON value.
1992
    pub fn new(json: Json) -> Decoder {
A
Adolfo Ochagavía 已提交
1993
        Decoder { stack: vec![json] }
1994
    }
1995 1996
}

1997
impl Decoder {
S
Sean McArthur 已提交
1998 1999
    fn pop(&mut self) -> Json {
        self.stack.pop().unwrap()
2000 2001 2002
    }
}

2003
macro_rules! expect {
S
Sean McArthur 已提交
2004 2005
    ($e:expr, Null) => ({
        match $e {
2006
            Json::Null => Ok(()),
A
Alex Crichton 已提交
2007
            other => Err(ExpectedError("Null".to_string(),
A
Alex Crichton 已提交
2008
                                       format!("{}", other)))
S
Sean McArthur 已提交
2009 2010 2011 2012
        }
    });
    ($e:expr, $t:ident) => ({
        match $e {
2013
            Json::$t(v) => Ok(v),
2014
            other => {
2015
                Err(ExpectedError(stringify!($t).to_string(),
A
Alex Crichton 已提交
2016
                                  format!("{}", other)))
2017
            }
2018
        }
S
Sean McArthur 已提交
2019
    })
2020
}
S
Sean McArthur 已提交
2021

2022 2023 2024 2025
macro_rules! read_primitive {
    ($name:ident, $ty:ty) => {
        fn $name(&mut self) -> DecodeResult<$ty> {
            match self.pop() {
B
Barosl Lee 已提交
2026 2027
                Json::I64(f) => match num::cast(f) {
                    Some(f) => Ok(f),
A
Alex Crichton 已提交
2028
                    None => Err(ExpectedError("Number".to_string(), format!("{}", f))),
2029
                },
B
Barosl Lee 已提交
2030 2031
                Json::U64(f) => match num::cast(f) {
                    Some(f) => Ok(f),
A
Alex Crichton 已提交
2032
                    None => Err(ExpectedError("Number".to_string(), format!("{}", f))),
B
Barosl Lee 已提交
2033
                },
A
Alex Crichton 已提交
2034
                Json::F64(f) => Err(ExpectedError("Integer".to_string(), format!("{}", f))),
B
Barosl Lee 已提交
2035 2036
                // 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 已提交
2037
                Json::String(s) => match s.parse() {
B
Barosl Lee 已提交
2038
                    Some(f) => Ok(f),
A
Alex Crichton 已提交
2039
                    None => Err(ExpectedError("Number".to_string(), s)),
2040
                },
A
Alex Crichton 已提交
2041
                value => Err(ExpectedError("Number".to_string(), format!("{}", value))),
2042 2043 2044 2045 2046
            }
        }
    }
}

2047 2048 2049
impl ::Decoder for Decoder {
    type Error = DecoderError;

S
Sean McArthur 已提交
2050
    fn read_nil(&mut self) -> DecodeResult<()> {
A
Adolfo Ochagavía 已提交
2051
        expect!(self.pop(), Null)
2052 2053
    }

2054 2055 2056 2057 2058 2059 2060 2061 2062 2063
    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 }
2064

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

S
Sean McArthur 已提交
2067 2068
    fn read_f64(&mut self) -> DecodeResult<f64> {
        match self.pop() {
2069 2070 2071 2072
            Json::I64(f) => Ok(f as f64),
            Json::U64(f) => Ok(f as f64),
            Json::F64(f) => Ok(f),
            Json::String(s) => {
2073
                // re: #12967.. a type w/ numeric keys (ie HashMap<uint, V> etc)
A
Adolfo Ochagavía 已提交
2074
                // is going to have a string here, as per JSON spec.
A
Alex Crichton 已提交
2075
                match s.parse() {
2076
                    Some(f) => Ok(f),
A
Alex Crichton 已提交
2077
                    None => Err(ExpectedError("Number".to_string(), s)),
2078
                }
2079
            },
2080
            Json::Null => Ok(f64::NAN),
A
Alex Crichton 已提交
2081
            value => Err(ExpectedError("Number".to_string(), format!("{}", value)))
2082 2083
        }
    }
2084

2085 2086 2087
    fn read_bool(&mut self) -> DecodeResult<bool> {
        expect!(self.pop(), Boolean)
    }
2088

S
Sean McArthur 已提交
2089 2090
    fn read_char(&mut self) -> DecodeResult<char> {
        let s = try!(self.read_str());
2091
        {
2092
            let mut it = s.chars();
2093 2094
            match (it.next(), it.next()) {
                // exactly one character
S
Sean McArthur 已提交
2095
                (Some(c), None) => return Ok(c),
2096 2097 2098
                _ => ()
            }
        }
A
Alex Crichton 已提交
2099
        Err(ExpectedError("single character string".to_string(), format!("{}", s)))
2100 2101
    }

2102
    fn read_str(&mut self) -> DecodeResult<string::String> {
A
Adolfo Ochagavía 已提交
2103
        expect!(self.pop(), String)
2104 2105
    }

E
Erick Tryzelaar 已提交
2106
    fn read_enum<T, F>(&mut self, _name: &str, f: F) -> DecodeResult<T> where
2107 2108
        F: FnOnce(&mut Decoder) -> DecodeResult<T>,
    {
2109 2110 2111
        f(self)
    }

2112 2113 2114
    fn read_enum_variant<T, F>(&mut self, names: &[&str],
                               mut f: F) -> DecodeResult<T>
        where F: FnMut(&mut Decoder, uint) -> DecodeResult<T>,
2115
    {
S
Sean McArthur 已提交
2116
        let name = match self.pop() {
2117 2118
            Json::String(s) => s,
            Json::Object(mut o) => {
A
Alex Crichton 已提交
2119
                let n = match o.remove(&"variant".to_string()) {
2120
                    Some(Json::String(s)) => s,
2121
                    Some(val) => {
A
Alex Crichton 已提交
2122
                        return Err(ExpectedError("String".to_string(), format!("{}", val)))
2123 2124
                    }
                    None => {
A
Alex Crichton 已提交
2125
                        return Err(MissingFieldError("variant".to_string()))
2126
                    }
2127
                };
A
Alex Crichton 已提交
2128
                match o.remove(&"fields".to_string()) {
2129
                    Some(Json::Array(l)) => {
A
Aaron Turon 已提交
2130
                        for field in l.into_iter().rev() {
A
Adolfo Ochagavía 已提交
2131
                            self.stack.push(field);
2132 2133
                        }
                    },
2134
                    Some(val) => {
A
Alex Crichton 已提交
2135
                        return Err(ExpectedError("Array".to_string(), format!("{}", val)))
2136 2137
                    }
                    None => {
A
Alex Crichton 已提交
2138
                        return Err(MissingFieldError("fields".to_string()))
2139
                    }
2140
                }
2141
                n
2142
            }
2143
            json => {
A
Alex Crichton 已提交
2144
                return Err(ExpectedError("String or Object".to_string(), format!("{}", json)))
2145
            }
2146
        };
2147
        let idx = match names.iter().position(|n| *n == name.index(&FullRange)) {
2148
            Some(idx) => idx,
S
Sean McArthur 已提交
2149
            None => return Err(UnknownVariantError(name))
2150 2151 2152 2153
        };
        f(self, idx)
    }

E
Erick Tryzelaar 已提交
2154
    fn read_enum_variant_arg<T, F>(&mut self, _idx: uint, f: F) -> DecodeResult<T> where
2155 2156
        F: FnOnce(&mut Decoder) -> DecodeResult<T>,
    {
2157 2158 2159
        f(self)
    }

2160
    fn read_enum_struct_variant<T, F>(&mut self, names: &[&str], f: F) -> DecodeResult<T> where
2161
        F: FnMut(&mut Decoder, uint) -> DecodeResult<T>,
2162
    {
2163 2164 2165 2166
        self.read_enum_variant(names, f)
    }


2167
    fn read_enum_struct_variant_field<T, F>(&mut self,
E
Erick Tryzelaar 已提交
2168
                                         _name: &str,
2169
                                         idx: uint,
2170 2171 2172 2173
                                         f: F)
                                         -> DecodeResult<T> where
        F: FnOnce(&mut Decoder) -> DecodeResult<T>,
    {
2174 2175 2176
        self.read_enum_variant_arg(idx, f)
    }

E
Erick Tryzelaar 已提交
2177
    fn read_struct<T, F>(&mut self, _name: &str, _len: uint, f: F) -> DecodeResult<T> where
2178 2179
        F: FnOnce(&mut Decoder) -> DecodeResult<T>,
    {
S
Sean McArthur 已提交
2180 2181 2182
        let value = try!(f(self));
        self.pop();
        Ok(value)
2183 2184
    }

2185 2186
    fn read_struct_field<T, F>(&mut self,
                               name: &str,
E
Erick Tryzelaar 已提交
2187
                               _idx: uint,
2188 2189 2190 2191
                               f: F)
                               -> DecodeResult<T> where
        F: FnOnce(&mut Decoder) -> DecodeResult<T>,
    {
S
Sean McArthur 已提交
2192 2193
        let mut obj = try!(expect!(self.pop(), Object));

2194
        let value = match obj.remove(&name.to_string()) {
2195 2196 2197
            None => {
                // Add a Null and try to parse it as an Option<_>
                // to get None as a default value.
2198
                self.stack.push(Json::Null);
2199 2200 2201 2202 2203
                match f(self) {
                    Ok(x) => x,
                    Err(_) => return Err(MissingFieldError(name.to_string())),
                }
            },
S
Sean McArthur 已提交
2204 2205 2206
            Some(json) => {
                self.stack.push(json);
                try!(f(self))
2207
            }
S
Sean McArthur 已提交
2208
        };
2209
        self.stack.push(Json::Object(obj));
S
Sean McArthur 已提交
2210
        Ok(value)
2211 2212
    }

2213 2214 2215 2216
    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| {
2217 2218 2219 2220 2221
            if len == tuple_len {
                f(d)
            } else {
                Err(ExpectedError(format!("Tuple{}", tuple_len), format!("Tuple{}", len)))
            }
2222
        })
2223 2224
    }

2225 2226 2227
    fn read_tuple_arg<T, F>(&mut self, idx: uint, f: F) -> DecodeResult<T> where
        F: FnOnce(&mut Decoder) -> DecodeResult<T>,
    {
2228 2229 2230
        self.read_seq_elt(idx, f)
    }

2231
    fn read_tuple_struct<T, F>(&mut self,
E
Erick Tryzelaar 已提交
2232
                               _name: &str,
2233 2234 2235 2236 2237
                               len: uint,
                               f: F)
                               -> DecodeResult<T> where
        F: FnOnce(&mut Decoder) -> DecodeResult<T>,
    {
2238
        self.read_tuple(len, f)
2239 2240
    }

2241 2242 2243 2244 2245 2246
    fn read_tuple_struct_arg<T, F>(&mut self,
                                   idx: uint,
                                   f: F)
                                   -> DecodeResult<T> where
        F: FnOnce(&mut Decoder) -> DecodeResult<T>,
    {
2247 2248 2249
        self.read_tuple_arg(idx, f)
    }

2250 2251
    fn read_option<T, F>(&mut self, mut f: F) -> DecodeResult<T> where
        F: FnMut(&mut Decoder, bool) -> DecodeResult<T>,
2252
    {
S
Sean McArthur 已提交
2253
        match self.pop() {
2254
            Json::Null => f(self, false),
2255 2256 2257 2258
            value => { self.stack.push(value); f(self, true) }
        }
    }

2259 2260 2261
    fn read_seq<T, F>(&mut self, f: F) -> DecodeResult<T> where
        F: FnOnce(&mut Decoder, uint) -> DecodeResult<T>,
    {
C
Corey Farwell 已提交
2262 2263 2264
        let array = try!(expect!(self.pop(), Array));
        let len = array.len();
        for v in array.into_iter().rev() {
S
Sean McArthur 已提交
2265 2266
            self.stack.push(v);
        }
2267 2268 2269
        f(self, len)
    }

E
Erick Tryzelaar 已提交
2270
    fn read_seq_elt<T, F>(&mut self, _idx: uint, f: F) -> DecodeResult<T> where
2271 2272
        F: FnOnce(&mut Decoder) -> DecodeResult<T>,
    {
2273 2274 2275
        f(self)
    }

2276 2277 2278
    fn read_map<T, F>(&mut self, f: F) -> DecodeResult<T> where
        F: FnOnce(&mut Decoder, uint) -> DecodeResult<T>,
    {
S
Sean McArthur 已提交
2279 2280
        let obj = try!(expect!(self.pop(), Object));
        let len = obj.len();
A
Aaron Turon 已提交
2281
        for (key, value) in obj.into_iter() {
S
Sean McArthur 已提交
2282
            self.stack.push(value);
2283
            self.stack.push(Json::String(key));
S
Sean McArthur 已提交
2284
        }
2285 2286 2287
        f(self, len)
    }

E
Erick Tryzelaar 已提交
2288
    fn read_map_elt_key<T, F>(&mut self, _idx: uint, f: F) -> DecodeResult<T> where
2289 2290
       F: FnOnce(&mut Decoder) -> DecodeResult<T>,
    {
2291 2292 2293
        f(self)
    }

E
Erick Tryzelaar 已提交
2294
    fn read_map_elt_val<T, F>(&mut self, _idx: uint, f: F) -> DecodeResult<T> where
2295 2296
       F: FnOnce(&mut Decoder) -> DecodeResult<T>,
    {
2297 2298
        f(self)
    }
2299 2300 2301 2302

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

2305
/// A trait for converting values to JSON
2306
pub trait ToJson {
2307 2308 2309
    /// Converts the value of `self` to an instance of JSON
    fn to_json(&self) -> Json;
}
2310

2311
macro_rules! to_json_impl_i64 {
2312 2313
    ($($t:ty), +) => (
        $(impl ToJson for $t {
2314
            fn to_json(&self) -> Json { Json::I64(*self as i64) }
2315 2316
        })+
    )
2317
}
2318

2319
to_json_impl_i64! { int, i8, i16, i32, i64 }
2320

2321
macro_rules! to_json_impl_u64 {
A
Adolfo Ochagavía 已提交
2322 2323
    ($($t:ty), +) => (
        $(impl ToJson for $t {
2324
            fn to_json(&self) -> Json { Json::U64(*self as u64) }
A
Adolfo Ochagavía 已提交
2325 2326
        })+
    )
2327
}
2328

2329
to_json_impl_u64! { uint, u8, u16, u32, u64 }
2330

A
Adolfo Ochagavía 已提交
2331 2332
impl ToJson for Json {
    fn to_json(&self) -> Json { self.clone() }
2333 2334
}

2335
impl ToJson for f32 {
M
mrec 已提交
2336
    fn to_json(&self) -> Json { (*self as f64).to_json() }
2337 2338
}

2339
impl ToJson for f64 {
M
mrec 已提交
2340 2341
    fn to_json(&self) -> Json {
        match self.classify() {
T
Tobias Bucher 已提交
2342
            Fp::Nan | Fp::Infinite => Json::Null,
2343
            _                  => Json::F64(*self)
M
mrec 已提交
2344 2345
        }
    }
2346 2347
}

2348
impl ToJson for () {
2349
    fn to_json(&self) -> Json { Json::Null }
2350 2351
}

2352
impl ToJson for bool {
2353
    fn to_json(&self) -> Json { Json::Boolean(*self) }
2354 2355
}

2356
impl ToJson for str {
A
Alex Crichton 已提交
2357
    fn to_json(&self) -> Json { Json::String(self.to_string()) }
2358 2359
}

2360
impl ToJson for string::String {
2361
    fn to_json(&self) -> Json { Json::String((*self).clone()) }
2362 2363
}

2364 2365 2366 2367 2368 2369 2370 2371 2372
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]
2373
            #[allow(non_snake_case)]
2374 2375
            fn to_json(&self) -> Json {
                match *self {
2376
                    ($(ref $tyvar),*,) => Json::Array(vec![$($tyvar.to_json()),*])
2377
                }
A
Adolfo Ochagavía 已提交
2378
            }
2379
        }
2380 2381 2382
    }
}

2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394
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}
2395

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

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

A
Alexis Beingessner 已提交
2404
impl<A: ToJson> ToJson for BTreeMap<string::String, A> {
B
Ben Striegel 已提交
2405
    fn to_json(&self) -> Json {
A
Alexis Beingessner 已提交
2406
        let mut d = BTreeMap::new();
D
Daniel Micay 已提交
2407
        for (key, value) in self.iter() {
2408
            d.insert((*key).clone(), value.to_json());
2409
        }
2410
        Json::Object(d)
2411 2412 2413
    }
}

2414
impl<A: ToJson> ToJson for HashMap<string::String, A> {
G
Graydon Hoare 已提交
2415
    fn to_json(&self) -> Json {
A
Alexis Beingessner 已提交
2416
        let mut d = BTreeMap::new();
D
Daniel Micay 已提交
2417
        for (key, value) in self.iter() {
2418
            d.insert((*key).clone(), value.to_json());
G
Graydon Hoare 已提交
2419
        }
2420
        Json::Object(d)
G
Graydon Hoare 已提交
2421 2422 2423
    }
}

2424
impl<A:ToJson> ToJson for Option<A> {
B
Ben Striegel 已提交
2425 2426
    fn to_json(&self) -> Json {
        match *self {
2427
            None => Json::Null,
A
Adolfo Ochagavía 已提交
2428
            Some(ref value) => value.to_json()
2429 2430 2431 2432
        }
    }
}

2433 2434 2435 2436 2437 2438 2439 2440 2441 2442
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 {
        self.inner.write_str(s)
    }
}

2443
impl fmt::String for Json {
2444
    /// Encodes a json value into a string
2445
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2446 2447 2448 2449 2450 2451
        let mut shim = FormatShim { inner: f };
        let mut encoder = Encoder::new(&mut shim);
        self.encode(&mut encoder)
    }
}

2452
impl<'a> fmt::String for PrettyJson<'a> {
2453 2454 2455 2456 2457 2458 2459 2460
    /// 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);
        self.inner.encode(&mut encoder)
    }
}

2461
impl<'a, T: Encodable> fmt::String for AsJson<'a, T> {
2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477
    /// 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);
        self.inner.encode(&mut encoder)
    }
}

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

2478
impl<'a, T: Encodable> fmt::String for AsPrettyJson<'a, T> {
2479 2480 2481 2482 2483 2484 2485 2486 2487
    /// 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 => {}
        }
        self.inner.encode(&mut encoder)
2488
    }
2489 2490
}

B
Brendan Zabarauskas 已提交
2491
impl FromStr for Json {
A
Adolfo Ochagavía 已提交
2492 2493 2494 2495 2496
    fn from_str(s: &str) -> Option<Json> {
        from_str(s).ok()
    }
}

2497 2498
#[cfg(test)]
mod tests {
2499
    extern crate test;
S
Steven Fackler 已提交
2500 2501
    use self::Animal::*;
    use self::DecodeEnum::*;
2502
    use self::test::Bencher;
A
Alex Crichton 已提交
2503
    use {Encodable, Decodable};
2504 2505 2506 2507 2508
    use super::Json::*;
    use super::ErrorCode::*;
    use super::ParserError::*;
    use super::DecoderError::*;
    use super::JsonEvent::*;
2509 2510
    use super::{Json, from_str, DecodeResult, DecoderError, JsonEvent, Parser,
                StackElement, Stack, Decoder};
N
fallout  
Nick Cameron 已提交
2511
    use std::{i64, u64, f32, f64, io};
A
Alexis Beingessner 已提交
2512
    use std::collections::BTreeMap;
2513
    use std::num::Float;
N
fallout  
Nick Cameron 已提交
2514
    use std::ops::Index;
2515
    use std::string;
2516

2517
    #[derive(RustcDecodable, Eq, PartialEq, Show)]
2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538
    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 已提交
2539
                                ExpectedError("Number".to_string(), "[]".to_string()));
2540
        check_err::<OptionData>("{ \"opt\": false }",
A
Alex Crichton 已提交
2541
                                ExpectedError("Number".to_string(), "false".to_string()));
2542 2543
    }

2544
    #[derive(PartialEq, RustcEncodable, RustcDecodable, Show)]
2545 2546
    enum Animal {
        Dog,
2547
        Frog(string::String, int)
2548 2549
    }

2550
    #[derive(PartialEq, RustcEncodable, RustcDecodable, Show)]
2551 2552 2553
    struct Inner {
        a: (),
        b: uint,
2554
        c: Vec<string::String>,
2555 2556
    }

2557
    #[derive(PartialEq, RustcEncodable, RustcDecodable, Show)]
2558
    struct Outer {
K
Kevin Ballard 已提交
2559
        inner: Vec<Inner>,
2560 2561
    }

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

D
Daniel Micay 已提交
2565
        for item in items.iter() {
2566
            match *item {
2567
                (ref key, ref value) => { d.insert((*key).clone(), (*value).clone()); },
2568
            }
2569 2570
        };

L
Luqman Aden 已提交
2571
        Object(d)
2572 2573
    }

A
Adolfo Ochagavía 已提交
2574 2575 2576
    #[test]
    fn test_from_str_trait() {
        let s = "null";
2577
        assert!(s.parse::<Json>().unwrap() == s.parse().unwrap());
A
Adolfo Ochagavía 已提交
2578 2579
    }

2580 2581
    #[test]
    fn test_write_null() {
B
Barosl Lee 已提交
2582
        assert_eq!(Null.to_string(), "null");
2583
        assert_eq!(Null.pretty().to_string(), "null");
2584 2585
    }

2586 2587
    #[test]
    fn test_write_i64() {
B
Barosl Lee 已提交
2588
        assert_eq!(U64(0).to_string(), "0");
2589
        assert_eq!(U64(0).pretty().to_string(), "0");
2590

B
Barosl Lee 已提交
2591
        assert_eq!(U64(1234).to_string(), "1234");
2592
        assert_eq!(U64(1234).pretty().to_string(), "1234");
2593

B
Barosl Lee 已提交
2594
        assert_eq!(I64(-5678).to_string(), "-5678");
2595
        assert_eq!(I64(-5678).pretty().to_string(), "-5678");
2596 2597

        assert_eq!(U64(7650007200025252000).to_string(), "7650007200025252000");
2598
        assert_eq!(U64(7650007200025252000).pretty().to_string(), "7650007200025252000");
2599
    }
2600

2601
    #[test]
2602
    fn test_write_f64() {
B
Barosl Lee 已提交
2603
        assert_eq!(F64(3.0).to_string(), "3.0");
2604
        assert_eq!(F64(3.0).pretty().to_string(), "3.0");
2605

B
Barosl Lee 已提交
2606
        assert_eq!(F64(3.1).to_string(), "3.1");
2607
        assert_eq!(F64(3.1).pretty().to_string(), "3.1");
2608

B
Barosl Lee 已提交
2609
        assert_eq!(F64(-1.5).to_string(), "-1.5");
2610
        assert_eq!(F64(-1.5).pretty().to_string(), "-1.5");
2611

B
Barosl Lee 已提交
2612
        assert_eq!(F64(0.5).to_string(), "0.5");
2613
        assert_eq!(F64(0.5).pretty().to_string(), "0.5");
M
mrec 已提交
2614

B
Barosl Lee 已提交
2615
        assert_eq!(F64(f64::NAN).to_string(), "null");
2616
        assert_eq!(F64(f64::NAN).pretty().to_string(), "null");
M
mrec 已提交
2617

B
Barosl Lee 已提交
2618
        assert_eq!(F64(f64::INFINITY).to_string(), "null");
2619
        assert_eq!(F64(f64::INFINITY).pretty().to_string(), "null");
M
mrec 已提交
2620

B
Barosl Lee 已提交
2621
        assert_eq!(F64(f64::NEG_INFINITY).to_string(), "null");
2622
        assert_eq!(F64(f64::NEG_INFINITY).pretty().to_string(), "null");
2623 2624 2625 2626
    }

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

A
Alex Crichton 已提交
2630
        assert_eq!(String("homura".to_string()).to_string(), "\"homura\"");
2631
        assert_eq!(String("madoka".to_string()).pretty().to_string(), "\"madoka\"");
2632 2633 2634 2635
    }

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

B
Barosl Lee 已提交
2639
        assert_eq!(Boolean(false).to_string(), "false");
2640
        assert_eq!(Boolean(false).pretty().to_string(), "false");
2641 2642 2643
    }

    #[test]
C
Corey Farwell 已提交
2644
    fn test_write_array() {
B
Barosl Lee 已提交
2645
        assert_eq!(Array(vec![]).to_string(), "[]");
2646
        assert_eq!(Array(vec![]).pretty().to_string(), "[]");
2647

B
Barosl Lee 已提交
2648
        assert_eq!(Array(vec![Boolean(true)]).to_string(), "[true]");
2649
        assert_eq!(
2650
            Array(vec![Boolean(true)]).pretty().to_string(),
2651
            "\
2652 2653
            [\n  \
                true\n\
2654
            ]"
2655
        );
2656

C
Corey Farwell 已提交
2657
        let long_test_array = Array(vec![
2658 2659
            Boolean(false),
            Null,
A
Alex Crichton 已提交
2660
            Array(vec![String("foo\nbar".to_string()), F64(3.5)])]);
2661

B
Barosl Lee 已提交
2662
        assert_eq!(long_test_array.to_string(),
2663
            "[false,null,[\"foo\\nbar\",3.5]]");
2664
        assert_eq!(
2665
            long_test_array.pretty().to_string(),
2666
            "\
2667 2668 2669 2670 2671 2672 2673
            [\n  \
                false,\n  \
                null,\n  \
                [\n    \
                    \"foo\\nbar\",\n    \
                    3.5\n  \
                ]\n\
2674
            ]"
2675 2676 2677
        );
    }

2678
    #[test]
2679
    fn test_write_object() {
B
Barosl Lee 已提交
2680
        assert_eq!(mk_object(&[]).to_string(), "{}");
2681
        assert_eq!(mk_object(&[]).pretty().to_string(), "{}");
2682

2683
        assert_eq!(
N
Nick Cameron 已提交
2684
            mk_object(&[
A
Alex Crichton 已提交
2685
                ("a".to_string(), Boolean(true))
B
Barosl Lee 已提交
2686
            ]).to_string(),
2687
            "{\"a\":true}"
2688
        );
2689
        assert_eq!(
2690
            mk_object(&[("a".to_string(), Boolean(true))]).pretty().to_string(),
2691
            "\
2692 2693
            {\n  \
                \"a\": true\n\
2694
            }"
2695 2696
        );

N
Nick Cameron 已提交
2697
        let complex_obj = mk_object(&[
A
Alex Crichton 已提交
2698 2699 2700
                ("b".to_string(), Array(vec![
                    mk_object(&[("c".to_string(), String("\x0c\r".to_string()))]),
                    mk_object(&[("d".to_string(), String("".to_string()))])
2701
                ]))
2702 2703 2704
            ]);

        assert_eq!(
B
Barosl Lee 已提交
2705
            complex_obj.to_string(),
2706
            "{\
2707 2708 2709 2710
                \"b\":[\
                    {\"c\":\"\\f\\r\"},\
                    {\"d\":\"\"}\
                ]\
2711
            }"
2712 2713
        );
        assert_eq!(
2714
            complex_obj.pretty().to_string(),
2715
            "\
2716 2717 2718 2719 2720 2721 2722 2723 2724
            {\n  \
                \"b\": [\n    \
                    {\n      \
                        \"c\": \"\\f\\r\"\n    \
                    },\n    \
                    {\n      \
                        \"d\": \"\"\n    \
                    }\n  \
                ]\n\
2725
            }"
2726
        );
2727

N
Nick Cameron 已提交
2728
        let a = mk_object(&[
A
Alex Crichton 已提交
2729 2730 2731 2732
            ("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()))])
2733
            ]))
G
Graydon Hoare 已提交
2734
        ]);
2735

2736 2737
        // We can't compare the strings directly because the object fields be
        // printed in a different order.
2738 2739
        assert_eq!(a.clone(), a.to_string().parse().unwrap());
        assert_eq!(a.clone(), a.pretty().to_string().parse().unwrap());
A
Alex Crichton 已提交
2740 2741
    }

2742
    #[test]
2743
    fn test_write_enum() {
2744
        let animal = Dog;
2745
        assert_eq!(
2746
            format!("{}", super::as_json(&animal)),
2747
            "\"Dog\""
2748 2749
        );
        assert_eq!(
2750
            format!("{}", super::as_pretty_json(&animal)),
2751
            "\"Dog\""
2752
        );
2753

A
Alex Crichton 已提交
2754
        let animal = Frog("Henry".to_string(), 349);
2755
        assert_eq!(
2756
            format!("{}", super::as_json(&animal)),
2757
            "{\"variant\":\"Frog\",\"fields\":[\"Henry\",349]}"
2758 2759
        );
        assert_eq!(
2760
            format!("{}", super::as_pretty_json(&animal)),
2761 2762 2763 2764 2765 2766
            "{\n  \
               \"variant\": \"Frog\",\n  \
               \"fields\": [\n    \
                 \"Henry\",\n    \
                 349\n  \
               ]\n\
2767
             }"
2768
        );
2769 2770
    }

2771
    macro_rules! check_encoder_for_simple {
2772
        ($value:expr, $expected:expr) => ({
2773
            let s = format!("{}", super::as_json(&$value));
2774 2775
            assert_eq!(s, $expected);

2776
            let s = format!("{}", super::as_pretty_json(&$value));
2777 2778
            assert_eq!(s, $expected);
        })
2779
    }
2780

2781
    #[test]
2782
    fn test_write_some() {
2783
        check_encoder_for_simple!(Some("jodhpurs".to_string()), "\"jodhpurs\"");
2784 2785
    }

2786
    #[test]
2787
    fn test_write_none() {
2788 2789 2790 2791 2792 2793 2794
        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\"");
2795 2796 2797
        check_encoder_for_simple!('\u{0000}', "\"\\u0000\"");
        check_encoder_for_simple!('\u{001b}', "\"\\u001b\"");
        check_encoder_for_simple!('\u{007f}', "\"\\u007f\"");
2798 2799 2800
        check_encoder_for_simple!('\u{00a0}', "\"\u{00a0}\"");
        check_encoder_for_simple!('\u{abcd}', "\"\u{abcd}\"");
        check_encoder_for_simple!('\u{10ffff}', "\"\u{10ffff}\"");
2801 2802
    }

2803
    #[test]
2804
    fn test_trailing_characters() {
2805 2806 2807 2808 2809 2810
        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)));
2811 2812 2813 2814
    }

    #[test]
    fn test_read_identifiers() {
2815 2816 2817 2818 2819 2820
        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)));
2821

E
Erick Tryzelaar 已提交
2822 2823 2824 2825 2826 2827
        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)));
2828 2829
    }

2830 2831
    #[test]
    fn test_decode_identifiers() {
2832
        let v: () = super::decode("null").unwrap();
2833 2834
        assert_eq!(v, ());

2835
        let v: bool = super::decode("true").unwrap();
2836 2837
        assert_eq!(v, true);

2838
        let v: bool = super::decode("false").unwrap();
2839 2840 2841
        assert_eq!(v, false);
    }

2842
    #[test]
2843
    fn test_read_number() {
2844 2845
        assert_eq!(from_str("+"),   Err(SyntaxError(InvalidSyntax, 1, 1)));
        assert_eq!(from_str("."),   Err(SyntaxError(InvalidSyntax, 1, 1)));
M
mrec 已提交
2846
        assert_eq!(from_str("NaN"), Err(SyntaxError(InvalidSyntax, 1, 1)));
2847 2848 2849 2850 2851
        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)));
2852

2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867
        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)));
2868 2869
    }

2870 2871
    #[test]
    fn test_decode_numbers() {
2872
        let v: f64 = super::decode("3").unwrap();
D
Daniel Micay 已提交
2873
        assert_eq!(v, 3.0);
2874

2875
        let v: f64 = super::decode("3.1").unwrap();
D
Daniel Micay 已提交
2876
        assert_eq!(v, 3.1);
2877

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

2881
        let v: f64 = super::decode("0.4").unwrap();
D
Daniel Micay 已提交
2882
        assert_eq!(v, 0.4);
2883

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

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

2890
        let v: f64 = super::decode("0.4e-01").unwrap();
D
Daniel Micay 已提交
2891
        assert_eq!(v, 0.4e-01);
2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903

        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);
2904 2905

        let res: DecodeResult<i64> = super::decode("765.25252");
A
Alex Crichton 已提交
2906 2907
        assert_eq!(res, Err(ExpectedError("Integer".to_string(),
                                          "765.25252".to_string())));
2908 2909
    }

G
Gary Linscott 已提交
2910
    #[test]
2911
    fn test_read_str() {
2912 2913 2914
        assert_eq!(from_str("\""),    Err(SyntaxError(EOFWhileParsingString, 1, 2)));
        assert_eq!(from_str("\"lol"), Err(SyntaxError(EOFWhileParsingString, 1, 5)));

A
Alex Crichton 已提交
2915 2916 2917 2918 2919 2920 2921 2922 2923 2924
        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())));
2925 2926
    }

2927
    #[test]
2928
    fn test_decode_str() {
2929 2930 2931 2932 2933 2934 2935
        let s = [("\"\"", ""),
                 ("\"foo\"", "foo"),
                 ("\"\\\"\"", "\""),
                 ("\"\\b\"", "\x08"),
                 ("\"\\n\"", "\n"),
                 ("\"\\r\"", "\r"),
                 ("\"\\t\"", "\t"),
A
Alex Crichton 已提交
2936 2937
                 ("\"\\u12ab\"", "\u{12ab}"),
                 ("\"\\uAB12\"", "\u{AB12}")];
2938 2939

        for &(i, o) in s.iter() {
2940
            let v: string::String = super::decode(i).unwrap();
2941
            assert_eq!(v, o);
2942
        }
2943 2944
    }

2945
    #[test]
C
Corey Farwell 已提交
2946
    fn test_read_array() {
2947
        assert_eq!(from_str("["),     Err(SyntaxError(EOFWhileParsingValue, 1, 2)));
C
Corey Farwell 已提交
2948
        assert_eq!(from_str("[1"),    Err(SyntaxError(EOFWhileParsingArray, 1, 3)));
2949 2950 2951
        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)));
2952

C
Corey Farwell 已提交
2953 2954 2955 2956 2957
        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 已提交
2958
        assert_eq!(from_str("[3, 1]"),
C
Corey Farwell 已提交
2959
                     Ok(Array(vec![U64(3), U64(1)])));
E
Erick Tryzelaar 已提交
2960
        assert_eq!(from_str("\n[3, 2]\n"),
C
Corey Farwell 已提交
2961
                     Ok(Array(vec![U64(3), U64(2)])));
E
Erick Tryzelaar 已提交
2962
        assert_eq!(from_str("[2, [4, 1]]"),
C
Corey Farwell 已提交
2963
               Ok(Array(vec![U64(2), Array(vec![U64(4), U64(1)])])));
2964 2965
    }

2966
    #[test]
C
Corey Farwell 已提交
2967
    fn test_decode_array() {
2968
        let v: Vec<()> = super::decode("[]").unwrap();
K
Kevin Ballard 已提交
2969
        assert_eq!(v, vec![]);
2970

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

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

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

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

2984 2985 2986
    #[test]
    fn test_decode_tuple() {
        let t: (uint, uint, uint) = super::decode("[1, 2, 3]").unwrap();
2987
        assert_eq!(t, (1u, 2, 3));
2988 2989

        let t: (uint, string::String) = super::decode("[1, \"two\"]").unwrap();
A
Alex Crichton 已提交
2990
        assert_eq!(t, (1u, "two".to_string()));
2991 2992 2993 2994 2995 2996 2997 2998 2999
    }

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

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

3003
    #[test]
3004
    fn test_read_object() {
3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016
        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)));
3017

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

E
Erick Tryzelaar 已提交
3022 3023
        assert_eq!(from_str(
                      "{ \"a\": null, \"b\" : true }").unwrap(),
N
Nick Cameron 已提交
3024
                  mk_object(&[
A
Alex Crichton 已提交
3025 3026
                      ("a".to_string(), Null),
                      ("b".to_string(), Boolean(true))]));
E
Erick Tryzelaar 已提交
3027
        assert_eq!(from_str("\n{ \"a\": null, \"b\" : true }\n").unwrap(),
N
Nick Cameron 已提交
3028
                  mk_object(&[
A
Alex Crichton 已提交
3029 3030
                      ("a".to_string(), Null),
                      ("b".to_string(), Boolean(true))]));
E
Erick Tryzelaar 已提交
3031 3032
        assert_eq!(from_str(
                      "{\"a\" : 1.0 ,\"b\": [ true ]}").unwrap(),
N
Nick Cameron 已提交
3033
                  mk_object(&[
A
Alex Crichton 已提交
3034 3035
                      ("a".to_string(), F64(1.0)),
                      ("b".to_string(), Array(vec![Boolean(true)]))
3036
                  ]));
E
Erick Tryzelaar 已提交
3037
        assert_eq!(from_str(
3038 3039 3040 3041 3042 3043 3044 3045
                      "{\
                          \"a\": 1.0, \
                          \"b\": [\
                              true,\
                              \"foo\\nbar\", \
                              { \"c\": {\"d\": null} } \
                          ]\
                      }").unwrap(),
N
Nick Cameron 已提交
3046
                  mk_object(&[
A
Alex Crichton 已提交
3047 3048
                      ("a".to_string(), F64(1.0)),
                      ("b".to_string(), Array(vec![
B
Ben Striegel 已提交
3049
                          Boolean(true),
A
Alex Crichton 已提交
3050
                          String("foo\nbar".to_string()),
N
Nick Cameron 已提交
3051
                          mk_object(&[
A
Alex Crichton 已提交
3052
                              ("c".to_string(), mk_object(&[("d".to_string(), Null)]))
3053 3054
                          ])
                      ]))
3055
                  ]));
3056 3057
    }

3058
    #[test]
3059
    fn test_decode_struct() {
3060
        let s = "{
3061 3062 3063
            \"inner\": [
                { \"a\": null, \"b\": 2, \"c\": [\"abc\", \"xyz\"] }
            ]
3064
        }";
3065 3066

        let v: Outer = super::decode(s).unwrap();
3067 3068 3069
        assert_eq!(
            v,
            Outer {
K
Kevin Ballard 已提交
3070
                inner: vec![
A
Alex Crichton 已提交
3071
                    Inner { a: (), b: 2, c: vec!["abc".to_string(), "xyz".to_string()] }
3072 3073 3074 3075 3076
                ]
            }
        );
    }

3077
    #[derive(RustcDecodable)]
M
mrec 已提交
3078 3079 3080 3081 3082 3083
    struct FloatStruct {
        f: f64,
        a: Vec<f64>
    }
    #[test]
    fn test_decode_struct_with_nan() {
3084 3085 3086
        let s = "{\"f\":null,\"a\":[null,123]}";
        let obj: FloatStruct = super::decode(s).unwrap();
        assert!(obj.f.is_nan());
N
NODA, Kai 已提交
3087 3088
        assert!(obj.a[0].is_nan());
        assert_eq!(obj.a[1], 123f64);
M
mrec 已提交
3089 3090
    }

3091 3092
    #[test]
    fn test_decode_option() {
3093
        let value: Option<string::String> = super::decode("null").unwrap();
3094 3095
        assert_eq!(value, None);

3096
        let value: Option<string::String> = super::decode("\"jodhpurs\"").unwrap();
A
Alex Crichton 已提交
3097
        assert_eq!(value, Some("jodhpurs".to_string()));
3098 3099
    }

3100
    #[test]
3101
    fn test_decode_enum() {
3102
        let value: Animal = super::decode("\"Dog\"").unwrap();
3103 3104
        assert_eq!(value, Dog);

3105
        let s = "{\"variant\":\"Frog\",\"fields\":[\"Henry\",349]}";
3106
        let value: Animal = super::decode(s).unwrap();
A
Alex Crichton 已提交
3107
        assert_eq!(value, Frog("Henry".to_string(), 349));
3108 3109
    }

3110
    #[test]
3111
    fn test_decode_map() {
3112
        let s = "{\"a\": \"Dog\", \"b\": {\"variant\":\"Frog\",\
3113
                  \"fields\":[\"Henry\", 349]}}";
A
Alexis Beingessner 已提交
3114
        let mut map: BTreeMap<string::String, Animal> = super::decode(s).unwrap();
3115

A
Alex Crichton 已提交
3116 3117
        assert_eq!(map.remove(&"a".to_string()), Some(Dog));
        assert_eq!(map.remove(&"b".to_string()), Some(Frog("Henry".to_string(), 349)));
3118 3119
    }

3120
    #[test]
3121
    fn test_multiline_errors() {
E
Erick Tryzelaar 已提交
3122
        assert_eq!(from_str("{\n  \"foo\":\n \"bar\""),
3123
            Err(SyntaxError(EOFWhileParsingObject, 3u, 8u)));
3124
    }
3125

3126
    #[derive(RustcDecodable)]
M
mrec 已提交
3127
    #[allow(dead_code)]
3128 3129 3130
    struct DecodeStruct {
        x: f64,
        y: bool,
3131
        z: string::String,
K
Kevin Ballard 已提交
3132
        w: Vec<DecodeStruct>
3133
    }
3134
    #[derive(RustcDecodable)]
3135 3136
    enum DecodeEnum {
        A(f64),
3137
        B(string::String)
3138
    }
3139
    fn check_err<T: Decodable>(to_parse: &'static str, expected: DecoderError) {
S
Sean McArthur 已提交
3140
        let res: DecodeResult<T> = match from_str(to_parse) {
3141
            Err(e) => Err(ParseError(e)),
S
Sean McArthur 已提交
3142 3143
            Ok(json) => Decodable::decode(&mut Decoder::new(json))
        };
3144
        match res {
3145
            Ok(_) => panic!("`{:?}` parsed & decoded ok, expecting error `{:?}`",
S
Sean McArthur 已提交
3146
                              to_parse, expected),
3147
            Err(ParseError(e)) => panic!("`{:?}` is not valid json: {:?}",
S
Sean McArthur 已提交
3148
                                           to_parse, e),
3149
            Err(e) => {
S
Sean McArthur 已提交
3150
                assert_eq!(e, expected);
3151 3152 3153 3154 3155
            }
        }
    }
    #[test]
    fn test_decode_errors_struct() {
A
Alex Crichton 已提交
3156
        check_err::<DecodeStruct>("[]", ExpectedError("Object".to_string(), "[]".to_string()));
3157
        check_err::<DecodeStruct>("{\"x\": true, \"y\": true, \"z\": \"\", \"w\": []}",
A
Alex Crichton 已提交
3158
                                  ExpectedError("Number".to_string(), "true".to_string()));
3159
        check_err::<DecodeStruct>("{\"x\": 1, \"y\": [], \"z\": \"\", \"w\": []}",
A
Alex Crichton 已提交
3160
                                  ExpectedError("Boolean".to_string(), "[]".to_string()));
3161
        check_err::<DecodeStruct>("{\"x\": 1, \"y\": true, \"z\": {}, \"w\": []}",
A
Alex Crichton 已提交
3162
                                  ExpectedError("String".to_string(), "{}".to_string()));
3163
        check_err::<DecodeStruct>("{\"x\": 1, \"y\": true, \"z\": \"\", \"w\": null}",
A
Alex Crichton 已提交
3164
                                  ExpectedError("Array".to_string(), "null".to_string()));
3165
        check_err::<DecodeStruct>("{\"x\": 1, \"y\": true, \"z\": \"\"}",
A
Alex Crichton 已提交
3166
                                  MissingFieldError("w".to_string()));
3167 3168 3169 3170
    }
    #[test]
    fn test_decode_errors_enum() {
        check_err::<DecodeEnum>("{}",
A
Alex Crichton 已提交
3171
                                MissingFieldError("variant".to_string()));
3172
        check_err::<DecodeEnum>("{\"variant\": 1}",
A
Alex Crichton 已提交
3173
                                ExpectedError("String".to_string(), "1".to_string()));
3174
        check_err::<DecodeEnum>("{\"variant\": \"A\"}",
A
Alex Crichton 已提交
3175
                                MissingFieldError("fields".to_string()));
3176
        check_err::<DecodeEnum>("{\"variant\": \"A\", \"fields\": null}",
A
Alex Crichton 已提交
3177
                                ExpectedError("Array".to_string(), "null".to_string()));
3178
        check_err::<DecodeEnum>("{\"variant\": \"C\", \"fields\": []}",
A
Alex Crichton 已提交
3179
                                UnknownVariantError("C".to_string()));
3180
    }
3181 3182 3183 3184

    #[test]
    fn test_find(){
        let json_value = from_str("{\"dog\" : \"cat\"}").unwrap();
3185 3186
        let found_str = json_value.find("dog");
        assert!(found_str.unwrap().as_string().unwrap() == "cat");
3187 3188 3189 3190 3191
    }

    #[test]
    fn test_find_path(){
        let json_value = from_str("{\"dog\":{\"cat\": {\"mouse\" : \"cheese\"}}}").unwrap();
3192 3193
        let found_str = json_value.find_path(&["dog", "cat", "mouse"]);
        assert!(found_str.unwrap().as_string().unwrap() == "cheese");
3194 3195 3196 3197 3198
    }

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

3203 3204 3205
    #[test]
    fn test_index(){
        let json_value = from_str("{\"animals\":[\"dog\",\"cat\",\"mouse\"]}").unwrap();
C
Corey Farwell 已提交
3206 3207 3208 3209
        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");
3210 3211
    }

3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225
    #[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 已提交
3226
    fn test_is_array(){
3227
        let json_value = from_str("[1, 2, 3]").unwrap();
C
Corey Farwell 已提交
3228
        assert!(json_value.is_array());
3229 3230 3231
    }

    #[test]
C
Corey Farwell 已提交
3232
    fn test_as_array(){
3233
        let json_value = from_str("[1, 2, 3]").unwrap();
C
Corey Farwell 已提交
3234
        let json_array = json_value.as_array();
3235
        let expected_length = 3;
C
Corey Farwell 已提交
3236
        assert!(json_array.is_some() && json_array.unwrap().len() == expected_length);
3237 3238 3239
    }

    #[test]
3240
    fn test_is_string(){
3241
        let json_value = from_str("\"dog\"").unwrap();
3242
        assert!(json_value.is_string());
3243 3244 3245
    }

    #[test]
3246
    fn test_as_string(){
3247
        let json_value = from_str("\"dog\"").unwrap();
3248
        let json_str = json_value.as_string();
3249
        let expected_str = "dog";
3250 3251 3252 3253 3254 3255 3256 3257 3258 3259
        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]
3260
    fn test_is_i64(){
3261
        let json_value = from_str("-12").unwrap();
3262 3263
        assert!(json_value.is_i64());

3264 3265 3266
        let json_value = from_str("12").unwrap();
        assert!(!json_value.is_i64());

3267 3268 3269 3270
        let json_value = from_str("12.0").unwrap();
        assert!(!json_value.is_i64());
    }

3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282
    #[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());
    }

3283 3284
    #[test]
    fn test_is_f64(){
3285
        let json_value = from_str("12").unwrap();
3286 3287
        assert!(!json_value.is_f64());

3288 3289 3290
        let json_value = from_str("-12").unwrap();
        assert!(!json_value.is_f64());

3291 3292
        let json_value = from_str("12.0").unwrap();
        assert!(json_value.is_f64());
3293 3294 3295

        let json_value = from_str("-12.0").unwrap();
        assert!(json_value.is_f64());
3296 3297 3298 3299
    }

    #[test]
    fn test_as_i64(){
3300
        let json_value = from_str("-12").unwrap();
3301
        let json_num = json_value.as_i64();
3302 3303 3304 3305 3306 3307 3308
        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();
3309 3310 3311 3312 3313 3314 3315 3316
        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));
3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345
    }

    #[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);
    }
3346 3347 3348 3349 3350

    #[test]
    fn test_encode_hashmap_with_numeric_key() {
        use std::str::from_utf8;
        use std::io::Writer;
3351
        use std::collections::HashMap;
3352 3353
        let mut hm: HashMap<uint, bool> = HashMap::new();
        hm.insert(1, true);
D
Daniel Micay 已提交
3354
        let mut mem_buf = Vec::new();
3355
        write!(&mut mem_buf, "{}", super::as_pretty_json(&hm)).unwrap();
3356
        let json_str = from_utf8(mem_buf.index(&FullRange)).unwrap();
3357
        match from_str(json_str) {
3358
            Err(_) => panic!("Unable to parse json_str: {:?}", json_str),
3359 3360 3361
            _ => {} // it parsed and we are good to go
        }
    }
3362

3363 3364 3365 3366
    #[test]
    fn test_prettyencode_hashmap_with_numeric_key() {
        use std::str::from_utf8;
        use std::io::Writer;
3367
        use std::collections::HashMap;
3368 3369
        let mut hm: HashMap<uint, bool> = HashMap::new();
        hm.insert(1, true);
D
Daniel Micay 已提交
3370
        let mut mem_buf = Vec::new();
3371
        write!(&mut mem_buf, "{}", super::as_pretty_json(&hm)).unwrap();
3372
        let json_str = from_utf8(mem_buf.index(&FullRange)).unwrap();
3373
        match from_str(json_str) {
3374
            Err(_) => panic!("Unable to parse json_str: {:?}", json_str),
3375 3376 3377
            _ => {} // it parsed and we are good to go
        }
    }
3378

3379 3380 3381
    #[test]
    fn test_prettyencoder_indent_level_param() {
        use std::str::from_utf8;
A
Alexis Beingessner 已提交
3382
        use std::collections::BTreeMap;
3383

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

A
Alex Crichton 已提交
3386 3387
        tree.insert("hello".to_string(), String("guten tag".to_string()));
        tree.insert("goodbye".to_string(), String("sayonara".to_string()));
3388

C
Corey Farwell 已提交
3389
        let json = Array(
3390 3391 3392 3393
            // The following layout below should look a lot like
            // the pretty-printed JSON (indent * x)
            vec!
            ( // 0x
A
Alex Crichton 已提交
3394
                String("greetings".to_string()), // 1x
3395 3396
                Object(tree), // 1x + 2x + 2x + 1x
            ) // 0x
C
Corey Farwell 已提交
3397
            // End JSON array (7 lines)
3398 3399 3400 3401
        );

        // Helper function for counting indents
        fn indents(source: &str) -> uint {
3402
            let trimmed = source.trim_left_matches(' ');
3403 3404 3405 3406 3407
            source.len() - trimmed.len()
        }

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

3412
            let printed = from_utf8(writer.index(&FullRange)).unwrap();
3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430

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

3431 3432
    #[test]
    fn test_hashmap_with_numeric_key_can_handle_double_quote_delimited_key() {
3433
        use std::collections::HashMap;
3434 3435 3436
        use Decodable;
        let json_str = "{\"1\":true}";
        let json_obj = match from_str(json_str) {
3437
            Err(_) => panic!("Unable to parse json_str: {:?}", json_str),
3438 3439 3440
            Ok(o) => o
        };
        let mut decoder = Decoder::new(json_obj);
S
Sean McArthur 已提交
3441
        let _hm: HashMap<uint, bool> = Decodable::decode(&mut decoder).unwrap();
3442
    }
3443

3444 3445 3446 3447 3448 3449
    #[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) {
3450
            Err(_) => panic!("Unable to parse json_str: {:?}", json_str),
3451 3452 3453 3454
            Ok(o) => o
        };
        let mut decoder = Decoder::new(json_obj);
        let result: Result<HashMap<uint, bool>, DecoderError> = Decodable::decode(&mut decoder);
A
Alex Crichton 已提交
3455
        assert_eq!(result, Err(ExpectedError("Number".to_string(), "a".to_string())));
3456 3457
    }

3458 3459
    fn assert_stream_equal(src: &str,
                           expected: Vec<(JsonEvent, Vec<StackElement>)>) {
3460 3461 3462 3463 3464 3465 3466
        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 已提交
3467
            let (ref expected_evt, ref expected_stack) = expected[i];
3468
            if !parser.stack().is_equal_to(expected_stack.as_slice()) {
3469
                panic!("Parser stack is not equal to {:?}", expected_stack);
3470 3471 3472 3473 3474 3475
            }
            assert_eq!(&evt, expected_evt);
            i+=1;
        }
    }
    #[test]
S
Steven Fackler 已提交
3476
    #[cfg_attr(target_word_size = "32", ignore)] // FIXME(#14064)
3477 3478
    fn test_streaming_parser() {
        assert_stream_equal(
3479
            r#"{ "foo":"bar", "array" : [0, 1, 2, 3, 4, 5], "idents":[null,true,false]}"#,
3480 3481
            vec![
                (ObjectStart,             vec![]),
3482 3483 3484 3485 3486 3487 3488 3489 3490 3491
                  (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 已提交
3492 3493 3494 3495 3496 3497
                    (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)]),
3498
                  (ArrayEnd,              vec![StackElement::Key("idents")]),
3499
                (ObjectEnd,               vec![]),
3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512
            ]
        );
    }
    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,
            }
        }
    }
3513

3514
    #[test]
S
Steven Fackler 已提交
3515
    #[cfg_attr(target_word_size = "32", ignore)] // FIXME(#14064)
3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527
    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)));
3528
        assert_eq!(last_event("{\"a\":1,}"), Error(SyntaxError(TrailingComma, 1, 8)));
3529 3530 3531

        assert_stream_equal(
            "{}",
3532
            vec![(ObjectStart, vec![]), (ObjectEnd, vec![])]
3533 3534 3535
        );
        assert_stream_equal(
            "{\"a\": 3}",
3536 3537
            vec![
                (ObjectStart,        vec![]),
3538
                  (U64Value(3),      vec![StackElement::Key("a")]),
3539
                (ObjectEnd,          vec![]),
3540 3541 3542 3543
            ]
        );
        assert_stream_equal(
            "{ \"a\": null, \"b\" : true }",
3544 3545
            vec![
                (ObjectStart,           vec![]),
3546 3547
                  (NullValue,           vec![StackElement::Key("a")]),
                  (BooleanValue(true),  vec![StackElement::Key("b")]),
3548
                (ObjectEnd,             vec![]),
3549 3550 3551 3552
            ]
        );
        assert_stream_equal(
            "{\"a\" : 1.0 ,\"b\": [ true ]}",
3553 3554
            vec![
                (ObjectStart,           vec![]),
3555 3556 3557 3558
                  (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")]),
3559
                (ObjectEnd,             vec![]),
3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570
            ]
        );
        assert_stream_equal(
            r#"{
                "a": 1.0,
                "b": [
                    true,
                    "foo\nbar",
                    { "c": {"d": null} }
                ]
            }"#,
3571 3572
            vec![
                (ObjectStart,                   vec![]),
3573 3574
                  (F64Value(1.0),               vec![StackElement::Key("a")]),
                  (ArrayStart,                  vec![StackElement::Key("b")]),
N
fallout  
Nick Cameron 已提交
3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592
                    (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)]),
3593
                  (ArrayEnd,                    vec![StackElement::Key("b")]),
3594
                (ObjectEnd,                     vec![]),
3595 3596 3597 3598
            ]
        );
    }
    #[test]
S
Steven Fackler 已提交
3599
    #[cfg_attr(target_word_size = "32", ignore)] // FIXME(#14064)
C
Corey Farwell 已提交
3600
    fn test_read_array_streaming() {
3601 3602
        assert_stream_equal(
            "[]",
3603
            vec![
C
Corey Farwell 已提交
3604 3605
                (ArrayStart, vec![]),
                (ArrayEnd,   vec![]),
3606 3607 3608 3609
            ]
        );
        assert_stream_equal(
            "[ ]",
3610
            vec![
C
Corey Farwell 已提交
3611 3612
                (ArrayStart, vec![]),
                (ArrayEnd,   vec![]),
3613 3614 3615 3616
            ]
        );
        assert_stream_equal(
            "[true]",
3617
            vec![
C
Corey Farwell 已提交
3618
                (ArrayStart,             vec![]),
3619
                    (BooleanValue(true), vec![StackElement::Index(0)]),
C
Corey Farwell 已提交
3620
                (ArrayEnd,               vec![]),
3621 3622 3623 3624
            ]
        );
        assert_stream_equal(
            "[ false ]",
3625
            vec![
C
Corey Farwell 已提交
3626
                (ArrayStart,              vec![]),
3627
                    (BooleanValue(false), vec![StackElement::Index(0)]),
C
Corey Farwell 已提交
3628
                (ArrayEnd,                vec![]),
3629 3630 3631 3632
            ]
        );
        assert_stream_equal(
            "[null]",
3633
            vec![
C
Corey Farwell 已提交
3634
                (ArrayStart,    vec![]),
3635
                    (NullValue, vec![StackElement::Index(0)]),
C
Corey Farwell 已提交
3636
                (ArrayEnd,      vec![]),
3637 3638 3639 3640
            ]
        );
        assert_stream_equal(
            "[3, 1]",
3641
            vec![
C
Corey Farwell 已提交
3642
                (ArrayStart,      vec![]),
3643 3644
                    (U64Value(3), vec![StackElement::Index(0)]),
                    (U64Value(1), vec![StackElement::Index(1)]),
C
Corey Farwell 已提交
3645
                (ArrayEnd,        vec![]),
3646 3647 3648 3649
            ]
        );
        assert_stream_equal(
            "\n[3, 2]\n",
3650
            vec![
C
Corey Farwell 已提交
3651
                (ArrayStart,      vec![]),
3652 3653
                    (U64Value(3), vec![StackElement::Index(0)]),
                    (U64Value(2), vec![StackElement::Index(1)]),
C
Corey Farwell 已提交
3654
                (ArrayEnd,        vec![]),
3655 3656 3657 3658
            ]
        );
        assert_stream_equal(
            "[2, [4, 1]]",
3659
            vec![
C
Corey Farwell 已提交
3660
                (ArrayStart,           vec![]),
3661 3662 3663 3664 3665
                    (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 已提交
3666
                (ArrayEnd,             vec![]),
3667 3668 3669 3670 3671 3672
            ]
        );

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

        assert_eq!(from_str("["),     Err(SyntaxError(EOFWhileParsingValue, 1, 2)));
C
Corey Farwell 已提交
3673
        assert_eq!(from_str("[1"),    Err(SyntaxError(EOFWhileParsingArray, 1, 3)));
3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713
        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);
3714 3715 3716
        assert!(stack.is_equal_to(&[StackElement::Index(1)]));
        assert!(stack.starts_with(&[StackElement::Index(1)]));
        assert!(stack.ends_with(&[StackElement::Index(1)]));
3717
        assert!(stack.last_is_index());
3718
        assert!(stack.get(0) == StackElement::Index(1));
3719

A
Alex Crichton 已提交
3720
        stack.push_key("foo".to_string());
3721 3722

        assert!(stack.len() == 2);
3723 3724 3725 3726 3727
        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")]));
3728
        assert!(!stack.last_is_index());
3729 3730
        assert!(stack.get(0) == StackElement::Index(1));
        assert!(stack.get(1) == StackElement::Key("foo"));
3731

A
Alex Crichton 已提交
3732
        stack.push_key("bar".to_string());
3733 3734

        assert!(stack.len() == 3);
N
fallout  
Nick Cameron 已提交
3735 3736 3737
        assert!(stack.is_equal_to(&[StackElement::Index(1),
                                    StackElement::Key("foo"),
                                    StackElement::Key("bar")]));
3738 3739
        assert!(stack.starts_with(&[StackElement::Index(1)]));
        assert!(stack.starts_with(&[StackElement::Index(1), StackElement::Key("foo")]));
N
fallout  
Nick Cameron 已提交
3740 3741 3742
        assert!(stack.starts_with(&[StackElement::Index(1),
                                    StackElement::Key("foo"),
                                    StackElement::Key("bar")]));
3743 3744
        assert!(stack.ends_with(&[StackElement::Key("bar")]));
        assert!(stack.ends_with(&[StackElement::Key("foo"), StackElement::Key("bar")]));
N
fallout  
Nick Cameron 已提交
3745 3746 3747
        assert!(stack.ends_with(&[StackElement::Index(1),
                                  StackElement::Key("foo"),
                                  StackElement::Key("bar")]));
3748
        assert!(!stack.last_is_index());
3749 3750 3751
        assert!(stack.get(0) == StackElement::Index(1));
        assert!(stack.get(1) == StackElement::Key("foo"));
        assert!(stack.get(2) == StackElement::Key("bar"));
3752 3753 3754 3755

        stack.pop();

        assert!(stack.len() == 2);
3756 3757 3758 3759 3760
        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")]));
3761
        assert!(!stack.last_is_index());
3762 3763
        assert!(stack.get(0) == StackElement::Index(1));
        assert!(stack.get(1) == StackElement::Key("foo"));
3764 3765
    }

3766 3767
    #[test]
    fn test_to_json() {
A
Alexis Beingessner 已提交
3768
        use std::collections::{HashMap,BTreeMap};
3769 3770
        use super::ToJson;

C
Corey Farwell 已提交
3771 3772
        let array2 = Array(vec!(U64(1), U64(2)));
        let array3 = Array(vec!(U64(1), U64(2), U64(3)));
3773
        let object = {
A
Alexis Beingessner 已提交
3774
            let mut tree_map = BTreeMap::new();
3775 3776
            tree_map.insert("a".to_string(), U64(1));
            tree_map.insert("b".to_string(), U64(2));
A
Adolfo Ochagavía 已提交
3777
            Object(tree_map)
3778 3779
        };

C
Corey Farwell 已提交
3780
        assert_eq!(array2.to_json(), array2);
3781
        assert_eq!(object.to_json(), object);
3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793
        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));
3794
        assert_eq!(().to_json(), Null);
M
mrec 已提交
3795 3796
        assert_eq!(f32::INFINITY.to_json(), Null);
        assert_eq!(f64::NAN.to_json(), Null);
3797 3798
        assert_eq!(true.to_json(), Boolean(true));
        assert_eq!(false.to_json(), Boolean(false));
A
Alex Crichton 已提交
3799 3800
        assert_eq!("abc".to_json(), String("abc".to_string()));
        assert_eq!("abc".to_string().to_json(), String("abc".to_string()));
C
Corey Farwell 已提交
3801 3802 3803 3804 3805 3806
        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 已提交
3807
        let mut tree_map = BTreeMap::new();
3808 3809
        tree_map.insert("a".to_string(), 1u);
        tree_map.insert("b".to_string(), 2);
3810 3811
        assert_eq!(tree_map.to_json(), object);
        let mut hash_map = HashMap::new();
A
Alex Crichton 已提交
3812 3813
        hash_map.insert("a".to_string(), 1u);
        hash_map.insert("b".to_string(), 2);
3814
        assert_eq!(hash_map.to_json(), object);
3815 3816
        assert_eq!(Some(15i).to_json(), I64(15));
        assert_eq!(Some(15u).to_json(), U64(15));
3817 3818 3819
        assert_eq!(None::<int>.to_json(), Null);
    }

3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854
    #[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} }
                ]
            }"#);
        });
    }

3855
    fn big_json() -> string::String {
A
Alex Crichton 已提交
3856
        let mut src = "[\n".to_string();
3857
        for _ in range(0i, 500) {
3858 3859
            src.push_str(r#"{ "a": true, "b": null, "c":3.1415, "d": "Hello world", "e": \
                            [1,2,3]},"#);
3860
        }
3861
        src.push_str("{}]");
3862 3863 3864 3865 3866 3867 3868
        return src;
    }

    #[bench]
    fn bench_streaming_large(b: &mut Bencher) {
        let src = big_json();
        b.iter( || {
3869
            let mut parser = Parser::new(src.chars());
3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880
            loop {
                match parser.next() {
                    None => return,
                    _ => {}
                }
            }
        });
    }
    #[bench]
    fn bench_large(b: &mut Bencher) {
        let src = big_json();
3881
        b.iter( || { let _ = from_str(src.as_slice()); });
3882
    }
3883
}