json.rs 124.9 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 199
use self::JsonEvent::*;
use self::StackElement::*;
use self::ErrorCode::*;
use self::ParserError::*;
use self::DecoderError::*;
S
Steven Fackler 已提交
200 201 202
use self::ParserState::*;
use self::InternalStackElement::*;

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

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

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

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

233 234 235 236 237
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> }

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

260
#[derive(Clone, Copy, PartialEq, Show)]
261
pub enum ParserError {
S
Sean McArthur 已提交
262
    /// msg, line, col
263 264 265 266 267 268 269
    SyntaxError(ErrorCode, uint, uint),
    IoError(io::IoErrorKind, &'static str),
}

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

270
#[derive(Clone, PartialEq, Show)]
271 272
pub enum DecoderError {
    ParseError(ParserError),
273 274 275 276
    ExpectedError(string::String, string::String),
    MissingFieldError(string::String),
    UnknownVariantError(string::String),
    ApplicationError(string::String)
277 278 279 280
}

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

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

323 324 325 326 327 328 329 330
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)
331
}
332

333 334 335 336 337
impl std::error::Error for DecoderError {
    fn description(&self) -> &str { "decoder error" }
    fn detail(&self) -> Option<std::string::String> { Some(self.to_string()) }
}

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

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

    let mut start = 0;

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

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

        try!(wr.write_str(escaped));

        start = i + 1;
393
    }
394

395 396
    if start != v.len() {
        try!(wr.write_str(v[start..]));
397 398 399
    }

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

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

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

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

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

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

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

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

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

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

450 451 452 453 454
    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) }
455

456 457 458 459 460
    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) }
461

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

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

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

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

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

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

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

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

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

547 548 549
    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 已提交
550
        if idx != 0 { try!(write!(self.writer, ",")); }
551 552
        try!(escape_str(self.writer, name));
        try!(write!(self.writer, ":"));
S
Sean McArthur 已提交
553
        f(self)
554 555
    }

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

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

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

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

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

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

615 616 617
    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 已提交
618
        if idx != 0 { try!(write!(self.writer, ",")) }
619 620
        // 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 已提交
621
        let mut buf = Vec::new();
N
Nick Cameron 已提交
622 623 624 625 626
        // FIXME(14302) remove the transmute and unsafe block.
        unsafe {
            let mut check_encoder = Encoder::new(&mut buf);
            try!(f(transmute(&mut check_encoder)));
        }
D
Daniel Micay 已提交
627
        let out = str::from_utf8(buf[]).unwrap();
A
Adolfo Ochagavía 已提交
628 629
        let needs_wrapping = out.char_at(0) != '"' && out.char_at_reverse(out.len()) != '"';
        if needs_wrapping { try!(write!(self.writer, "\"")); }
S
Sean McArthur 已提交
630
        try!(f(self));
A
Adolfo Ochagavía 已提交
631
        if needs_wrapping { try!(write!(self.writer, "\"")); }
S
Sean McArthur 已提交
632
        Ok(())
633 634
    }

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

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

E
Erik Price 已提交
651
impl<'a> PrettyEncoder<'a> {
652
    /// Creates a new encoder whose output will be written to the specified writer
653
    pub fn new(writer: &'a mut fmt::Writer) -> PrettyEncoder<'a> {
654 655 656 657 658
        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 已提交
659
    pub fn set_indent(&mut self, indent: uint) {
660
        // self.indent very well could be 0 so we need to use checked division.
661
        let level = self.curr_indent.checked_div(self.indent).unwrap_or(0);
662 663
        self.indent = indent;
        self.curr_indent = level * self.indent;
664
    }
665
}
666

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

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

672 673 674 675 676
    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) }
677

678 679 680 681 682
    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) }
683

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

881 882 883
    fn emit_map_elt_key<F>(&mut self, idx: uint, mut f: F) -> EncodeResult where
        F: FnMut(&mut PrettyEncoder<'a>) -> EncodeResult,
    {
884
        if idx == 0 {
A
Adolfo Ochagavía 已提交
885
            try!(write!(self.writer, "\n"));
886
        } else {
A
Adolfo Ochagavía 已提交
887
            try!(write!(self.writer, ",\n"));
888
        }
889
        try!(spaces(self.writer, self.curr_indent));
890 891
        // 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 已提交
892
        let mut buf = Vec::new();
N
Nick Cameron 已提交
893 894 895 896 897
        // FIXME(14302) remove the transmute and unsafe block.
        unsafe {
            let mut check_encoder = PrettyEncoder::new(&mut buf);
            try!(f(transmute(&mut check_encoder)));
        }
D
Daniel Micay 已提交
898
        let out = str::from_utf8(buf[]).unwrap();
A
Adolfo Ochagavía 已提交
899 900
        let needs_wrapping = out.char_at(0) != '"' && out.char_at_reverse(out.len()) != '"';
        if needs_wrapping { try!(write!(self.writer, "\"")); }
S
Sean McArthur 已提交
901
        try!(f(self));
A
Adolfo Ochagavía 已提交
902
        if needs_wrapping { try!(write!(self.writer, "\"")); }
S
Sean McArthur 已提交
903
        Ok(())
904 905
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

    /// If the Json value is a String, returns the associated str.
    /// Returns None otherwise.
1029
    pub fn as_string<'a>(&'a self) -> Option<&'a str> {
1030
        match *self {
A
Alex Crichton 已提交
1031
            Json::String(ref s) => Some(s[]),
1032 1033 1034 1035 1036 1037
            _ => None
        }
    }

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

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

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

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

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

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

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

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

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

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

J
Jorge Aparicio 已提交
1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146
impl<'a> ops::Index<&'a str>  for Json {
    type Output = Json;

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

impl ops::Index<uint> for Json {
    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")
        }
    }
}

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

1163
#[derive(PartialEq, Show)]
1164
enum ParserState {
C
Corey Farwell 已提交
1165
    // Parse a value in an array, true means first element.
1166
    ParseArray(bool),
C
Corey Farwell 已提交
1167
    // Parse ',' or ']' after an element in an array.
C
Corey Farwell 已提交
1168
    ParseArrayComma,
1169 1170 1171 1172
    // 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 已提交
1173
    // Initial state.
1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191
    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.
/// For example, Key("foo"), Key("bar"), Index(3) and Key("x") are the
/// 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) => Index(i),
A
Adolfo Ochagavía 已提交
1223
            InternalKey(start, size) => {
A
Adolfo Ochagavía 已提交
1224
                Key(str::from_utf8(
1225
                    self.str_buffer[start as uint .. start as uint + size as uint]).unwrap())
A
Adolfo Ochagavía 已提交
1226
            }
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 1265 1266
        }
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

            i += 1u;
        }

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

        Ok(n)
    }

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

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

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

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

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

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

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

1666 1667 1668 1669
            match self.state {
                ParseStart => {
                    return self.parse_start();
                }
1670
                ParseArray(first) => {
C
Corey Farwell 已提交
1671
                    return self.parse_array(first);
1672
                }
C
Corey Farwell 已提交
1673 1674
                ParseArrayComma => {
                    match self.parse_array_comma_or_end() {
1675 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
                        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 {
1701 1702 1703 1704
            Error(_) => ParseFinished,
            ArrayStart => ParseArray(true),
            ObjectStart => ParseObject(true),
            _ => ParseBeforeFinish,
1705 1706 1707
        };
        return val;
    }
1708

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

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

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

1805
        let val = self.parse_value();
1806

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2432 2433 2434 2435 2436 2437 2438 2439 2440 2441
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)
    }
}

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

impl<'a> fmt::Show for PrettyJson<'a> {
    /// 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)
    }
}

2460
impl<'a, T: Encodable> fmt::Show for AsJson<'a, T> {
2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476
    /// 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
    }
}

2477
impl<'a, T: Encodable> fmt::Show for AsPrettyJson<'a, T> {
2478 2479 2480 2481 2482 2483 2484 2485 2486
    /// 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)
2487
    }
2488 2489
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3262 3263 3264
        let json_value = from_str("12").unwrap();
        assert!(!json_value.is_i64());

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

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

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

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

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

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

    #[test]
    fn test_as_i64(){
3298
        let json_value = from_str("-12").unwrap();
3299
        let json_num = json_value.as_i64();
3300 3301 3302 3303 3304 3305 3306
        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();
3307 3308 3309 3310 3311 3312 3313 3314
        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));
3315 3316 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
    }

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

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

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

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

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

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

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

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

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

D
Daniel Micay 已提交
3410
            let printed = from_utf8(writer[]).unwrap();
3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428

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

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

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

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

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

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

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

        assert_eq!(from_str("["),     Err(SyntaxError(EOFWhileParsingValue, 1, 2)));
C
Corey Farwell 已提交
3657
        assert_eq!(from_str("[1"),    Err(SyntaxError(EOFWhileParsingArray, 1, 3)));
3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697
        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);
N
Nick Cameron 已提交
3698 3699 3700
        assert!(stack.is_equal_to(&[Index(1)]));
        assert!(stack.starts_with(&[Index(1)]));
        assert!(stack.ends_with(&[Index(1)]));
3701 3702 3703
        assert!(stack.last_is_index());
        assert!(stack.get(0) == Index(1));

A
Alex Crichton 已提交
3704
        stack.push_key("foo".to_string());
3705 3706

        assert!(stack.len() == 2);
N
Nick Cameron 已提交
3707 3708 3709 3710 3711
        assert!(stack.is_equal_to(&[Index(1), Key("foo")]));
        assert!(stack.starts_with(&[Index(1), Key("foo")]));
        assert!(stack.starts_with(&[Index(1)]));
        assert!(stack.ends_with(&[Index(1), Key("foo")]));
        assert!(stack.ends_with(&[Key("foo")]));
3712 3713 3714 3715
        assert!(!stack.last_is_index());
        assert!(stack.get(0) == Index(1));
        assert!(stack.get(1) == Key("foo"));

A
Alex Crichton 已提交
3716
        stack.push_key("bar".to_string());
3717 3718

        assert!(stack.len() == 3);
N
Nick Cameron 已提交
3719 3720 3721 3722 3723 3724 3725
        assert!(stack.is_equal_to(&[Index(1), Key("foo"), Key("bar")]));
        assert!(stack.starts_with(&[Index(1)]));
        assert!(stack.starts_with(&[Index(1), Key("foo")]));
        assert!(stack.starts_with(&[Index(1), Key("foo"), Key("bar")]));
        assert!(stack.ends_with(&[Key("bar")]));
        assert!(stack.ends_with(&[Key("foo"), Key("bar")]));
        assert!(stack.ends_with(&[Index(1), Key("foo"), Key("bar")]));
3726 3727 3728 3729 3730 3731 3732 3733
        assert!(!stack.last_is_index());
        assert!(stack.get(0) == Index(1));
        assert!(stack.get(1) == Key("foo"));
        assert!(stack.get(2) == Key("bar"));

        stack.pop();

        assert!(stack.len() == 2);
N
Nick Cameron 已提交
3734 3735 3736 3737 3738
        assert!(stack.is_equal_to(&[Index(1), Key("foo")]));
        assert!(stack.starts_with(&[Index(1), Key("foo")]));
        assert!(stack.starts_with(&[Index(1)]));
        assert!(stack.ends_with(&[Index(1), Key("foo")]));
        assert!(stack.ends_with(&[Key("foo")]));
3739 3740 3741 3742 3743
        assert!(!stack.last_is_index());
        assert!(stack.get(0) == Index(1));
        assert!(stack.get(1) == Key("foo"));
    }

3744 3745
    #[test]
    fn test_to_json() {
A
Alexis Beingessner 已提交
3746
        use std::collections::{HashMap,BTreeMap};
3747 3748
        use super::ToJson;

C
Corey Farwell 已提交
3749 3750
        let array2 = Array(vec!(U64(1), U64(2)));
        let array3 = Array(vec!(U64(1), U64(2), U64(3)));
3751
        let object = {
A
Alexis Beingessner 已提交
3752
            let mut tree_map = BTreeMap::new();
3753 3754
            tree_map.insert("a".to_string(), U64(1));
            tree_map.insert("b".to_string(), U64(2));
A
Adolfo Ochagavía 已提交
3755
            Object(tree_map)
3756 3757
        };

C
Corey Farwell 已提交
3758
        assert_eq!(array2.to_json(), array2);
3759
        assert_eq!(object.to_json(), object);
3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771
        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));
3772
        assert_eq!(().to_json(), Null);
M
mrec 已提交
3773 3774
        assert_eq!(f32::INFINITY.to_json(), Null);
        assert_eq!(f64::NAN.to_json(), Null);
3775 3776
        assert_eq!(true.to_json(), Boolean(true));
        assert_eq!(false.to_json(), Boolean(false));
A
Alex Crichton 已提交
3777 3778
        assert_eq!("abc".to_json(), String("abc".to_string()));
        assert_eq!("abc".to_string().to_json(), String("abc".to_string()));
C
Corey Farwell 已提交
3779 3780 3781 3782 3783 3784
        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 已提交
3785
        let mut tree_map = BTreeMap::new();
3786 3787
        tree_map.insert("a".to_string(), 1u);
        tree_map.insert("b".to_string(), 2);
3788 3789
        assert_eq!(tree_map.to_json(), object);
        let mut hash_map = HashMap::new();
A
Alex Crichton 已提交
3790 3791
        hash_map.insert("a".to_string(), 1u);
        hash_map.insert("b".to_string(), 2);
3792
        assert_eq!(hash_map.to_json(), object);
3793 3794
        assert_eq!(Some(15i).to_json(), I64(15));
        assert_eq!(Some(15u).to_json(), U64(15));
3795 3796 3797
        assert_eq!(None::<int>.to_json(), Null);
    }

3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832
    #[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} }
                ]
            }"#);
        });
    }

3833
    fn big_json() -> string::String {
A
Alex Crichton 已提交
3834
        let mut src = "[\n".to_string();
3835
        for _ in range(0i, 500) {
3836 3837
            src.push_str(r#"{ "a": true, "b": null, "c":3.1415, "d": "Hello world", "e": \
                            [1,2,3]},"#);
3838
        }
3839
        src.push_str("{}]");
3840 3841 3842 3843 3844 3845 3846
        return src;
    }

    #[bench]
    fn bench_streaming_large(b: &mut Bencher) {
        let src = big_json();
        b.iter( || {
3847
            let mut parser = Parser::new(src.chars());
3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858
            loop {
                match parser.next() {
                    None => return,
                    _ => {}
                }
            }
        });
    }
    #[bench]
    fn bench_large(b: &mut Bencher) {
        let src = big_json();
3859
        b.iter( || { let _ = from_str(src.as_slice()); });
3860
    }
3861
}