json.rs 111.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 15
#![forbid(non_camel_case_types)]
#![allow(missing_doc)]
E
Elly Jones 已提交
16

M
musitdev 已提交
17 18 19 20 21 22
/*!
JSON parsing and serialization

# What is JSON?

JSON (JavaScript Object Notation) is a way to write data in Javascript.
A
Adolfo Ochagavía 已提交
23 24 25 26 27 28 29 30 31 32 33 34
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
* `Object`: equivalent to rust's `Treemap<String, json::Json>`
* `Null`
M
musitdev 已提交
35 36 37 38 39

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:

A
Alex Crichton 已提交
40
```ignore
M
musitdev 已提交
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
{
    "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

A
Adolfo Ochagavía 已提交
59 60
Rust provides a mechanism for low boilerplate encoding & decoding of values to and from JSON via
the serialization API.
61 62
To be able to encode a piece of data, it must implement the `serialize::Encodable` trait.
To be able to decode a piece of data, it must implement the `serialize::Decodable` trait.
A
Adolfo Ochagavía 已提交
63 64
The Rust compiler provides an annotation to automatically generate the code for these traits:
`#[deriving(Decodable, Encodable)]`
M
musitdev 已提交
65

A
Adolfo Ochagavía 已提交
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.
M
musitdev 已提交
70 71 72 73 74 75 76

When using `ToJson` the `Encodable` trait implementation is not mandatory.

# Examples of use

## Using Autoserialization

I
Ilya Dmitrichenko 已提交
77 78
Create a struct called `TestStruct` and serialize and deserialize it to and from JSON using the
serialization API, using the derived serialization code.
M
musitdev 已提交
79 80

```rust
A
Alex Crichton 已提交
81
extern crate serialize;
A
Adolfo Ochagavía 已提交
82
use serialize::json;
M
musitdev 已提交
83

I
Ilya Dmitrichenko 已提交
84 85 86
// Automatically generate `Decodable` and `Encodable` trait implementations
#[deriving(Decodable, Encodable)]
pub struct TestStruct  {
M
musitdev 已提交
87
    data_int: u8,
88
    data_str: String,
K
Kevin Ballard 已提交
89
    data_vector: Vec<u8>,
A
Adolfo Ochagavía 已提交
90
}
M
musitdev 已提交
91 92

fn main() {
I
Ilya Dmitrichenko 已提交
93 94 95 96 97
    let object = TestStruct {
        data_int: 1,
        data_str: "toto".to_string(),
        data_vector: vec![2,3,4,5],
    };
M
musitdev 已提交
98

A
Adolfo Ochagavía 已提交
99 100
    // Serialize using `json::encode`
    let encoded = json::encode(&object);
M
musitdev 已提交
101

A
Adolfo Ochagavía 已提交
102
    // Deserialize using `json::decode`
I
Ilya Dmitrichenko 已提交
103
    let decoded: TestStruct = json::decode(encoded.as_slice()).unwrap();
M
musitdev 已提交
104 105 106
}
```

I
Ilya Dmitrichenko 已提交
107
## Using the `ToJson` trait
M
musitdev 已提交
108

I
Ilya Dmitrichenko 已提交
109 110 111 112
The examples above use the `ToJson` trait to generate the JSON string, which required
for custom mappings.

### Simple example of `ToJson` usage
M
musitdev 已提交
113 114

```rust
I
Ilya Dmitrichenko 已提交
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
extern crate serialize;
use serialize::json::ToJson;
use serialize::json;

// A custom data structure
struct ComplexNum {
    a: f64,
    b: f64,
}

// JSON value representation
impl ToJson for ComplexNum {
    fn to_json(&self) -> json::Json {
        json::String(format!("{}+{}i", self.a, self.b))
    }
}

// Only generate `Encodable` trait implementation
#[deriving(Encodable)]
pub struct ComplexNumRecord {
    uid: u8,
    dsc: String,
    val: json::Json,
}

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

```rust
extern crate serialize;
156
use std::collections::TreeMap;
A
Alex Crichton 已提交
157
use serialize::json::ToJson;
A
Adolfo Ochagavía 已提交
158
use serialize::json;
M
musitdev 已提交
159

I
Ilya Dmitrichenko 已提交
160
// Only generate `Decodable` trait implementation
A
Adolfo Ochagavía 已提交
161
#[deriving(Decodable)]
I
Ilya Dmitrichenko 已提交
162
pub struct TestStruct {
M
musitdev 已提交
163
    data_int: u8,
164
    data_str: String,
K
Kevin Ballard 已提交
165
    data_vector: Vec<u8>,
M
musitdev 已提交
166 167
}

I
Ilya Dmitrichenko 已提交
168 169 170
// Specify encoding method manually
impl ToJson for TestStruct {
    fn to_json(&self) -> json::Json {
A
Adolfo Ochagavía 已提交
171
        let mut d = TreeMap::new();
I
Ilya Dmitrichenko 已提交
172
        // All standard types implement `to_json()`, so use it
173 174 175
        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());
M
musitdev 已提交
176 177 178 179 180
        json::Object(d)
    }
}

fn main() {
A
Adolfo Ochagavía 已提交
181
    // Serialize using `ToJson`
I
Ilya Dmitrichenko 已提交
182 183 184 185 186 187 188
    let input_data = TestStruct {
        data_int: 1,
        data_str: "toto".to_string(),
        data_vector: vec![2,3,4,5],
    };
    let json_obj: json::Json = input_data.to_json();
    let json_str: String = json_obj.to_string();
M
musitdev 已提交
189

A
Adolfo Ochagavía 已提交
190
    // Deserialize like before
I
Ilya Dmitrichenko 已提交
191
    let decoded: TestStruct = json::decode(json_str.as_slice()).unwrap();
M
musitdev 已提交
192 193 194 195
}
```

*/
B
Brian Anderson 已提交
196

A
Adolfo Ochagavía 已提交
197
use std;
198
use std::collections::{HashMap, TreeMap};
A
Adolfo Ochagavía 已提交
199
use std::{char, f64, fmt, io, num, str};
A
Alex Crichton 已提交
200
use std::io::MemWriter;
A
Adolfo Ochagavía 已提交
201
use std::mem::{swap, transmute};
M
mrec 已提交
202
use std::num::{FPNaN, FPInfinite};
203
use std::str::ScalarValue;
204
use std::string::String;
205
use std::vec::Vec;
206

A
Alex Crichton 已提交
207
use Encodable;
E
Elly Jones 已提交
208

209
/// Represents a json value
210
#[deriving(Clone, PartialEq, PartialOrd)]
211
pub enum Json {
D
Daniel Micay 已提交
212
    Number(f64),
213
    String(String),
B
Ben Striegel 已提交
214
    Boolean(bool),
215
    List(List),
A
Adolfo Ochagavía 已提交
216
    Object(Object),
B
Ben Striegel 已提交
217
    Null,
E
Elly Jones 已提交
218 219
}

K
Kevin Ballard 已提交
220
pub type List = Vec<Json>;
221
pub type Object = TreeMap<String, Json>;
222

223
/// The errors that can arise while parsing a JSON stream.
224
#[deriving(Clone, PartialEq)]
225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243
pub enum ErrorCode {
    InvalidSyntax,
    InvalidNumber,
    EOFWhileParsingObject,
    EOFWhileParsingList,
    EOFWhileParsingValue,
    EOFWhileParsingString,
    KeyMustBeAString,
    ExpectedColon,
    TrailingCharacters,
    InvalidEscape,
    InvalidUnicodeCodePoint,
    LoneLeadingSurrogateInHexEscape,
    UnexpectedEndOfHexEscape,
    UnrecognizedHex,
    NotFourDigit,
    NotUtf8,
}

244
#[deriving(Clone, PartialEq, Show)]
245
pub enum ParserError {
S
Sean McArthur 已提交
246
    /// msg, line, col
247 248 249 250 251 252 253
    SyntaxError(ErrorCode, uint, uint),
    IoError(io::IoErrorKind, &'static str),
}

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

254
#[deriving(Clone, PartialEq, Show)]
255 256
pub enum DecoderError {
    ParseError(ParserError),
257 258 259
    ExpectedError(String, String),
    MissingFieldError(String),
    UnknownVariantError(String),
260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283
}

/// Returns a readable error string for a given error code.
pub fn error_str(error: ErrorCode) -> &'static str {
    return match error {
        InvalidSyntax => "invalid syntax",
        InvalidNumber => "invalid number",
        EOFWhileParsingObject => "EOF While parsing object",
        EOFWhileParsingList => "EOF While parsing list",
        EOFWhileParsingValue => "EOF While parsing value",
        EOFWhileParsingString => "EOF While parsing string",
        KeyMustBeAString => "key must be a string",
        ExpectedColon => "expected `:`",
        TrailingCharacters => "trailing characters",
        InvalidEscape => "invalid escape",
        UnrecognizedHex => "invalid \\u escape (unrecognized hex)",
        NotFourDigit => "invalid \\u escape (not four digits)",
        NotUtf8 => "contents not utf-8",
        InvalidUnicodeCodePoint => "invalid unicode code point",
        LoneLeadingSurrogateInHexEscape => "lone leading surrogate in hex escape",
        UnexpectedEndOfHexEscape => "unexpected end of hex escape",
    }
}

284 285 286 287 288 289 290 291 292 293 294 295 296 297
/// Shortcut function to decode a JSON `&str` into an object
pub fn decode<T: ::Decodable<Decoder, DecoderError>>(s: &str) -> DecodeResult<T> {
    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`
pub fn encode<'a, T: Encodable<Encoder<'a>, io::IoError>>(object: &T) -> String {
    let buff = Encoder::buffer_encode(object);
298
    String::from_utf8(buff).unwrap()
299 300
}

301 302 303 304 305 306 307 308
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)
309
}
310

S
Sean McArthur 已提交
311
pub type EncodeResult = io::IoResult<()>;
312
pub type DecodeResult<T> = Result<T, DecoderError>;
A
Alex Crichton 已提交
313

314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332
pub fn escape_bytes(wr: &mut io::Writer, bytes: &[u8]) -> Result<(), io::IoError> {
    try!(wr.write_str("\""));

    let mut start = 0;

    for (i, byte) in bytes.iter().enumerate() {
        let escaped = match *byte {
            b'"' => "\\\"",
            b'\\' => "\\\\",
            b'\x08' => "\\b",
            b'\x0c' => "\\f",
            b'\n' => "\\n",
            b'\r' => "\\r",
            b'\t' => "\\t",
            _ => { continue; }
        };

        if start < i {
            try!(wr.write(bytes.slice(start, i)));
E
Elly Jones 已提交
333
        }
334 335 336 337

        try!(wr.write_str(escaped));

        start = i + 1;
338
    }
339 340 341 342 343 344

    if start != bytes.len() {
        try!(wr.write(bytes.slice_from(start)));
    }

    wr.write_str("\"")
345 346 347 348 349 350 351 352 353 354 355 356
}

fn escape_str(writer: &mut io::Writer, v: &str) -> Result<(), io::IoError> {
    escape_bytes(writer, v.as_bytes())
}

fn escape_char(writer: &mut io::Writer, v: char) -> Result<(), io::IoError> {
    let mut buf = [0, .. 4];
    v.encode_utf8(buf);
    escape_bytes(writer, buf)
}

357 358 359 360 361 362 363 364 365 366 367 368 369
fn spaces(wr: &mut io::Writer, mut n: uint) -> Result<(), io::IoError> {
    static len: uint = 16;
    static buf: [u8, ..len] = [b' ', ..len];

    while n >= len {
        try!(wr.write(buf));
        n -= len;
    }

    if n > 0 {
        wr.write(buf.slice_to(n))
    } else {
        Ok(())
370
    }
E
Elly Jones 已提交
371 372
}

M
mrec 已提交
373 374 375 376 377 378 379
fn fmt_number_or_null(v: f64) -> String {
    match v.classify() {
        FPNaN | FPInfinite => String::from_str("null"),
        _ => f64::to_str_digits(v, 6u)
    }
}

380
/// A structure for implementing serialization to JSON.
E
Erik Price 已提交
381
pub struct Encoder<'a> {
A
Adolfo Ochagavía 已提交
382
    writer: &'a mut io::Writer,
383 384
}

E
Erik Price 已提交
385
impl<'a> Encoder<'a> {
386 387
    /// Creates a new JSON encoder whose output will be written to the writer
    /// specified.
A
Adolfo Ochagavía 已提交
388 389
    pub fn new(writer: &'a mut io::Writer) -> Encoder<'a> {
        Encoder { writer: writer }
390
    }
M
musitdev 已提交
391 392

    /// Encode the specified struct into a json [u8]
A
Adolfo Ochagavía 已提交
393 394
    pub fn buffer_encode<T:Encodable<Encoder<'a>, io::IoError>>(object: &T) -> Vec<u8>  {
        //Serialize the object in a string using a writer
M
musitdev 已提交
395
        let mut m = MemWriter::new();
N
Nick Cameron 已提交
396 397
        // FIXME(14302) remove the transmute and unsafe block.
        unsafe {
M
musitdev 已提交
398
            let mut encoder = Encoder::new(&mut m as &mut io::Writer);
S
Sean McArthur 已提交
399
            // MemWriter never Errs
A
Adolfo Ochagavía 已提交
400
            let _ = object.encode(transmute(&mut encoder));
M
musitdev 已提交
401
        }
402
        m.unwrap()
M
musitdev 已提交
403 404 405
    }

    /// Encode the specified struct into a json str
406 407 408
    ///
    /// Note: this function is deprecated. Consider using `json::encode` instead.
    #[deprecated = "Replaced by `json::encode`"]
A
Adolfo Ochagavía 已提交
409
    pub fn str_encode<T: Encodable<Encoder<'a>, io::IoError>>(object: &T) -> String {
410
        encode(object)
M
musitdev 已提交
411
    }
412 413
}

S
Sean McArthur 已提交
414
impl<'a> ::Encoder<io::IoError> for Encoder<'a> {
A
Adolfo Ochagavía 已提交
415
    fn emit_nil(&mut self) -> EncodeResult { write!(self.writer, "null") }
416

S
Sean McArthur 已提交
417 418 419 420 421
    fn emit_uint(&mut self, v: uint) -> EncodeResult { self.emit_f64(v as f64) }
    fn emit_u64(&mut self, v: u64) -> EncodeResult { self.emit_f64(v as f64) }
    fn emit_u32(&mut self, v: u32) -> EncodeResult { self.emit_f64(v as f64) }
    fn emit_u16(&mut self, v: u16) -> EncodeResult { self.emit_f64(v as f64) }
    fn emit_u8(&mut self, v: u8) -> EncodeResult  { self.emit_f64(v as f64) }
422

S
Sean McArthur 已提交
423 424 425 426 427
    fn emit_int(&mut self, v: int) -> EncodeResult { self.emit_f64(v as f64) }
    fn emit_i64(&mut self, v: i64) -> EncodeResult { self.emit_f64(v as f64) }
    fn emit_i32(&mut self, v: i32) -> EncodeResult { self.emit_f64(v as f64) }
    fn emit_i16(&mut self, v: i16) -> EncodeResult { self.emit_f64(v as f64) }
    fn emit_i8(&mut self, v: i8) -> EncodeResult  { self.emit_f64(v as f64) }
428

S
Sean McArthur 已提交
429
    fn emit_bool(&mut self, v: bool) -> EncodeResult {
430
        if v {
A
Adolfo Ochagavía 已提交
431
            write!(self.writer, "true")
432
        } else {
A
Adolfo Ochagavía 已提交
433
            write!(self.writer, "false")
434 435 436
        }
    }

S
Sean McArthur 已提交
437
    fn emit_f64(&mut self, v: f64) -> EncodeResult {
A
Adolfo Ochagavía 已提交
438
        write!(self.writer, "{}", fmt_number_or_null(v))
A
Alex Crichton 已提交
439
    }
S
Sean McArthur 已提交
440
    fn emit_f32(&mut self, v: f32) -> EncodeResult { self.emit_f64(v as f64) }
441

442
    fn emit_char(&mut self, v: char) -> EncodeResult {
443
        escape_char(self.writer, v)
444
    }
S
Sean McArthur 已提交
445
    fn emit_str(&mut self, v: &str) -> EncodeResult {
446
        escape_str(self.writer, v)
A
Alex Crichton 已提交
447
    }
448

A
Adolfo Ochagavía 已提交
449 450 451
    fn emit_enum(&mut self, _name: &str, f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
        f(self)
    }
452

453 454 455 456 457 458 459 460 461
    fn emit_enum_variant(&mut self,
                         name: &str,
                         _id: uint,
                         cnt: uint,
                         f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
        // enums are encoded as strings or objects
        // Bunny => "Bunny"
        // Kangaroo(34,"William") => {"variant": "Kangaroo", "fields": [34,"William"]}
        if cnt == 0 {
462
            escape_str(self.writer, name)
463
        } else {
A
Adolfo Ochagavía 已提交
464
            try!(write!(self.writer, "{{\"variant\":"));
465
            try!(escape_str(self.writer, name));
A
Adolfo Ochagavía 已提交
466
            try!(write!(self.writer, ",\"fields\":["));
467
            try!(f(self));
A
Adolfo Ochagavía 已提交
468
            write!(self.writer, "]}}")
469 470
        }
    }
471

S
Sean McArthur 已提交
472 473 474
    fn emit_enum_variant_arg(&mut self,
                             idx: uint,
                             f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
475
        if idx != 0 {
A
Adolfo Ochagavía 已提交
476
            try!(write!(self.writer, ","));
477
        }
S
Sean McArthur 已提交
478
        f(self)
479 480 481 482 483 484
    }

    fn emit_enum_struct_variant(&mut self,
                                name: &str,
                                id: uint,
                                cnt: uint,
S
Sean McArthur 已提交
485
                                f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
486 487 488 489 490 491
        self.emit_enum_variant(name, id, cnt, f)
    }

    fn emit_enum_struct_variant_field(&mut self,
                                      _: &str,
                                      idx: uint,
S
Sean McArthur 已提交
492
                                      f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
493 494 495
        self.emit_enum_variant_arg(idx, f)
    }

496 497 498 499
    fn emit_struct(&mut self,
                   _: &str,
                   _: uint,
                   f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
A
Adolfo Ochagavía 已提交
500
        try!(write!(self.writer, "{{"));
501
        try!(f(self));
A
Adolfo Ochagavía 已提交
502
        write!(self.writer, "}}")
503
    }
504 505 506 507

    fn emit_struct_field(&mut self,
                         name: &str,
                         idx: uint,
S
Sean McArthur 已提交
508
                         f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
A
Adolfo Ochagavía 已提交
509
        if idx != 0 { try!(write!(self.writer, ",")); }
510 511
        try!(escape_str(self.writer, name));
        try!(write!(self.writer, ":"));
S
Sean McArthur 已提交
512
        f(self)
513 514
    }

S
Sean McArthur 已提交
515
    fn emit_tuple(&mut self, len: uint, f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
516 517
        self.emit_seq(len, f)
    }
S
Sean McArthur 已提交
518 519 520
    fn emit_tuple_arg(&mut self,
                      idx: uint,
                      f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
521 522 523 524 525 526
        self.emit_seq_elt(idx, f)
    }

    fn emit_tuple_struct(&mut self,
                         _name: &str,
                         len: uint,
S
Sean McArthur 已提交
527
                         f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
528 529
        self.emit_seq(len, f)
    }
S
Sean McArthur 已提交
530 531 532
    fn emit_tuple_struct_arg(&mut self,
                             idx: uint,
                             f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
533 534 535
        self.emit_seq_elt(idx, f)
    }

S
Sean McArthur 已提交
536 537 538 539 540 541 542
    fn emit_option(&mut self, f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
        f(self)
    }
    fn emit_option_none(&mut self) -> EncodeResult { self.emit_nil() }
    fn emit_option_some(&mut self, f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
        f(self)
    }
543

S
Sean McArthur 已提交
544
    fn emit_seq(&mut self, _len: uint, f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
A
Adolfo Ochagavía 已提交
545
        try!(write!(self.writer, "["));
S
Sean McArthur 已提交
546
        try!(f(self));
A
Adolfo Ochagavía 已提交
547
        write!(self.writer, "]")
548 549
    }

S
Sean McArthur 已提交
550
    fn emit_seq_elt(&mut self, idx: uint, f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
551
        if idx != 0 {
A
Adolfo Ochagavía 已提交
552
            try!(write!(self.writer, ","));
553 554 555 556
        }
        f(self)
    }

557
    fn emit_map(&mut self, _len: uint, f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
A
Adolfo Ochagavía 已提交
558
        try!(write!(self.writer, "{{"));
559
        try!(f(self));
A
Adolfo Ochagavía 已提交
560
        write!(self.writer, "}}")
561
    }
562

S
Sean McArthur 已提交
563 564 565
    fn emit_map_elt_key(&mut self,
                        idx: uint,
                        f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
A
Adolfo Ochagavía 已提交
566
        if idx != 0 { try!(write!(self.writer, ",")) }
567 568 569
        // ref #12967, make sure to wrap a key in double quotes,
        // in the event that its of a type that omits them (eg numbers)
        let mut buf = MemWriter::new();
N
Nick Cameron 已提交
570 571 572 573 574
        // FIXME(14302) remove the transmute and unsafe block.
        unsafe {
            let mut check_encoder = Encoder::new(&mut buf);
            try!(f(transmute(&mut check_encoder)));
        }
575
        let out = str::from_utf8(buf.get_ref()).unwrap();
A
Adolfo Ochagavía 已提交
576 577
        let needs_wrapping = out.char_at(0) != '"' && out.char_at_reverse(out.len()) != '"';
        if needs_wrapping { try!(write!(self.writer, "\"")); }
S
Sean McArthur 已提交
578
        try!(f(self));
A
Adolfo Ochagavía 已提交
579
        if needs_wrapping { try!(write!(self.writer, "\"")); }
S
Sean McArthur 已提交
580
        Ok(())
581 582
    }

S
Sean McArthur 已提交
583 584 585
    fn emit_map_elt_val(&mut self,
                        _idx: uint,
                        f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
A
Adolfo Ochagavía 已提交
586
        try!(write!(self.writer, ":"));
587 588 589 590
        f(self)
    }
}

591 592
/// Another encoder for JSON, but prints out human-readable JSON instead of
/// compact data
E
Erik Price 已提交
593
pub struct PrettyEncoder<'a> {
A
Adolfo Ochagavía 已提交
594
    writer: &'a mut io::Writer,
595
    indent: uint,
596 597
}

E
Erik Price 已提交
598
impl<'a> PrettyEncoder<'a> {
599
    /// Creates a new encoder whose output will be written to the specified writer
A
Adolfo Ochagavía 已提交
600 601
    pub fn new<'a>(writer: &'a mut io::Writer) -> PrettyEncoder<'a> {
        PrettyEncoder { writer: writer, indent: 0 }
602
    }
603
}
604

S
Sean McArthur 已提交
605
impl<'a> ::Encoder<io::IoError> for PrettyEncoder<'a> {
A
Adolfo Ochagavía 已提交
606
    fn emit_nil(&mut self) -> EncodeResult { write!(self.writer, "null") }
607

S
Sean McArthur 已提交
608 609 610 611 612
    fn emit_uint(&mut self, v: uint) -> EncodeResult { self.emit_f64(v as f64) }
    fn emit_u64(&mut self, v: u64) -> EncodeResult { self.emit_f64(v as f64) }
    fn emit_u32(&mut self, v: u32) -> EncodeResult { self.emit_f64(v as f64) }
    fn emit_u16(&mut self, v: u16) -> EncodeResult { self.emit_f64(v as f64) }
    fn emit_u8(&mut self, v: u8) -> EncodeResult { self.emit_f64(v as f64) }
613

S
Sean McArthur 已提交
614 615 616 617 618
    fn emit_int(&mut self, v: int) -> EncodeResult { self.emit_f64(v as f64) }
    fn emit_i64(&mut self, v: i64) -> EncodeResult { self.emit_f64(v as f64) }
    fn emit_i32(&mut self, v: i32) -> EncodeResult { self.emit_f64(v as f64) }
    fn emit_i16(&mut self, v: i16) -> EncodeResult { self.emit_f64(v as f64) }
    fn emit_i8(&mut self, v: i8) -> EncodeResult { self.emit_f64(v as f64) }
619

S
Sean McArthur 已提交
620
    fn emit_bool(&mut self, v: bool) -> EncodeResult {
621
        if v {
A
Adolfo Ochagavía 已提交
622
            write!(self.writer, "true")
623
        } else {
A
Adolfo Ochagavía 已提交
624
            write!(self.writer, "false")
625 626 627
        }
    }

S
Sean McArthur 已提交
628
    fn emit_f64(&mut self, v: f64) -> EncodeResult {
A
Adolfo Ochagavía 已提交
629
        write!(self.writer, "{}", fmt_number_or_null(v))
A
Alex Crichton 已提交
630
    }
631 632 633
    fn emit_f32(&mut self, v: f32) -> EncodeResult {
        self.emit_f64(v as f64)
    }
634

635
    fn emit_char(&mut self, v: char) -> EncodeResult {
636
        escape_char(self.writer, v)
637
    }
S
Sean McArthur 已提交
638
    fn emit_str(&mut self, v: &str) -> EncodeResult {
639
        escape_str(self.writer, v)
A
Alex Crichton 已提交
640
    }
641

S
Sean McArthur 已提交
642 643 644
    fn emit_enum(&mut self,
                 _name: &str,
                 f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
645 646 647 648 649 650 651
        f(self)
    }

    fn emit_enum_variant(&mut self,
                         name: &str,
                         _: uint,
                         cnt: uint,
S
Sean McArthur 已提交
652
                         f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
653
        if cnt == 0 {
654
            escape_str(self.writer, name)
655 656
        } else {
            self.indent += 2;
657 658 659 660
            try!(write!(self.writer, "[\n"));
            try!(spaces(self.writer, self.indent));
            try!(escape_str(self.writer, name));
            try!(write!(self.writer, ",\n"));
S
Sean McArthur 已提交
661
            try!(f(self));
662
            self.indent -= 2;
663 664 665
            try!(write!(self.writer, "\n"));
            try!(spaces(self.writer, self.indent));
            write!(self.writer, "]")
666 667 668 669 670
        }
    }

    fn emit_enum_variant_arg(&mut self,
                             idx: uint,
S
Sean McArthur 已提交
671
                             f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
672
        if idx != 0 {
A
Adolfo Ochagavía 已提交
673
            try!(write!(self.writer, ",\n"));
674
        }
675
        try!(spaces(self.writer, self.indent));
676 677 678 679 680 681 682
        f(self)
    }

    fn emit_enum_struct_variant(&mut self,
                                name: &str,
                                id: uint,
                                cnt: uint,
S
Sean McArthur 已提交
683
                                f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
684 685 686 687 688 689
        self.emit_enum_variant(name, id, cnt, f)
    }

    fn emit_enum_struct_variant_field(&mut self,
                                      _: &str,
                                      idx: uint,
S
Sean McArthur 已提交
690
                                      f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
691 692 693 694
        self.emit_enum_variant_arg(idx, f)
    }


695 696 697 698 699
    fn emit_struct(&mut self,
                   _: &str,
                   len: uint,
                   f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
        if len == 0 {
A
Adolfo Ochagavía 已提交
700
            write!(self.writer, "{{}}")
701
        } else {
A
Adolfo Ochagavía 已提交
702
            try!(write!(self.writer, "{{"));
703 704 705
            self.indent += 2;
            try!(f(self));
            self.indent -= 2;
706 707 708
            try!(write!(self.writer, "\n"));
            try!(spaces(self.writer, self.indent));
            write!(self.writer, "}}")
709 710
        }
    }
711 712 713 714

    fn emit_struct_field(&mut self,
                         name: &str,
                         idx: uint,
S
Sean McArthur 已提交
715
                         f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
716
        if idx == 0 {
A
Adolfo Ochagavía 已提交
717
            try!(write!(self.writer, "\n"));
718
        } else {
A
Adolfo Ochagavía 已提交
719
            try!(write!(self.writer, ",\n"));
720
        }
721 722 723
        try!(spaces(self.writer, self.indent));
        try!(escape_str(self.writer, name));
        try!(write!(self.writer, ": "));
S
Sean McArthur 已提交
724
        f(self)
725 726
    }

S
Sean McArthur 已提交
727 728 729
    fn emit_tuple(&mut self,
                  len: uint,
                  f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
730 731
        self.emit_seq(len, f)
    }
S
Sean McArthur 已提交
732 733 734
    fn emit_tuple_arg(&mut self,
                      idx: uint,
                      f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
735 736 737 738 739 740
        self.emit_seq_elt(idx, f)
    }

    fn emit_tuple_struct(&mut self,
                         _: &str,
                         len: uint,
S
Sean McArthur 已提交
741
                         f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
742 743 744 745
        self.emit_seq(len, f)
    }
    fn emit_tuple_struct_arg(&mut self,
                             idx: uint,
S
Sean McArthur 已提交
746
                             f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
747 748 749
        self.emit_seq_elt(idx, f)
    }

S
Sean McArthur 已提交
750 751 752 753 754 755 756
    fn emit_option(&mut self, f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
        f(self)
    }
    fn emit_option_none(&mut self) -> EncodeResult { self.emit_nil() }
    fn emit_option_some(&mut self, f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
        f(self)
    }
757

S
Sean McArthur 已提交
758 759 760
    fn emit_seq(&mut self,
                len: uint,
                f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
761
        if len == 0 {
A
Adolfo Ochagavía 已提交
762
            write!(self.writer, "[]")
763
        } else {
A
Adolfo Ochagavía 已提交
764
            try!(write!(self.writer, "["));
765
            self.indent += 2;
S
Sean McArthur 已提交
766
            try!(f(self));
767
            self.indent -= 2;
768 769 770
            try!(write!(self.writer, "\n"));
            try!(spaces(self.writer, self.indent));
            write!(self.writer, "]")
771 772 773
        }
    }

S
Sean McArthur 已提交
774 775 776
    fn emit_seq_elt(&mut self,
                    idx: uint,
                    f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
777
        if idx == 0 {
A
Adolfo Ochagavía 已提交
778
            try!(write!(self.writer, "\n"));
779
        } else {
A
Adolfo Ochagavía 已提交
780
            try!(write!(self.writer, ",\n"));
781
        }
782
        try!(spaces(self.writer, self.indent));
783 784 785
        f(self)
    }

786 787 788 789
    fn emit_map(&mut self,
                len: uint,
                f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
        if len == 0 {
A
Adolfo Ochagavía 已提交
790
            write!(self.writer, "{{}}")
791
        } else {
A
Adolfo Ochagavía 已提交
792
            try!(write!(self.writer, "{{"));
793 794 795
            self.indent += 2;
            try!(f(self));
            self.indent -= 2;
796 797 798
            try!(write!(self.writer, "\n"));
            try!(spaces(self.writer, self.indent));
            write!(self.writer, "}}")
799 800
        }
    }
801

S
Sean McArthur 已提交
802 803 804
    fn emit_map_elt_key(&mut self,
                        idx: uint,
                        f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
805
        if idx == 0 {
A
Adolfo Ochagavía 已提交
806
            try!(write!(self.writer, "\n"));
807
        } else {
A
Adolfo Ochagavía 已提交
808
            try!(write!(self.writer, ",\n"));
809
        }
810
        try!(spaces(self.writer, self.indent));
811 812 813
        // ref #12967, make sure to wrap a key in double quotes,
        // in the event that its of a type that omits them (eg numbers)
        let mut buf = MemWriter::new();
N
Nick Cameron 已提交
814 815 816 817 818
        // FIXME(14302) remove the transmute and unsafe block.
        unsafe {
            let mut check_encoder = PrettyEncoder::new(&mut buf);
            try!(f(transmute(&mut check_encoder)));
        }
819
        let out = str::from_utf8(buf.get_ref()).unwrap();
A
Adolfo Ochagavía 已提交
820 821
        let needs_wrapping = out.char_at(0) != '"' && out.char_at_reverse(out.len()) != '"';
        if needs_wrapping { try!(write!(self.writer, "\"")); }
S
Sean McArthur 已提交
822
        try!(f(self));
A
Adolfo Ochagavía 已提交
823
        if needs_wrapping { try!(write!(self.writer, "\"")); }
S
Sean McArthur 已提交
824
        Ok(())
825 826
    }

S
Sean McArthur 已提交
827 828 829
    fn emit_map_elt_val(&mut self,
                        _idx: uint,
                        f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
A
Adolfo Ochagavía 已提交
830
        try!(write!(self.writer, ": "));
S
Sean McArthur 已提交
831
        f(self)
832 833 834
    }
}

835 836
impl<E: ::Encoder<S>, S> Encodable<E, S> for Json {
    fn encode(&self, e: &mut E) -> Result<(), S> {
837 838 839 840 841 842 843 844 845 846 847
        match *self {
            Number(v) => v.encode(e),
            String(ref v) => v.encode(e),
            Boolean(v) => v.encode(e),
            List(ref v) => v.encode(e),
            Object(ref v) => v.encode(e),
            Null => e.emit_nil(),
        }
    }
}

848
impl Json {
A
Adolfo Ochagavía 已提交
849 850 851
    /// Encodes a json value into an io::writer. Uses a single line.
    pub fn to_writer(&self, writer: &mut io::Writer) -> EncodeResult {
        let mut encoder = Encoder::new(writer);
S
Sean McArthur 已提交
852
        self.encode(&mut encoder)
853
    }
854

J
Jorge Aparicio 已提交
855
    /// Encodes a json value into an io::writer.
856
    /// Pretty-prints in a more readable format.
A
Adolfo Ochagavía 已提交
857 858
    pub fn to_pretty_writer(&self, writer: &mut io::Writer) -> EncodeResult {
        let mut encoder = PrettyEncoder::new(writer);
S
Sean McArthur 已提交
859
        self.encode(&mut encoder)
860
    }
861

862
    /// Encodes a json value into a string
863
    pub fn to_pretty_str(&self) -> String {
864
        let mut s = MemWriter::new();
A
Alex Crichton 已提交
865
        self.to_pretty_writer(&mut s as &mut io::Writer).unwrap();
866
        String::from_utf8(s.unwrap()).unwrap()
867
    }
868 869 870

     /// If the Json value is an Object, returns the value associated with the provided key.
    /// Otherwise, returns None.
871
    pub fn find<'a>(&'a self, key: &String) -> Option<&'a Json>{
872 873 874 875 876 877 878
        match self {
            &Object(ref map) => map.find(key),
            _ => None
        }
    }

    /// Attempts to get a nested Json Object for each key in `keys`.
879
    /// If any key is found not to exist, find_path will return None.
880
    /// Otherwise, it will return the Json value associated with the final key.
881
    pub fn find_path<'a>(&'a self, keys: &[&String]) -> Option<&'a Json>{
882 883 884 885 886 887 888 889
        let mut target = self;
        for key in keys.iter() {
            match target.find(*key) {
                Some(t) => { target = t; },
                None => return None
            }
        }
        Some(target)
890 891 892 893 894
    }

    /// 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.
895
    pub fn search<'a>(&'a self, key: &String) -> Option<&'a Json> {
896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917
        match self {
            &Object(ref map) => {
                match map.find(key) {
                    Some(json_value) => Some(json_value),
                    None => {
                        let mut value : Option<&'a Json> = None;
                        for (_, v) in map.iter() {
                            value = v.search(key);
                            if value.is_some() {
                                break;
                            }
                        }
                        value
                    }
                }
            },
            _ => None
        }
    }

    /// Returns true if the Json value is an Object. Returns false otherwise.
    pub fn is_object<'a>(&'a self) -> bool {
918
        self.as_object().is_some()
919 920 921 922 923 924
    }

    /// If the Json value is an Object, returns the associated TreeMap.
    /// Returns None otherwise.
    pub fn as_object<'a>(&'a self) -> Option<&'a Object> {
        match self {
A
Adolfo Ochagavía 已提交
925
            &Object(ref map) => Some(map),
926 927 928 929 930 931
            _ => None
        }
    }

    /// Returns true if the Json value is a List. Returns false otherwise.
    pub fn is_list<'a>(&'a self) -> bool {
932
        self.as_list().is_some()
933 934 935 936 937 938 939 940 941 942 943 944
    }

    /// If the Json value is a List, returns the associated vector.
    /// Returns None otherwise.
    pub fn as_list<'a>(&'a self) -> Option<&'a List> {
        match self {
            &List(ref list) => Some(&*list),
            _ => None
        }
    }

    /// Returns true if the Json value is a String. Returns false otherwise.
945 946
    pub fn is_string<'a>(&'a self) -> bool {
        self.as_string().is_some()
947 948 949 950
    }

    /// If the Json value is a String, returns the associated str.
    /// Returns None otherwise.
951
    pub fn as_string<'a>(&'a self) -> Option<&'a str> {
952 953 954 955 956 957 958 959
        match *self {
            String(ref s) => Some(s.as_slice()),
            _ => None
        }
    }

    /// Returns true if the Json value is a Number. Returns false otherwise.
    pub fn is_number(&self) -> bool {
960
        self.as_number().is_some()
961 962 963 964 965 966 967 968 969 970 971 972 973
    }

    /// If the Json value is a Number, returns the associated f64.
    /// Returns None otherwise.
    pub fn as_number(&self) -> Option<f64> {
        match self {
            &Number(n) => Some(n),
            _ => None
        }
    }

    /// Returns true if the Json value is a Boolean. Returns false otherwise.
    pub fn is_boolean(&self) -> bool {
974
        self.as_boolean().is_some()
975 976 977 978 979 980 981 982 983 984 985 986 987
    }

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

    /// Returns true if the Json value is a Null. Returns false otherwise.
    pub fn is_null(&self) -> bool {
988
        self.as_null().is_some()
989 990 991 992 993 994 995 996 997 998
    }

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

1001
/// The output of the streaming parser.
1002
#[deriving(PartialEq, Clone, Show)]
1003 1004 1005 1006 1007 1008 1009
pub enum JsonEvent {
    ObjectStart,
    ObjectEnd,
    ListStart,
    ListEnd,
    BooleanValue(bool),
    NumberValue(f64),
1010
    StringValue(String),
1011 1012 1013 1014
    NullValue,
    Error(ParserError),
}

1015
#[deriving(PartialEq, Show)]
1016 1017 1018 1019 1020 1021 1022 1023 1024
enum ParserState {
    // Parse a value in a list, true means first element.
    ParseList(bool),
    // Parse ',' or ']' after an element in a list.
    ParseListComma,
    // 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 已提交
1025
    // Initial state.
1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043
    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
1044
#[deriving(PartialEq, Clone, Show)]
1045 1046 1047 1048 1049 1050 1051
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.
1052
#[deriving(PartialEq, Clone, Show)]
1053 1054 1055 1056 1057 1058 1059
enum InternalStackElement {
    InternalIndex(u32),
    InternalKey(u16, u16), // start, size
}

impl Stack {
    pub fn new() -> Stack {
A
Adolfo Ochagavía 已提交
1060
        Stack { stack: Vec::new(), str_buffer: Vec::new() }
1061 1062 1063 1064 1065
    }

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

A
Adolfo Ochagavía 已提交
1066 1067
    /// Returns true if the stack is empty.
    pub fn is_empty(&self) -> bool { self.stack.is_empty() }
1068 1069 1070 1071 1072

    /// 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 已提交
1073
        match self.stack[idx] {
A
Adolfo Ochagavía 已提交
1074 1075
            InternalIndex(i) => { Index(i) }
            InternalKey(start, size) => {
A
Adolfo Ochagavía 已提交
1076 1077
                Key(str::from_utf8(
                    self.str_buffer.slice(start as uint, start as uint + size as uint)).unwrap())
A
Adolfo Ochagavía 已提交
1078
            }
1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125
        }
    }

    /// 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(
                    self.str_buffer.slice(start as uint, (start+size) as uint)
                ).unwrap()))
            }
        }
    }

    // Used by Parser to insert Key elements at the top of the stack.
1126
    fn push_key(&mut self, key: String) {
1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143
        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 已提交
1144
                self.str_buffer.truncate(new_size);
1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163
            }
            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 已提交
1164 1165
            InternalIndex(i) => { i + 1 }
            _ => { fail!(); }
1166 1167 1168 1169 1170 1171 1172
        };
        *self.stack.get_mut(len - 1) = InternalIndex(idx);
    }
}

/// A streaming JSON parser implemented as an iterator of JsonEvent, consuming
/// an iterator of char.
G
Gary Linscott 已提交
1173
pub struct Parser<T> {
1174 1175 1176 1177
    rdr: T,
    ch: Option<char>,
    line: uint,
    col: uint,
1178 1179 1180
    // We maintain a stack representing where we are in the logical structure
    // of the JSON stream.
    stack: Stack,
J
Joseph Crail 已提交
1181
    // A state machine is kept to make it possible to interrupt and resume parsing.
1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203
    state: ParserState,
}

impl<T: Iterator<char>> Iterator<JsonEvent> for Parser<T> {
    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());
    }
1204 1205
}

1206
impl<T: Iterator<char>> Parser<T> {
1207
    /// Creates the JSON parser.
1208
    pub fn new(rdr: T) -> Parser<T> {
1209 1210
        let mut p = Parser {
            rdr: rdr,
1211
            ch: Some('\x00'),
1212 1213
            line: 1,
            col: 0,
1214 1215
            stack: Stack::new(),
            state: ParseStart,
1216 1217
        };
        p.bump();
1218
        return p;
1219
    }
E
Elly Jones 已提交
1220

1221 1222 1223
    /// Provides access to the current position in the logical structure of the
    /// JSON stream.
    pub fn stack<'l>(&'l self) -> &'l Stack {
1224
        return &self.stack;
1225
    }
1226

1227 1228
    fn eof(&self) -> bool { self.ch.is_none() }
    fn ch_or_null(&self) -> char { self.ch.unwrap_or('\x00') }
1229
    fn bump(&mut self) {
1230
        self.ch = self.rdr.next();
E
Elly Jones 已提交
1231

1232
        if self.ch_is('\n') {
1233 1234
            self.line += 1u;
            self.col = 1u;
G
Gary Linscott 已提交
1235 1236
        } else {
            self.col += 1u;
E
Elly Jones 已提交
1237
        }
1238 1239
    }

1240
    fn next_char(&mut self) -> Option<char> {
1241 1242 1243
        self.bump();
        self.ch
    }
1244 1245 1246
    fn ch_is(&self, c: char) -> bool {
        self.ch == Some(c)
    }
1247

1248 1249
    fn error<T>(&self, reason: ErrorCode) -> Result<T, ParserError> {
        Err(SyntaxError(reason, self.line, self.col))
1250 1251
    }

1252
    fn parse_whitespace(&mut self) {
1253 1254 1255 1256
        while self.ch_is(' ') ||
              self.ch_is('\n') ||
              self.ch_is('\t') ||
              self.ch_is('\r') { self.bump(); }
1257 1258
    }

1259
    fn parse_number(&mut self) -> Result<f64, ParserError> {
D
Daniel Micay 已提交
1260
        let mut neg = 1.0;
1261

1262
        if self.ch_is('-') {
1263
            self.bump();
D
Daniel Micay 已提交
1264
            neg = -1.0;
E
Elly Jones 已提交
1265
        }
1266

A
Adolfo Ochagavía 已提交
1267
        let mut res = try!(self.parse_integer());
1268

1269
        if self.ch_is('.') {
A
Adolfo Ochagavía 已提交
1270
            res = try!(self.parse_decimal(res));
E
Elly Jones 已提交
1271
        }
1272

1273
        if self.ch_is('e') || self.ch_is('E') {
A
Adolfo Ochagavía 已提交
1274
            res = try!(self.parse_exponent(res));
E
Elly Jones 已提交
1275
        }
1276

1277
        Ok(neg * res)
E
Elly Jones 已提交
1278 1279
    }

1280
    fn parse_integer(&mut self) -> Result<f64, ParserError> {
D
Daniel Micay 已提交
1281
        let mut res = 0.0;
E
Elly Jones 已提交
1282

1283 1284 1285
        match self.ch_or_null() {
            '0' => {
                self.bump();
1286

M
mrec 已提交
1287
                // A leading '0' must be the only digit before the decimal point.
1288
                match self.ch_or_null() {
1289
                    '0' .. '9' => return self.error(InvalidNumber),
1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302
                    _ => ()
                }
            },
            '1' .. '9' => {
                while !self.eof() {
                    match self.ch_or_null() {
                        c @ '0' .. '9' => {
                            res *= 10.0;
                            res += ((c as int) - ('0' as int)) as f64;
                            self.bump();
                        }
                        _ => break,
                    }
1303 1304
                }
            }
1305
            _ => return self.error(InvalidNumber),
E
Elly Jones 已提交
1306
        }
1307
        Ok(res)
E
Elly Jones 已提交
1308 1309
    }

A
Adolfo Ochagavía 已提交
1310
    fn parse_decimal(&mut self, mut res: f64) -> Result<f64, ParserError> {
1311 1312 1313
        self.bump();

        // Make sure a digit follows the decimal place.
1314 1315
        match self.ch_or_null() {
            '0' .. '9' => (),
1316
             _ => return self.error(InvalidNumber)
1317 1318
        }

D
Daniel Micay 已提交
1319
        let mut dec = 1.0;
1320
        while !self.eof() {
1321 1322 1323 1324 1325 1326 1327
            match self.ch_or_null() {
                c @ '0' .. '9' => {
                    dec /= 10.0;
                    res += (((c as int) - ('0' as int)) as f64) * dec;
                    self.bump();
                }
                _ => break,
E
Elly Jones 已提交
1328 1329
            }
        }
1330

1331
        Ok(res)
E
Elly Jones 已提交
1332 1333
    }

1334
    fn parse_exponent(&mut self, mut res: f64) -> Result<f64, ParserError> {
1335 1336
        self.bump();

1337 1338
        let mut exp = 0u;
        let mut neg_exp = false;
1339

1340 1341 1342 1343 1344
        if self.ch_is('+') {
            self.bump();
        } else if self.ch_is('-') {
            self.bump();
            neg_exp = true;
1345 1346 1347
        }

        // Make sure a digit follows the exponent place.
1348 1349
        match self.ch_or_null() {
            '0' .. '9' => (),
1350
            _ => return self.error(InvalidNumber)
1351 1352
        }
        while !self.eof() {
1353 1354 1355 1356
            match self.ch_or_null() {
                c @ '0' .. '9' => {
                    exp *= 10;
                    exp += (c as uint) - ('0' as uint);
1357

1358 1359 1360
                    self.bump();
                }
                _ => break
1361 1362 1363
            }
        }

A
Adolfo Ochagavía 已提交
1364
        let exp = num::pow(10_f64, exp);
1365 1366 1367 1368 1369 1370
        if neg_exp {
            res /= exp;
        } else {
            res *= exp;
        }

1371
        Ok(res)
E
Elly Jones 已提交
1372 1373
    }

1374
    fn decode_hex_escape(&mut self) -> Result<u16, ParserError> {
1375 1376
        let mut i = 0u;
        let mut n = 0u16;
A
Adolfo Ochagavía 已提交
1377
        while i < 4 && !self.eof() {
1378 1379
            self.bump();
            n = match self.ch_or_null() {
A
Adolfo Ochagavía 已提交
1380 1381 1382 1383 1384 1385 1386
                c @ '0' .. '9' => n * 16 + ((c as u16) - ('0' as u16)),
                '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,
1387
                _ => return self.error(InvalidEscape)
1388 1389 1390 1391 1392 1393
            };

            i += 1u;
        }

        // Error out if we didn't parse 4 digits.
A
Adolfo Ochagavía 已提交
1394
        if i != 4 {
1395
            return self.error(InvalidEscape);
1396 1397 1398 1399 1400
        }

        Ok(n)
    }

1401
    fn parse_str(&mut self) -> Result<String, ParserError> {
1402
        let mut escape = false;
1403
        let mut res = String::new();
1404

G
Gary Linscott 已提交
1405
        loop {
1406
            self.bump();
G
Gary Linscott 已提交
1407
            if self.eof() {
1408
                return self.error(EOFWhileParsingString);
G
Gary Linscott 已提交
1409
            }
1410

H
Huon Wilson 已提交
1411
            if escape {
1412 1413 1414 1415 1416 1417 1418 1419 1420
                match self.ch_or_null() {
                    '"' => res.push_char('"'),
                    '\\' => res.push_char('\\'),
                    '/' => res.push_char('/'),
                    'b' => res.push_char('\x08'),
                    'f' => res.push_char('\x0c'),
                    'n' => res.push_char('\n'),
                    'r' => res.push_char('\r'),
                    't' => res.push_char('\t'),
1421
                    'u' => match try!(self.decode_hex_escape()) {
1422
                        0xDC00 .. 0xDFFF => return self.error(LoneLeadingSurrogateInHexEscape),
1423 1424 1425 1426

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

1432 1433 1434
                            let buf = [n1, try!(self.decode_hex_escape())];
                            match str::utf16_items(buf.as_slice()).next() {
                                Some(ScalarValue(c)) => res.push_char(c),
1435
                                _ => return self.error(LoneLeadingSurrogateInHexEscape),
1436
                            }
1437 1438
                        }

1439 1440
                        n => match char::from_u32(n as u32) {
                            Some(c) => res.push_char(c),
1441
                            None => return self.error(InvalidUnicodeCodePoint),
1442 1443
                        },
                    },
1444
                    _ => return self.error(InvalidEscape),
1445 1446
                }
                escape = false;
1447
            } else if self.ch_is('\\') {
1448 1449
                escape = true;
            } else {
1450
                match self.ch {
1451 1452
                    Some('"') => {
                        self.bump();
1453
                        return Ok(res);
1454
                    },
1455 1456
                    Some(c) => res.push_char(c),
                    None => unreachable!()
1457
                }
E
Elly Jones 已提交
1458 1459 1460 1461
            }
        }
    }

1462 1463 1464 1465
    // 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 已提交
1466
    // stream int the form of a stack that can be queried by the user using the
1467 1468 1469 1470 1471 1472 1473 1474 1475 1476
    // stack() method.
    fn parse(&mut self) -> JsonEvent {
        loop {
            // The only paths where the loop can spin a new iteration
            // are in the cases ParseListComma and ParseObjectComma if ','
            // is parsed. In these cases the state is set to (respectively)
            // ParseList(false) and ParseObject(false), which always return,
            // 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();
1477

1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519
            match self.state {
                ParseStart => {
                    return self.parse_start();
                }
                ParseList(first) => {
                    return self.parse_list(first);
                }
                ParseListComma => {
                    match self.parse_list_comma_or_end() {
                        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 {
            Error(_) => { ParseFinished }
            ListStart => { ParseList(true) }
            ObjectStart => { ParseObject(true) }
            _ => { ParseBeforeFinish }
        };
        return val;
    }
1520

1521
    fn parse_list(&mut self, first: bool) -> JsonEvent {
1522
        if self.ch_is(']') {
1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534
            if !first {
                return self.error_event(InvalidSyntax);
            }
            if self.stack.is_empty() {
                self.state = ParseBeforeFinish;
            } else {
                self.state = if self.stack.last_is_index() {
                    ParseListComma
                } else {
                    ParseObjectComma
                }
            }
1535
            self.bump();
1536 1537 1538 1539
            return ListEnd;
        }
        if first {
            self.stack.push_index(0);
1540 1541
        }

1542
        let val = self.parse_value();
1543

1544 1545 1546 1547 1548 1549 1550 1551
        self.state = match val {
            Error(_) => { ParseFinished }
            ListStart => { ParseList(true) }
            ObjectStart => { ParseObject(true) }
            _ => { ParseListComma }
        };
        return val;
    }
1552

1553 1554 1555 1556 1557 1558 1559 1560 1561 1562
    fn parse_list_comma_or_end(&mut self) -> Option<JsonEvent> {
        if self.ch_is(',') {
            self.stack.bump_index();
            self.state = ParseList(false);
            self.bump();
            return None;
        } else if self.ch_is(']') {
            self.stack.pop();
            if self.stack.is_empty() {
                self.state = ParseBeforeFinish;
1563
            } else {
1564 1565 1566 1567 1568
                self.state = if self.stack.last_is_index() {
                    ParseListComma
                } else {
                    ParseObjectComma
                }
1569
            }
1570 1571 1572 1573 1574 1575 1576
            self.bump();
            return Some(ListEnd);
        } else if self.eof() {
            return Some(self.error_event(EOFWhileParsingList));
        } else {
            return Some(self.error_event(InvalidSyntax));
        }
E
Elly Jones 已提交
1577 1578
    }

1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615
    fn parse_object(&mut self, first: bool) -> JsonEvent {
        if self.ch_is('}') {
            if !first {
                self.stack.pop();
            }
            if self.stack.is_empty() {
                self.state = ParseBeforeFinish;
            } else {
                self.state = if self.stack.last_is_index() {
                    ParseListComma
                } else {
                    ParseObjectComma
                }
            }
            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() {
            Ok(s) => { s }
            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);
1616 1617 1618
        self.bump();
        self.parse_whitespace();

1619
        let val = self.parse_value();
1620

1621 1622 1623 1624 1625 1626 1627 1628 1629 1630
        self.state = match val {
            Error(_) => { ParseFinished }
            ListStart => { ParseList(true) }
            ObjectStart => { ParseObject(true) }
            _ => { ParseObjectComma }
        };
        return val;
    }

    fn parse_object_end(&mut self) -> JsonEvent {
1631
        if self.ch_is('}') {
1632 1633 1634 1635 1636 1637 1638 1639 1640 1641
            if self.stack.is_empty() {
                self.state = ParseBeforeFinish;
            } else {
                self.state = if self.stack.last_is_index() {
                    ParseListComma
                } else {
                    ParseObjectComma
                }
            }
            self.bump();
A
Adolfo Ochagavía 已提交
1642
            ObjectEnd
1643
        } else if self.eof() {
A
Adolfo Ochagavía 已提交
1644
            self.error_event(EOFWhileParsingObject)
1645
        } else {
A
Adolfo Ochagavía 已提交
1646
            self.error_event(InvalidSyntax)
1647
        }
1648
    }
1649

1650 1651 1652
    fn parse_value(&mut self) -> JsonEvent {
        if self.eof() { return self.error_event(EOFWhileParsingValue); }
        match self.ch_or_null() {
A
Adolfo Ochagavía 已提交
1653 1654 1655 1656
            'n' => { self.parse_ident("ull", NullValue) }
            't' => { self.parse_ident("rue", BooleanValue(true)) }
            'f' => { self.parse_ident("alse", BooleanValue(false)) }
            '0' .. '9' | '-' => match self.parse_number() {
1657 1658 1659
                Ok(f) => NumberValue(f),
                Err(e) => Error(e),
            },
A
Adolfo Ochagavía 已提交
1660
            '"' => match self.parse_str() {
1661 1662 1663 1664 1665
                Ok(s) => StringValue(s),
                Err(e) => Error(e),
            },
            '[' => {
                self.bump();
A
Adolfo Ochagavía 已提交
1666
                ListStart
1667 1668 1669
            }
            '{' => {
                self.bump();
A
Adolfo Ochagavía 已提交
1670
                ObjectStart
1671
            }
A
Adolfo Ochagavía 已提交
1672
            _ => { self.error_event(InvalidSyntax) }
1673 1674
        }
    }
1675

1676 1677 1678 1679 1680 1681 1682 1683
    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))
        }
    }
1684

1685 1686 1687 1688 1689
    fn error_event(&mut self, reason: ErrorCode) -> JsonEvent {
        self.state = ParseFinished;
        Error(SyntaxError(reason, self.line, self.col))
    }
}
1690

1691 1692 1693 1694 1695
/// A Builder consumes a json::Parser to create a generic Json structure.
pub struct Builder<T> {
    parser: Parser<T>,
    token: Option<JsonEvent>,
}
1696

1697 1698 1699
impl<T: Iterator<char>> Builder<T> {
    /// Create a JSON Builder.
    pub fn new(src: T) -> Builder<T> {
A
Adolfo Ochagavía 已提交
1700
        Builder { parser: Parser::new(src), token: None, }
1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712
    }

    // 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); }
            ref tok => { fail!("unexpected token {}", tok.clone()); }
        }
A
Adolfo Ochagavía 已提交
1713
        result
1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725
    }

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

    fn build_value(&mut self) -> Result<Json, BuilderError> {
        return match self.token {
            Some(NullValue) => { Ok(Null) }
            Some(NumberValue(n)) => { Ok(Number(n)) }
            Some(BooleanValue(b)) => { Ok(Boolean(b)) }
            Some(StringValue(ref mut s)) => {
1726
                let mut temp = String::new();
1727 1728
                swap(s, &mut temp);
                Ok(String(temp))
1729
            }
1730 1731 1732 1733 1734 1735 1736 1737
            Some(Error(e)) => { Err(e) }
            Some(ListStart) => { self.build_list() }
            Some(ObjectStart) => { self.build_object() }
            Some(ObjectEnd) => { self.parser.error(InvalidSyntax) }
            Some(ListEnd) => { self.parser.error(InvalidSyntax) }
            None => { self.parser.error(EOFWhileParsingValue) }
        }
    }
1738

1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749
    fn build_list(&mut self) -> Result<Json, BuilderError> {
        self.bump();
        let mut values = Vec::new();

        loop {
            if self.token == Some(ListEnd) {
                return Ok(List(values.move_iter().collect()));
            }
            match self.build_value() {
                Ok(v) => values.push(v),
                Err(e) => { return Err(e) }
1750
            }
1751
            self.bump();
1752
        }
1753
    }
1754

1755 1756 1757
    fn build_object(&mut self) -> Result<Json, BuilderError> {
        self.bump();

A
Adolfo Ochagavía 已提交
1758
        let mut values = TreeMap::new();
1759

A
Adolfo Ochagavía 已提交
1760
        loop {
1761 1762 1763 1764 1765 1766 1767
            match self.token {
                Some(ObjectEnd) => { return Ok(Object(values)); }
                Some(Error(e)) => { return Err(e); }
                None => { break; }
                _ => {}
            }
            let key = match self.parser.stack().top() {
1768
                Some(Key(k)) => { k.to_string() }
1769 1770 1771 1772 1773 1774 1775 1776 1777
                _ => { fail!("invalid state"); }
            };
            match self.build_value() {
                Ok(value) => { values.insert(key, value); }
                Err(e) => { return Err(e); }
            }
            self.bump();
        }
        return self.parser.error(EOFWhileParsingObject);
L
Lenny222 已提交
1778 1779 1780
    }
}

A
Alex Crichton 已提交
1781
/// Decodes a json value from an `&mut io::Reader`
1782
pub fn from_reader(rdr: &mut io::Reader) -> Result<Json, BuilderError> {
A
Alex Crichton 已提交
1783
    let contents = match rdr.read_to_end() {
1784
        Ok(c)  => c,
1785
        Err(e) => return Err(io_error_to_error(e))
A
Alex Crichton 已提交
1786
    };
1787 1788 1789
    let s = match str::from_utf8(contents.as_slice()) {
        Some(s) => s,
        _       => return Err(SyntaxError(NotUtf8, 0, 0))
A
Alex Crichton 已提交
1790
    };
1791
    let mut builder = Builder::new(s.chars());
1792
    builder.build()
E
Elly Jones 已提交
1793 1794
}

1795
/// Decodes a json value from a string
1796 1797
pub fn from_str(s: &str) -> Result<Json, BuilderError> {
    let mut builder = Builder::new(s.chars());
A
Adolfo Ochagavía 已提交
1798
    builder.build()
1799 1800
}

1801
/// A structure to decode JSON to values in rust.
1802
pub struct Decoder {
1803
    stack: Vec<Json>,
1804 1805
}

1806 1807
impl Decoder {
    /// Creates a new decoder instance for decoding the specified JSON value.
1808
    pub fn new(json: Json) -> Decoder {
A
Adolfo Ochagavía 已提交
1809
        Decoder { stack: vec![json] }
1810
    }
1811 1812
}

1813
impl Decoder {
S
Sean McArthur 已提交
1814 1815
    fn pop(&mut self) -> Json {
        self.stack.pop().unwrap()
1816 1817 1818
    }
}

S
Sean McArthur 已提交
1819 1820 1821 1822
macro_rules! expect(
    ($e:expr, Null) => ({
        match $e {
            Null => Ok(()),
1823
            other => Err(ExpectedError("Null".to_string(),
A
Alex Crichton 已提交
1824
                                       format!("{}", other)))
S
Sean McArthur 已提交
1825 1826 1827 1828 1829
        }
    });
    ($e:expr, $t:ident) => ({
        match $e {
            $t(v) => Ok(v),
1830
            other => {
1831
                Err(ExpectedError(stringify!($t).to_string(),
A
Alex Crichton 已提交
1832
                                  format!("{}", other)))
1833
            }
1834
        }
S
Sean McArthur 已提交
1835 1836 1837
    })
)

1838
impl ::Decoder<DecoderError> for Decoder {
S
Sean McArthur 已提交
1839 1840
    fn read_nil(&mut self) -> DecodeResult<()> {
        debug!("read_nil");
A
Adolfo Ochagavía 已提交
1841
        expect!(self.pop(), Null)
1842 1843
    }

S
Sean McArthur 已提交
1844 1845 1846 1847 1848
    fn read_u64(&mut self)  -> DecodeResult<u64 > { Ok(try!(self.read_f64()) as u64) }
    fn read_u32(&mut self)  -> DecodeResult<u32 > { Ok(try!(self.read_f64()) as u32) }
    fn read_u16(&mut self)  -> DecodeResult<u16 > { Ok(try!(self.read_f64()) as u16) }
    fn read_u8 (&mut self)  -> DecodeResult<u8  > { Ok(try!(self.read_f64()) as u8) }
    fn read_uint(&mut self) -> DecodeResult<uint> { Ok(try!(self.read_f64()) as uint) }
1849

S
Sean McArthur 已提交
1850 1851 1852 1853 1854
    fn read_i64(&mut self) -> DecodeResult<i64> { Ok(try!(self.read_f64()) as i64) }
    fn read_i32(&mut self) -> DecodeResult<i32> { Ok(try!(self.read_f64()) as i32) }
    fn read_i16(&mut self) -> DecodeResult<i16> { Ok(try!(self.read_f64()) as i16) }
    fn read_i8 (&mut self) -> DecodeResult<i8 > { Ok(try!(self.read_f64()) as i8) }
    fn read_int(&mut self) -> DecodeResult<int> { Ok(try!(self.read_f64()) as int) }
1855

S
Sean McArthur 已提交
1856
    fn read_bool(&mut self) -> DecodeResult<bool> {
1857
        debug!("read_bool");
A
Adolfo Ochagavía 已提交
1858
        expect!(self.pop(), Boolean)
1859 1860
    }

S
Sean McArthur 已提交
1861
    fn read_f64(&mut self) -> DecodeResult<f64> {
1862
        debug!("read_f64");
S
Sean McArthur 已提交
1863 1864
        match self.pop() {
            Number(f) => Ok(f),
1865 1866
            String(s) => {
                // re: #12967.. a type w/ numeric keys (ie HashMap<uint, V> etc)
A
Adolfo Ochagavía 已提交
1867 1868
                // is going to have a string here, as per JSON spec.
                Ok(std::from_str::from_str(s.as_slice()).unwrap())
1869
            },
M
mrec 已提交
1870
            Null => Ok(f64::NAN),
A
Adolfo Ochagavía 已提交
1871
            value => Err(ExpectedError("Number".to_string(), format!("{}", value)))
1872 1873
        }
    }
1874

A
Adolfo Ochagavía 已提交
1875
    fn read_f32(&mut self) -> DecodeResult<f32> { self.read_f64().map(|x| x as f32) }
1876

S
Sean McArthur 已提交
1877 1878
    fn read_char(&mut self) -> DecodeResult<char> {
        let s = try!(self.read_str());
1879
        {
1880
            let mut it = s.as_slice().chars();
1881 1882
            match (it.next(), it.next()) {
                // exactly one character
S
Sean McArthur 已提交
1883
                (Some(c), None) => return Ok(c),
1884 1885 1886
                _ => ()
            }
        }
A
Adolfo Ochagavía 已提交
1887
        Err(ExpectedError("single character string".to_string(), format!("{}", s)))
1888 1889
    }

1890
    fn read_str(&mut self) -> DecodeResult<String> {
1891
        debug!("read_str");
A
Adolfo Ochagavía 已提交
1892
        expect!(self.pop(), String)
1893 1894
    }

S
Sean McArthur 已提交
1895 1896 1897
    fn read_enum<T>(&mut self,
                    name: &str,
                    f: |&mut Decoder| -> DecodeResult<T>) -> DecodeResult<T> {
1898
        debug!("read_enum({})", name);
1899 1900 1901 1902 1903
        f(self)
    }

    fn read_enum_variant<T>(&mut self,
                            names: &[&str],
S
Sean McArthur 已提交
1904 1905
                            f: |&mut Decoder, uint| -> DecodeResult<T>)
                            -> DecodeResult<T> {
1906
        debug!("read_enum_variant(names={})", names);
S
Sean McArthur 已提交
1907
        let name = match self.pop() {
1908
            String(s) => s,
1909
            Object(mut o) => {
1910
                let n = match o.pop(&"variant".to_string()) {
1911
                    Some(String(s)) => s,
1912
                    Some(val) => {
A
Adolfo Ochagavía 已提交
1913
                        return Err(ExpectedError("String".to_string(), format!("{}", val)))
1914 1915
                    }
                    None => {
1916
                        return Err(MissingFieldError("variant".to_string()))
1917
                    }
1918
                };
1919
                match o.pop(&"fields".to_string()) {
1920
                    Some(List(l)) => {
1921
                        for field in l.move_iter().rev() {
A
Adolfo Ochagavía 已提交
1922
                            self.stack.push(field);
1923 1924
                        }
                    },
1925
                    Some(val) => {
A
Adolfo Ochagavía 已提交
1926
                        return Err(ExpectedError("List".to_string(), format!("{}", val)))
1927 1928
                    }
                    None => {
1929
                        return Err(MissingFieldError("fields".to_string()))
1930
                    }
1931
                }
1932
                n
1933
            }
1934
            json => {
A
Adolfo Ochagavía 已提交
1935
                return Err(ExpectedError("String or Object".to_string(), format!("{}", json)))
1936
            }
1937
        };
1938
        let idx = match names.iter()
A
Adolfo Ochagavía 已提交
1939
                             .position(|n| str::eq_slice(*n, name.as_slice())) {
1940
            Some(idx) => idx,
S
Sean McArthur 已提交
1941
            None => return Err(UnknownVariantError(name))
1942 1943 1944 1945
        };
        f(self, idx)
    }

S
Sean McArthur 已提交
1946 1947
    fn read_enum_variant_arg<T>(&mut self, idx: uint, f: |&mut Decoder| -> DecodeResult<T>)
                                -> DecodeResult<T> {
1948
        debug!("read_enum_variant_arg(idx={})", idx);
1949 1950 1951 1952 1953
        f(self)
    }

    fn read_enum_struct_variant<T>(&mut self,
                                   names: &[&str],
S
Sean McArthur 已提交
1954 1955
                                   f: |&mut Decoder, uint| -> DecodeResult<T>)
                                   -> DecodeResult<T> {
1956
        debug!("read_enum_struct_variant(names={})", names);
1957 1958 1959 1960 1961 1962 1963
        self.read_enum_variant(names, f)
    }


    fn read_enum_struct_variant_field<T>(&mut self,
                                         name: &str,
                                         idx: uint,
S
Sean McArthur 已提交
1964 1965
                                         f: |&mut Decoder| -> DecodeResult<T>)
                                         -> DecodeResult<T> {
1966
        debug!("read_enum_struct_variant_field(name={}, idx={})", name, idx);
1967 1968 1969 1970 1971 1972
        self.read_enum_variant_arg(idx, f)
    }

    fn read_struct<T>(&mut self,
                      name: &str,
                      len: uint,
S
Sean McArthur 已提交
1973 1974
                      f: |&mut Decoder| -> DecodeResult<T>)
                      -> DecodeResult<T> {
1975
        debug!("read_struct(name={}, len={})", name, len);
S
Sean McArthur 已提交
1976 1977 1978
        let value = try!(f(self));
        self.pop();
        Ok(value)
1979 1980 1981 1982 1983
    }

    fn read_struct_field<T>(&mut self,
                            name: &str,
                            idx: uint,
S
Sean McArthur 已提交
1984 1985
                            f: |&mut Decoder| -> DecodeResult<T>)
                            -> DecodeResult<T> {
1986
        debug!("read_struct_field(name={}, idx={})", name, idx);
S
Sean McArthur 已提交
1987 1988
        let mut obj = try!(expect!(self.pop(), Object));

1989 1990
        let value = match obj.pop(&name.to_string()) {
            None => return Err(MissingFieldError(name.to_string())),
S
Sean McArthur 已提交
1991 1992 1993
            Some(json) => {
                self.stack.push(json);
                try!(f(self))
1994
            }
S
Sean McArthur 已提交
1995 1996 1997
        };
        self.stack.push(Object(obj));
        Ok(value)
1998 1999
    }

S
Sean McArthur 已提交
2000
    fn read_tuple<T>(&mut self, f: |&mut Decoder, uint| -> DecodeResult<T>) -> DecodeResult<T> {
2001
        debug!("read_tuple()");
2002 2003 2004
        self.read_seq(f)
    }

S
Sean McArthur 已提交
2005 2006 2007
    fn read_tuple_arg<T>(&mut self,
                         idx: uint,
                         f: |&mut Decoder| -> DecodeResult<T>) -> DecodeResult<T> {
2008
        debug!("read_tuple_arg(idx={})", idx);
2009 2010 2011 2012 2013
        self.read_seq_elt(idx, f)
    }

    fn read_tuple_struct<T>(&mut self,
                            name: &str,
S
Sean McArthur 已提交
2014 2015
                            f: |&mut Decoder, uint| -> DecodeResult<T>)
                            -> DecodeResult<T> {
2016
        debug!("read_tuple_struct(name={})", name);
2017 2018 2019 2020 2021
        self.read_tuple(f)
    }

    fn read_tuple_struct_arg<T>(&mut self,
                                idx: uint,
S
Sean McArthur 已提交
2022 2023
                                f: |&mut Decoder| -> DecodeResult<T>)
                                -> DecodeResult<T> {
2024
        debug!("read_tuple_struct_arg(idx={})", idx);
2025 2026 2027
        self.read_tuple_arg(idx, f)
    }

S
Sean McArthur 已提交
2028 2029
    fn read_option<T>(&mut self, f: |&mut Decoder, bool| -> DecodeResult<T>) -> DecodeResult<T> {
        match self.pop() {
2030 2031 2032 2033 2034
            Null => f(self, false),
            value => { self.stack.push(value); f(self, true) }
        }
    }

S
Sean McArthur 已提交
2035
    fn read_seq<T>(&mut self, f: |&mut Decoder, uint| -> DecodeResult<T>) -> DecodeResult<T> {
2036
        debug!("read_seq()");
S
Sean McArthur 已提交
2037 2038
        let list = try!(expect!(self.pop(), List));
        let len = list.len();
2039
        for v in list.move_iter().rev() {
S
Sean McArthur 已提交
2040 2041
            self.stack.push(v);
        }
2042 2043 2044
        f(self, len)
    }

S
Sean McArthur 已提交
2045 2046 2047
    fn read_seq_elt<T>(&mut self,
                       idx: uint,
                       f: |&mut Decoder| -> DecodeResult<T>) -> DecodeResult<T> {
2048
        debug!("read_seq_elt(idx={})", idx);
2049 2050 2051
        f(self)
    }

S
Sean McArthur 已提交
2052
    fn read_map<T>(&mut self, f: |&mut Decoder, uint| -> DecodeResult<T>) -> DecodeResult<T> {
2053
        debug!("read_map()");
S
Sean McArthur 已提交
2054 2055 2056 2057 2058 2059
        let obj = try!(expect!(self.pop(), Object));
        let len = obj.len();
        for (key, value) in obj.move_iter() {
            self.stack.push(value);
            self.stack.push(String(key));
        }
2060 2061 2062
        f(self, len)
    }

S
Sean McArthur 已提交
2063 2064
    fn read_map_elt_key<T>(&mut self, idx: uint, f: |&mut Decoder| -> DecodeResult<T>)
                           -> DecodeResult<T> {
2065
        debug!("read_map_elt_key(idx={})", idx);
2066 2067 2068
        f(self)
    }

S
Sean McArthur 已提交
2069 2070
    fn read_map_elt_val<T>(&mut self, idx: uint, f: |&mut Decoder| -> DecodeResult<T>)
                           -> DecodeResult<T> {
2071
        debug!("read_map_elt_val(idx={})", idx);
2072 2073 2074 2075
        f(self)
    }
}

2076
/// A trait for converting values to JSON
2077
pub trait ToJson {
2078 2079 2080
    /// Converts the value of `self` to an instance of JSON
    fn to_json(&self) -> Json;
}
2081

A
Adolfo Ochagavía 已提交
2082 2083 2084 2085 2086 2087 2088
macro_rules! to_json_impl(
    ($($t:ty), +) => (
        $(impl ToJson for $t {
            fn to_json(&self) -> Json { Number(*self as f64) }
        })+
    )
)
2089

A
Adolfo Ochagavía 已提交
2090
to_json_impl!(int, i8, i16, i32, i64, uint, u8, u16, u32, u64)
2091

A
Adolfo Ochagavía 已提交
2092 2093
impl ToJson for Json {
    fn to_json(&self) -> Json { self.clone() }
2094 2095
}

2096
impl ToJson for f32 {
M
mrec 已提交
2097
    fn to_json(&self) -> Json { (*self as f64).to_json() }
2098 2099
}

2100
impl ToJson for f64 {
M
mrec 已提交
2101 2102 2103
    fn to_json(&self) -> Json {
        match self.classify() {
            FPNaN | FPInfinite => Null,
A
Adolfo Ochagavía 已提交
2104
            _                  => Number(*self)
M
mrec 已提交
2105 2106
        }
    }
2107 2108
}

2109
impl ToJson for () {
B
Ben Striegel 已提交
2110
    fn to_json(&self) -> Json { Null }
2111 2112
}

2113
impl ToJson for bool {
B
Ben Striegel 已提交
2114
    fn to_json(&self) -> Json { Boolean(*self) }
2115 2116
}

2117
impl ToJson for String {
2118
    fn to_json(&self) -> Json { String((*self).clone()) }
2119 2120
}

2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134
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]
            #[allow(uppercase_variables)]
            fn to_json(&self) -> Json {
                match *self {
                    ($(ref $tyvar),*,) => List(vec![$($tyvar.to_json()),*])
                }
A
Adolfo Ochagavía 已提交
2135
            }
2136
        }
2137 2138 2139
    }
}

2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151
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}
2152

A
Adolfo Ochagavía 已提交
2153
impl<'a, A: ToJson> ToJson for &'a [A] {
2154 2155 2156
    fn to_json(&self) -> Json { List(self.iter().map(|elt| elt.to_json()).collect()) }
}

A
Adolfo Ochagavía 已提交
2157
impl<A: ToJson> ToJson for Vec<A> {
2158 2159 2160
    fn to_json(&self) -> Json { List(self.iter().map(|elt| elt.to_json()).collect()) }
}

A
Adolfo Ochagavía 已提交
2161
impl<A: ToJson> ToJson for TreeMap<String, A> {
B
Ben Striegel 已提交
2162
    fn to_json(&self) -> Json {
2163
        let mut d = TreeMap::new();
D
Daniel Micay 已提交
2164
        for (key, value) in self.iter() {
2165
            d.insert((*key).clone(), value.to_json());
2166
        }
A
Adolfo Ochagavía 已提交
2167
        Object(d)
2168 2169 2170
    }
}

A
Adolfo Ochagavía 已提交
2171
impl<A: ToJson> ToJson for HashMap<String, A> {
G
Graydon Hoare 已提交
2172
    fn to_json(&self) -> Json {
2173
        let mut d = TreeMap::new();
D
Daniel Micay 已提交
2174
        for (key, value) in self.iter() {
2175
            d.insert((*key).clone(), value.to_json());
G
Graydon Hoare 已提交
2176
        }
A
Adolfo Ochagavía 已提交
2177
        Object(d)
G
Graydon Hoare 已提交
2178 2179 2180
    }
}

2181
impl<A:ToJson> ToJson for Option<A> {
B
Ben Striegel 已提交
2182 2183
    fn to_json(&self) -> Json {
        match *self {
A
Adolfo Ochagavía 已提交
2184 2185
            None => Null,
            Some(ref value) => value.to_json()
2186 2187 2188 2189
        }
    }
}

2190
impl fmt::Show for Json {
2191
    /// Encodes a json value into a string
2192
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
A
Alex Crichton 已提交
2193
        self.to_writer(f).map_err(|_| fmt::WriteError)
2194
    }
2195 2196
}

A
Adolfo Ochagavía 已提交
2197 2198 2199 2200 2201 2202
impl std::from_str::FromStr for Json {
    fn from_str(s: &str) -> Option<Json> {
        from_str(s).ok()
    }
}

2203 2204
#[cfg(test)]
mod tests {
2205 2206
    extern crate test;
    use self::test::Bencher;
A
Alex Crichton 已提交
2207 2208
    use {Encodable, Decodable};
    use super::{Encoder, Decoder, Error, Boolean, Number, List, String, Null,
S
Sean McArthur 已提交
2209
                PrettyEncoder, Object, Json, from_str, ParseError, ExpectedError,
2210 2211 2212 2213 2214 2215 2216
                MissingFieldError, UnknownVariantError, DecodeResult, DecoderError,
                JsonEvent, Parser, StackElement,
                ObjectStart, ObjectEnd, ListStart, ListEnd, BooleanValue, NumberValue, StringValue,
                NullValue, SyntaxError, Key, Index, Stack,
                InvalidSyntax, InvalidNumber, EOFWhileParsingObject, EOFWhileParsingList,
                EOFWhileParsingValue, EOFWhileParsingString, KeyMustBeAString, ExpectedColon,
                TrailingCharacters};
A
Adolfo Ochagavía 已提交
2217
    use std::{f32, f64, io};
2218
    use std::collections::TreeMap;
2219

2220
    #[deriving(PartialEq, Encodable, Decodable, Show)]
2221 2222
    enum Animal {
        Dog,
2223
        Frog(String, int)
2224 2225
    }

2226
    #[deriving(PartialEq, Encodable, Decodable, Show)]
2227 2228 2229
    struct Inner {
        a: (),
        b: uint,
2230
        c: Vec<String>,
2231 2232
    }

2233
    #[deriving(PartialEq, Encodable, Decodable, Show)]
2234
    struct Outer {
K
Kevin Ballard 已提交
2235
        inner: Vec<Inner>,
2236 2237
    }

2238
    fn mk_object(items: &[(String, Json)]) -> Json {
A
Adolfo Ochagavía 已提交
2239
        let mut d = TreeMap::new();
2240

D
Daniel Micay 已提交
2241
        for item in items.iter() {
2242
            match *item {
2243
                (ref key, ref value) => { d.insert((*key).clone(), (*value).clone()); },
2244
            }
2245 2246
        };

L
Luqman Aden 已提交
2247
        Object(d)
2248 2249
    }

A
Adolfo Ochagavía 已提交
2250 2251 2252 2253 2254 2255
    #[test]
    fn test_from_str_trait() {
        let s = "null";
        assert!(::std::from_str::from_str::<Json>(s).unwrap() == from_str(s).unwrap());
    }

2256 2257
    #[test]
    fn test_write_null() {
2258
        assert_eq!(Null.to_string().into_string(), "null".to_string());
2259
        assert_eq!(Null.to_pretty_str().into_string(), "null".to_string());
2260 2261
    }

2262

2263
    #[test]
2264
    fn test_write_number() {
2265
        assert_eq!(Number(3.0).to_string().into_string(), "3".to_string());
2266
        assert_eq!(Number(3.0).to_pretty_str().into_string(), "3".to_string());
2267

2268
        assert_eq!(Number(3.1).to_string().into_string(), "3.1".to_string());
2269
        assert_eq!(Number(3.1).to_pretty_str().into_string(), "3.1".to_string());
2270

2271
        assert_eq!(Number(-1.5).to_string().into_string(), "-1.5".to_string());
2272
        assert_eq!(Number(-1.5).to_pretty_str().into_string(), "-1.5".to_string());
2273

2274
        assert_eq!(Number(0.5).to_string().into_string(), "0.5".to_string());
2275
        assert_eq!(Number(0.5).to_pretty_str().into_string(), "0.5".to_string());
M
mrec 已提交
2276

2277
        assert_eq!(Number(f64::NAN).to_string().into_string(), "null".to_string());
M
mrec 已提交
2278 2279
        assert_eq!(Number(f64::NAN).to_pretty_str().into_string(), "null".to_string());

2280
        assert_eq!(Number(f64::INFINITY).to_string().into_string(), "null".to_string());
M
mrec 已提交
2281 2282
        assert_eq!(Number(f64::INFINITY).to_pretty_str().into_string(), "null".to_string());

2283
        assert_eq!(Number(f64::NEG_INFINITY).to_string().into_string(), "null".to_string());
M
mrec 已提交
2284
        assert_eq!(Number(f64::NEG_INFINITY).to_pretty_str().into_string(), "null".to_string());
2285 2286 2287 2288
    }

    #[test]
    fn test_write_str() {
2289
        assert_eq!(String("".to_string()).to_string().into_string(), "\"\"".to_string());
2290
        assert_eq!(String("".to_string()).to_pretty_str().into_string(), "\"\"".to_string());
2291

2292
        assert_eq!(String("foo".to_string()).to_string().into_string(), "\"foo\"".to_string());
2293
        assert_eq!(String("foo".to_string()).to_pretty_str().into_string(), "\"foo\"".to_string());
2294 2295 2296 2297
    }

    #[test]
    fn test_write_bool() {
2298
        assert_eq!(Boolean(true).to_string().into_string(), "true".to_string());
2299
        assert_eq!(Boolean(true).to_pretty_str().into_string(), "true".to_string());
2300

2301
        assert_eq!(Boolean(false).to_string().into_string(), "false".to_string());
2302
        assert_eq!(Boolean(false).to_pretty_str().into_string(), "false".to_string());
2303 2304 2305 2306
    }

    #[test]
    fn test_write_list() {
2307
        assert_eq!(List(vec![]).to_string().into_string(), "[]".to_string());
2308
        assert_eq!(List(vec![]).to_pretty_str().into_string(), "[]".to_string());
2309

2310
        assert_eq!(List(vec![Boolean(true)]).to_string().into_string(), "[true]".to_string());
2311
        assert_eq!(
2312
            List(vec![Boolean(true)]).to_pretty_str().into_string(),
2313
            "\
2314 2315
            [\n  \
                true\n\
2316
            ]".to_string()
2317
        );
2318

K
Kevin Ballard 已提交
2319
        let long_test_list = List(vec![
2320 2321
            Boolean(false),
            Null,
2322
            List(vec![String("foo\nbar".to_string()), Number(3.5)])]);
2323

2324
        assert_eq!(long_test_list.to_string().into_string(),
2325
            "[false,null,[\"foo\\nbar\",3.5]]".to_string());
2326
        assert_eq!(
2327
            long_test_list.to_pretty_str().into_string(),
2328
            "\
2329 2330 2331 2332 2333 2334 2335
            [\n  \
                false,\n  \
                null,\n  \
                [\n    \
                    \"foo\\nbar\",\n    \
                    3.5\n  \
                ]\n\
2336
            ]".to_string()
2337 2338 2339
        );
    }

2340
    #[test]
2341
    fn test_write_object() {
2342
        assert_eq!(mk_object([]).to_string().into_string(), "{}".to_string());
2343
        assert_eq!(mk_object([]).to_pretty_str().into_string(), "{}".to_string());
2344

2345
        assert_eq!(
2346
            mk_object([
2347
                ("a".to_string(), Boolean(true))
2348
            ]).to_string().into_string(),
2349
            "{\"a\":true}".to_string()
2350
        );
2351
        assert_eq!(
2352
            mk_object([("a".to_string(), Boolean(true))]).to_pretty_str(),
2353
            "\
2354 2355
            {\n  \
                \"a\": true\n\
2356
            }".to_string()
2357 2358
        );

2359
        let complex_obj = mk_object([
2360 2361 2362
                ("b".to_string(), List(vec![
                    mk_object([("c".to_string(), String("\x0c\r".to_string()))]),
                    mk_object([("d".to_string(), String("".to_string()))])
2363
                ]))
2364 2365 2366
            ]);

        assert_eq!(
2367
            complex_obj.to_string().into_string(),
2368
            "{\
2369 2370 2371 2372
                \"b\":[\
                    {\"c\":\"\\f\\r\"},\
                    {\"d\":\"\"}\
                ]\
2373
            }".to_string()
2374 2375
        );
        assert_eq!(
2376
            complex_obj.to_pretty_str().into_string(),
2377
            "\
2378 2379 2380 2381 2382 2383 2384 2385 2386
            {\n  \
                \"b\": [\n    \
                    {\n      \
                        \"c\": \"\\f\\r\"\n    \
                    },\n    \
                    {\n      \
                        \"d\": \"\"\n    \
                    }\n  \
                ]\n\
2387
            }".to_string()
2388
        );
2389

E
Erick Tryzelaar 已提交
2390
        let a = mk_object([
2391 2392 2393 2394
            ("a".to_string(), Boolean(true)),
            ("b".to_string(), List(vec![
                mk_object([("c".to_string(), String("\x0c\r".to_string()))]),
                mk_object([("d".to_string(), String("".to_string()))])
2395
            ]))
G
Graydon Hoare 已提交
2396
        ]);
2397

2398 2399
        // We can't compare the strings directly because the object fields be
        // printed in a different order.
2400
        assert_eq!(a.clone(), from_str(a.to_string().as_slice()).unwrap());
2401 2402
        assert_eq!(a.clone(),
                   from_str(a.to_pretty_str().as_slice()).unwrap());
2403 2404
    }

2405
    fn with_str_writer(f: |&mut io::Writer|) -> String {
A
Alex Crichton 已提交
2406
        use std::io::MemWriter;
A
Alex Crichton 已提交
2407 2408
        use std::str;

2409 2410
        let mut m = MemWriter::new();
        f(&mut m as &mut io::Writer);
2411
        str::from_utf8(m.unwrap().as_slice()).unwrap().to_string()
A
Alex Crichton 已提交
2412 2413
    }

2414
    #[test]
2415
    fn test_write_enum() {
2416
        let animal = Dog;
2417
        assert_eq!(
A
Adolfo Ochagavía 已提交
2418 2419
            with_str_writer(|writer| {
                let mut encoder = Encoder::new(writer);
S
Sean McArthur 已提交
2420
                animal.encode(&mut encoder).unwrap();
2421
            }),
2422
            "\"Dog\"".to_string()
2423 2424
        );
        assert_eq!(
A
Adolfo Ochagavía 已提交
2425 2426
            with_str_writer(|writer| {
                let mut encoder = PrettyEncoder::new(writer);
S
Sean McArthur 已提交
2427
                animal.encode(&mut encoder).unwrap();
2428
            }),
2429
            "\"Dog\"".to_string()
2430
        );
2431

2432
        let animal = Frog("Henry".to_string(), 349);
2433
        assert_eq!(
A
Adolfo Ochagavía 已提交
2434 2435
            with_str_writer(|writer| {
                let mut encoder = Encoder::new(writer);
S
Sean McArthur 已提交
2436
                animal.encode(&mut encoder).unwrap();
2437
            }),
2438
            "{\"variant\":\"Frog\",\"fields\":[\"Henry\",349]}".to_string()
2439 2440
        );
        assert_eq!(
A
Adolfo Ochagavía 已提交
2441 2442
            with_str_writer(|writer| {
                let mut encoder = PrettyEncoder::new(writer);
S
Sean McArthur 已提交
2443
                animal.encode(&mut encoder).unwrap();
2444
            }),
2445
            "\
2446 2447
            [\n  \
                \"Frog\",\n  \
2448 2449
                \"Henry\",\n  \
                349\n\
2450
            ]".to_string()
2451
        );
2452 2453 2454
    }

    #[test]
2455
    fn test_write_some() {
2456
        let value = Some("jodhpurs".to_string());
A
Adolfo Ochagavía 已提交
2457 2458
        let s = with_str_writer(|writer| {
            let mut encoder = Encoder::new(writer);
S
Sean McArthur 已提交
2459
            value.encode(&mut encoder).unwrap();
2460
        });
2461
        assert_eq!(s, "\"jodhpurs\"".to_string());
2462

2463
        let value = Some("jodhpurs".to_string());
A
Adolfo Ochagavía 已提交
2464 2465
        let s = with_str_writer(|writer| {
            let mut encoder = PrettyEncoder::new(writer);
S
Sean McArthur 已提交
2466
            value.encode(&mut encoder).unwrap();
2467
        });
2468
        assert_eq!(s, "\"jodhpurs\"".to_string());
2469 2470
    }

2471
    #[test]
2472
    fn test_write_none() {
2473
        let value: Option<String> = None;
A
Adolfo Ochagavía 已提交
2474 2475
        let s = with_str_writer(|writer| {
            let mut encoder = Encoder::new(writer);
S
Sean McArthur 已提交
2476
            value.encode(&mut encoder).unwrap();
2477
        });
2478
        assert_eq!(s, "null".to_string());
J
John Clements 已提交
2479

A
Adolfo Ochagavía 已提交
2480 2481
        let s = with_str_writer(|writer| {
            let mut encoder = Encoder::new(writer);
S
Sean McArthur 已提交
2482
            value.encode(&mut encoder).unwrap();
2483
        });
2484
        assert_eq!(s, "null".to_string());
2485 2486
    }

2487
    #[test]
2488
    fn test_trailing_characters() {
2489 2490 2491 2492 2493 2494
        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)));
2495 2496 2497 2498
    }

    #[test]
    fn test_read_identifiers() {
2499 2500 2501 2502 2503 2504
        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)));
2505

E
Erick Tryzelaar 已提交
2506 2507 2508 2509 2510 2511
        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)));
2512 2513
    }

2514 2515
    #[test]
    fn test_decode_identifiers() {
2516
        let v: () = super::decode("null").unwrap();
2517 2518
        assert_eq!(v, ());

2519
        let v: bool = super::decode("true").unwrap();
2520 2521
        assert_eq!(v, true);

2522
        let v: bool = super::decode("false").unwrap();
2523 2524 2525
        assert_eq!(v, false);
    }

2526
    #[test]
2527
    fn test_read_number() {
2528 2529
        assert_eq!(from_str("+"),   Err(SyntaxError(InvalidSyntax, 1, 1)));
        assert_eq!(from_str("."),   Err(SyntaxError(InvalidSyntax, 1, 1)));
M
mrec 已提交
2530
        assert_eq!(from_str("NaN"), Err(SyntaxError(InvalidSyntax, 1, 1)));
2531 2532 2533 2534 2535
        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)));
2536

D
Daniel Micay 已提交
2537 2538 2539 2540 2541 2542 2543 2544
        assert_eq!(from_str("3"), Ok(Number(3.0)));
        assert_eq!(from_str("3.1"), Ok(Number(3.1)));
        assert_eq!(from_str("-1.2"), Ok(Number(-1.2)));
        assert_eq!(from_str("0.4"), Ok(Number(0.4)));
        assert_eq!(from_str("0.4e5"), Ok(Number(0.4e5)));
        assert_eq!(from_str("0.4e+15"), Ok(Number(0.4e15)));
        assert_eq!(from_str("0.4e-01"), Ok(Number(0.4e-01)));
        assert_eq!(from_str(" 3 "), Ok(Number(3.0)));
2545 2546
    }

2547 2548
    #[test]
    fn test_decode_numbers() {
2549
        let v: f64 = super::decode("3").unwrap();
D
Daniel Micay 已提交
2550
        assert_eq!(v, 3.0);
2551

2552
        let v: f64 = super::decode("3.1").unwrap();
D
Daniel Micay 已提交
2553
        assert_eq!(v, 3.1);
2554

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

2558
        let v: f64 = super::decode("0.4").unwrap();
D
Daniel Micay 已提交
2559
        assert_eq!(v, 0.4);
2560

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

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

2567
        let v: f64 = super::decode("0.4e-01").unwrap();
D
Daniel Micay 已提交
2568
        assert_eq!(v, 0.4e-01);
2569 2570
    }

G
Gary Linscott 已提交
2571
    #[test]
2572
    fn test_read_str() {
2573 2574 2575
        assert_eq!(from_str("\""),    Err(SyntaxError(EOFWhileParsingString, 1, 2)));
        assert_eq!(from_str("\"lol"), Err(SyntaxError(EOFWhileParsingString, 1, 5)));

2576 2577 2578 2579 2580 2581 2582 2583 2584 2585
        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("\u12ab".to_string())));
        assert_eq!(from_str("\"\\uAB12\""), Ok(String("\uAB12".to_string())));
2586 2587
    }

2588
    #[test]
2589
    fn test_decode_str() {
2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600
        let s = [("\"\"", ""),
                 ("\"foo\"", "foo"),
                 ("\"\\\"\"", "\""),
                 ("\"\\b\"", "\x08"),
                 ("\"\\n\"", "\n"),
                 ("\"\\r\"", "\r"),
                 ("\"\\t\"", "\t"),
                 ("\"\\u12ab\"", "\u12ab"),
                 ("\"\\uAB12\"", "\uAB12")];

        for &(i, o) in s.iter() {
2601
            let v: String = super::decode(i).unwrap();
2602 2603
            assert_eq!(v.as_slice(), o);
        }
2604 2605
    }

2606
    #[test]
2607
    fn test_read_list() {
2608 2609 2610 2611 2612
        assert_eq!(from_str("["),     Err(SyntaxError(EOFWhileParsingValue, 1, 2)));
        assert_eq!(from_str("[1"),    Err(SyntaxError(EOFWhileParsingList,  1, 3)));
        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)));
2613

K
Kevin Ballard 已提交
2614 2615 2616 2617 2618
        assert_eq!(from_str("[]"), Ok(List(vec![])));
        assert_eq!(from_str("[ ]"), Ok(List(vec![])));
        assert_eq!(from_str("[true]"), Ok(List(vec![Boolean(true)])));
        assert_eq!(from_str("[ false ]"), Ok(List(vec![Boolean(false)])));
        assert_eq!(from_str("[null]"), Ok(List(vec![Null])));
E
Erick Tryzelaar 已提交
2619
        assert_eq!(from_str("[3, 1]"),
K
Kevin Ballard 已提交
2620
                     Ok(List(vec![Number(3.0), Number(1.0)])));
E
Erick Tryzelaar 已提交
2621
        assert_eq!(from_str("\n[3, 2]\n"),
K
Kevin Ballard 已提交
2622
                     Ok(List(vec![Number(3.0), Number(2.0)])));
E
Erick Tryzelaar 已提交
2623
        assert_eq!(from_str("[2, [4, 1]]"),
K
Kevin Ballard 已提交
2624
               Ok(List(vec![Number(2.0), List(vec![Number(4.0), Number(1.0)])])));
2625 2626
    }

2627 2628
    #[test]
    fn test_decode_list() {
2629
        let v: Vec<()> = super::decode("[]").unwrap();
K
Kevin Ballard 已提交
2630
        assert_eq!(v, vec![]);
2631

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

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

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

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

2645
    #[test]
2646
    fn test_read_object() {
2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658
        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)));
2659

E
Erick Tryzelaar 已提交
2660 2661
        assert_eq!(from_str("{}").unwrap(), mk_object([]));
        assert_eq!(from_str("{\"a\": 3}").unwrap(),
2662
                  mk_object([("a".to_string(), Number(3.0))]));
2663

E
Erick Tryzelaar 已提交
2664 2665
        assert_eq!(from_str(
                      "{ \"a\": null, \"b\" : true }").unwrap(),
E
Erick Tryzelaar 已提交
2666
                  mk_object([
2667 2668
                      ("a".to_string(), Null),
                      ("b".to_string(), Boolean(true))]));
E
Erick Tryzelaar 已提交
2669
        assert_eq!(from_str("\n{ \"a\": null, \"b\" : true }\n").unwrap(),
E
Erick Tryzelaar 已提交
2670
                  mk_object([
2671 2672
                      ("a".to_string(), Null),
                      ("b".to_string(), Boolean(true))]));
E
Erick Tryzelaar 已提交
2673 2674
        assert_eq!(from_str(
                      "{\"a\" : 1.0 ,\"b\": [ true ]}").unwrap(),
E
Erick Tryzelaar 已提交
2675
                  mk_object([
2676 2677
                      ("a".to_string(), Number(1.0)),
                      ("b".to_string(), List(vec![Boolean(true)]))
2678
                  ]));
E
Erick Tryzelaar 已提交
2679
        assert_eq!(from_str(
2680 2681 2682 2683 2684 2685 2686 2687
                      "{\
                          \"a\": 1.0, \
                          \"b\": [\
                              true,\
                              \"foo\\nbar\", \
                              { \"c\": {\"d\": null} } \
                          ]\
                      }").unwrap(),
E
Erick Tryzelaar 已提交
2688
                  mk_object([
2689 2690
                      ("a".to_string(), Number(1.0)),
                      ("b".to_string(), List(vec![
B
Ben Striegel 已提交
2691
                          Boolean(true),
2692
                          String("foo\nbar".to_string()),
E
Erick Tryzelaar 已提交
2693
                          mk_object([
2694
                              ("c".to_string(), mk_object([("d".to_string(), Null)]))
2695 2696
                          ])
                      ]))
2697
                  ]));
2698 2699
    }

2700
    #[test]
2701
    fn test_decode_struct() {
2702
        let s = "{
2703 2704 2705
            \"inner\": [
                { \"a\": null, \"b\": 2, \"c\": [\"abc\", \"xyz\"] }
            ]
2706
        }";
2707 2708

        let v: Outer = super::decode(s).unwrap();
2709 2710 2711
        assert_eq!(
            v,
            Outer {
K
Kevin Ballard 已提交
2712
                inner: vec![
2713
                    Inner { a: (), b: 2, c: vec!["abc".to_string(), "xyz".to_string()] }
2714 2715 2716 2717 2718
                ]
            }
        );
    }

M
mrec 已提交
2719 2720 2721 2722 2723 2724 2725
    #[deriving(Decodable)]
    struct FloatStruct {
        f: f64,
        a: Vec<f64>
    }
    #[test]
    fn test_decode_struct_with_nan() {
2726 2727 2728 2729 2730
        let s = "{\"f\":null,\"a\":[null,123]}";
        let obj: FloatStruct = super::decode(s).unwrap();
        assert!(obj.f.is_nan());
        assert!(obj.a.get(0).is_nan());
        assert_eq!(obj.a.get(1), &123f64);
M
mrec 已提交
2731 2732
    }

2733 2734
    #[test]
    fn test_decode_option() {
2735
        let value: Option<String> = super::decode("null").unwrap();
2736 2737
        assert_eq!(value, None);

2738
        let value: Option<String> = super::decode("\"jodhpurs\"").unwrap();
2739
        assert_eq!(value, Some("jodhpurs".to_string()));
2740 2741
    }

2742
    #[test]
2743
    fn test_decode_enum() {
2744
        let value: Animal = super::decode("\"Dog\"").unwrap();
2745 2746
        assert_eq!(value, Dog);

2747
        let s = "{\"variant\":\"Frog\",\"fields\":[\"Henry\",349]}";
2748
        let value: Animal = super::decode(s).unwrap();
2749
        assert_eq!(value, Frog("Henry".to_string(), 349));
2750 2751
    }

2752
    #[test]
2753
    fn test_decode_map() {
2754
        let s = "{\"a\": \"Dog\", \"b\": {\"variant\":\"Frog\",\
2755
                  \"fields\":[\"Henry\", 349]}}";
2756
        let mut map: TreeMap<String, Animal> = super::decode(s).unwrap();
2757

2758 2759
        assert_eq!(map.pop(&"a".to_string()), Some(Dog));
        assert_eq!(map.pop(&"b".to_string()), Some(Frog("Henry".to_string(), 349)));
2760 2761
    }

2762
    #[test]
2763
    fn test_multiline_errors() {
E
Erick Tryzelaar 已提交
2764
        assert_eq!(from_str("{\n  \"foo\":\n \"bar\""),
2765
            Err(SyntaxError(EOFWhileParsingObject, 3u, 8u)));
2766
    }
2767 2768

    #[deriving(Decodable)]
M
mrec 已提交
2769
    #[allow(dead_code)]
2770 2771 2772
    struct DecodeStruct {
        x: f64,
        y: bool,
2773
        z: String,
K
Kevin Ballard 已提交
2774
        w: Vec<DecodeStruct>
2775 2776 2777 2778
    }
    #[deriving(Decodable)]
    enum DecodeEnum {
        A(f64),
2779
        B(String)
2780
    }
2781 2782
    fn check_err<T: Decodable<Decoder, DecoderError>>(to_parse: &'static str,
                                                      expected: DecoderError) {
S
Sean McArthur 已提交
2783
        let res: DecodeResult<T> = match from_str(to_parse) {
2784
            Err(e) => Err(ParseError(e)),
S
Sean McArthur 已提交
2785 2786
            Ok(json) => Decodable::decode(&mut Decoder::new(json))
        };
2787
        match res {
S
Sean McArthur 已提交
2788 2789
            Ok(_) => fail!("`{}` parsed & decoded ok, expecting error `{}`",
                              to_parse, expected),
2790
            Err(ParseError(e)) => fail!("`{}` is not valid json: {}",
S
Sean McArthur 已提交
2791
                                           to_parse, e),
2792
            Err(e) => {
S
Sean McArthur 已提交
2793
                assert_eq!(e, expected);
2794 2795 2796 2797
            }
        }
    }
    #[test]
L
Luqman Aden 已提交
2798
    #[ignore] // FIXME(#15763)
2799
    fn test_decode_errors_struct() {
2800
        check_err::<DecodeStruct>("[]", ExpectedError("Object".to_string(), "[]".to_string()));
2801
        check_err::<DecodeStruct>("{\"x\": true, \"y\": true, \"z\": \"\", \"w\": []}",
2802
                                  ExpectedError("Number".to_string(), "true".to_string()));
2803
        check_err::<DecodeStruct>("{\"x\": 1, \"y\": [], \"z\": \"\", \"w\": []}",
2804
                                  ExpectedError("Boolean".to_string(), "[]".to_string()));
2805
        check_err::<DecodeStruct>("{\"x\": 1, \"y\": true, \"z\": {}, \"w\": []}",
2806
                                  ExpectedError("String".to_string(), "{}".to_string()));
2807
        check_err::<DecodeStruct>("{\"x\": 1, \"y\": true, \"z\": \"\", \"w\": null}",
2808
                                  ExpectedError("List".to_string(), "null".to_string()));
2809
        check_err::<DecodeStruct>("{\"x\": 1, \"y\": true, \"z\": \"\"}",
2810
                                  MissingFieldError("w".to_string()));
2811 2812 2813 2814
    }
    #[test]
    fn test_decode_errors_enum() {
        check_err::<DecodeEnum>("{}",
2815
                                MissingFieldError("variant".to_string()));
2816
        check_err::<DecodeEnum>("{\"variant\": 1}",
2817
                                ExpectedError("String".to_string(), "1".to_string()));
2818
        check_err::<DecodeEnum>("{\"variant\": \"A\"}",
2819
                                MissingFieldError("fields".to_string()));
2820
        check_err::<DecodeEnum>("{\"variant\": \"A\", \"fields\": null}",
2821
                                ExpectedError("List".to_string(), "null".to_string()));
2822
        check_err::<DecodeEnum>("{\"variant\": \"C\", \"fields\": []}",
2823
                                UnknownVariantError("C".to_string()));
2824
    }
2825 2826 2827 2828

    #[test]
    fn test_find(){
        let json_value = from_str("{\"dog\" : \"cat\"}").unwrap();
2829
        let found_str = json_value.find(&"dog".to_string());
2830
        assert!(found_str.is_some() && found_str.unwrap().as_string().unwrap() == "cat");
2831 2832 2833 2834 2835
    }

    #[test]
    fn test_find_path(){
        let json_value = from_str("{\"dog\":{\"cat\": {\"mouse\" : \"cheese\"}}}").unwrap();
2836 2837
        let found_str = json_value.find_path(&[&"dog".to_string(),
                                             &"cat".to_string(), &"mouse".to_string()]);
2838
        assert!(found_str.is_some() && found_str.unwrap().as_string().unwrap() == "cheese");
2839 2840 2841 2842 2843
    }

    #[test]
    fn test_search(){
        let json_value = from_str("{\"dog\":{\"cat\": {\"mouse\" : \"cheese\"}}}").unwrap();
2844
        let found_str = json_value.search(&"mouse".to_string()).and_then(|j| j.as_string());
2845
        assert!(found_str.is_some());
2846
        assert!(found_str.unwrap() == "cheese");
2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876
    }

    #[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]
    fn test_is_list(){
        let json_value = from_str("[1, 2, 3]").unwrap();
        assert!(json_value.is_list());
    }

    #[test]
    fn test_as_list(){
        let json_value = from_str("[1, 2, 3]").unwrap();
        let json_list = json_value.as_list();
        let expected_length = 3;
        assert!(json_list.is_some() && json_list.unwrap().len() == expected_length);
    }

    #[test]
2877
    fn test_is_string(){
2878
        let json_value = from_str("\"dog\"").unwrap();
2879
        assert!(json_value.is_string());
2880 2881 2882
    }

    #[test]
2883
    fn test_as_string(){
2884
        let json_value = from_str("\"dog\"").unwrap();
2885
        let json_str = json_value.as_string();
2886
        let expected_str = "dog";
2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930
        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]
    fn test_as_number(){
        let json_value = from_str("12").unwrap();
        let json_num = json_value.as_number();
        let expected_num = 12f64;
        assert!(json_num.is_some() && json_num.unwrap() == expected_num);
    }

    #[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);
    }
2931 2932 2933 2934 2935 2936

    #[test]
    fn test_encode_hashmap_with_numeric_key() {
        use std::str::from_utf8;
        use std::io::Writer;
        use std::io::MemWriter;
2937
        use std::collections::HashMap;
2938 2939 2940 2941 2942
        let mut hm: HashMap<uint, bool> = HashMap::new();
        hm.insert(1, true);
        let mut mem_buf = MemWriter::new();
        {
            let mut encoder = Encoder::new(&mut mem_buf as &mut io::Writer);
S
Sean McArthur 已提交
2943
            hm.encode(&mut encoder).unwrap();
2944 2945
        }
        let bytes = mem_buf.unwrap();
S
Steven Fackler 已提交
2946
        let json_str = from_utf8(bytes.as_slice()).unwrap();
2947
        match from_str(json_str) {
2948
            Err(_) => fail!("Unable to parse json_str: {}", json_str),
2949 2950 2951 2952 2953 2954 2955 2956
            _ => {} // it parsed and we are good to go
        }
    }
    #[test]
    fn test_prettyencode_hashmap_with_numeric_key() {
        use std::str::from_utf8;
        use std::io::Writer;
        use std::io::MemWriter;
2957
        use std::collections::HashMap;
2958 2959 2960 2961 2962
        let mut hm: HashMap<uint, bool> = HashMap::new();
        hm.insert(1, true);
        let mut mem_buf = MemWriter::new();
        {
            let mut encoder = PrettyEncoder::new(&mut mem_buf as &mut io::Writer);
2963
            hm.encode(&mut encoder).unwrap()
2964 2965
        }
        let bytes = mem_buf.unwrap();
S
Steven Fackler 已提交
2966
        let json_str = from_utf8(bytes.as_slice()).unwrap();
2967
        match from_str(json_str) {
2968
            Err(_) => fail!("Unable to parse json_str: {}", json_str),
2969 2970 2971 2972 2973
            _ => {} // it parsed and we are good to go
        }
    }
    #[test]
    fn test_hashmap_with_numeric_key_can_handle_double_quote_delimited_key() {
2974
        use std::collections::HashMap;
2975 2976 2977
        use Decodable;
        let json_str = "{\"1\":true}";
        let json_obj = match from_str(json_str) {
2978
            Err(_) => fail!("Unable to parse json_str: {}", json_str),
2979 2980 2981
            Ok(o) => o
        };
        let mut decoder = Decoder::new(json_obj);
S
Sean McArthur 已提交
2982
        let _hm: HashMap<uint, bool> = Decodable::decode(&mut decoder).unwrap();
2983
    }
2984

2985 2986
    fn assert_stream_equal(src: &str,
                           expected: Vec<(JsonEvent, Vec<StackElement>)>) {
2987 2988 2989 2990 2991 2992 2993
        let mut parser = Parser::new(src.chars());
        let mut i = 0;
        loop {
            let evt = match parser.next() {
                Some(e) => e,
                None => { break; }
            };
2994
            let (ref expected_evt, ref expected_stack) = *expected.get(i);
2995 2996 2997 2998 2999 3000 3001 3002
            if !parser.stack().is_equal_to(expected_stack.as_slice()) {
                fail!("Parser stack is not equal to {}", expected_stack);
            }
            assert_eq!(&evt, expected_evt);
            i+=1;
        }
    }
    #[test]
3003
    #[ignore(cfg(target_word_size = "32"))] // FIXME(#14064)
3004 3005 3006
    fn test_streaming_parser() {
        assert_stream_equal(
            r#"{ "foo":"bar", "array" : [0, 1, 2,3 ,4,5], "idents":[null,true,false]}"#,
3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023
            vec![
                (ObjectStart,             vec![]),
                  (StringValue("bar".to_string()),   vec![Key("foo")]),
                  (ListStart,             vec![Key("array")]),
                    (NumberValue(0.0),    vec![Key("array"), Index(0)]),
                    (NumberValue(1.0),    vec![Key("array"), Index(1)]),
                    (NumberValue(2.0),    vec![Key("array"), Index(2)]),
                    (NumberValue(3.0),    vec![Key("array"), Index(3)]),
                    (NumberValue(4.0),    vec![Key("array"), Index(4)]),
                    (NumberValue(5.0),    vec![Key("array"), Index(5)]),
                  (ListEnd,               vec![Key("array")]),
                  (ListStart,             vec![Key("idents")]),
                    (NullValue,           vec![Key("idents"), Index(0)]),
                    (BooleanValue(true),  vec![Key("idents"), Index(1)]),
                    (BooleanValue(false), vec![Key("idents"), Index(2)]),
                  (ListEnd,               vec![Key("idents")]),
                (ObjectEnd,               vec![]),
3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037
            ]
        );
    }
    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,
            }
        }
    }
    #[test]
3038
    #[ignore(cfg(target_word_size = "32"))] // FIXME(#14064)
3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053
    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)));

        assert_stream_equal(
            "{}",
3054
            vec![(ObjectStart, vec![]), (ObjectEnd, vec![])]
3055 3056 3057
        );
        assert_stream_equal(
            "{\"a\": 3}",
3058 3059 3060 3061
            vec![
                (ObjectStart,        vec![]),
                  (NumberValue(3.0), vec![Key("a")]),
                (ObjectEnd,          vec![]),
3062 3063 3064 3065
            ]
        );
        assert_stream_equal(
            "{ \"a\": null, \"b\" : true }",
3066 3067 3068 3069 3070
            vec![
                (ObjectStart,           vec![]),
                  (NullValue,           vec![Key("a")]),
                  (BooleanValue(true),  vec![Key("b")]),
                (ObjectEnd,             vec![]),
3071 3072 3073 3074
            ]
        );
        assert_stream_equal(
            "{\"a\" : 1.0 ,\"b\": [ true ]}",
3075 3076 3077 3078 3079 3080 3081
            vec![
                (ObjectStart,           vec![]),
                  (NumberValue(1.0),    vec![Key("a")]),
                  (ListStart,           vec![Key("b")]),
                    (BooleanValue(true),vec![Key("b"), Index(0)]),
                  (ListEnd,             vec![Key("b")]),
                (ObjectEnd,             vec![]),
3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092
            ]
        );
        assert_stream_equal(
            r#"{
                "a": 1.0,
                "b": [
                    true,
                    "foo\nbar",
                    { "c": {"d": null} }
                ]
            }"#,
3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105
            vec![
                (ObjectStart,                   vec![]),
                  (NumberValue(1.0),            vec![Key("a")]),
                  (ListStart,                   vec![Key("b")]),
                    (BooleanValue(true),        vec![Key("b"), Index(0)]),
                    (StringValue("foo\nbar".to_string()),  vec![Key("b"), Index(1)]),
                    (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)]),
                  (ListEnd,                     vec![Key("b")]),
                (ObjectEnd,                     vec![]),
3106 3107 3108 3109
            ]
        );
    }
    #[test]
3110
    #[ignore(cfg(target_word_size = "32"))] // FIXME(#14064)
3111 3112 3113
    fn test_read_list_streaming() {
        assert_stream_equal(
            "[]",
3114 3115 3116
            vec![
                (ListStart, vec![]),
                (ListEnd,   vec![]),
3117 3118 3119 3120
            ]
        );
        assert_stream_equal(
            "[ ]",
3121 3122 3123
            vec![
                (ListStart, vec![]),
                (ListEnd,   vec![]),
3124 3125 3126 3127
            ]
        );
        assert_stream_equal(
            "[true]",
3128 3129 3130 3131
            vec![
                (ListStart,              vec![]),
                    (BooleanValue(true), vec![Index(0)]),
                (ListEnd,                vec![]),
3132 3133 3134 3135
            ]
        );
        assert_stream_equal(
            "[ false ]",
3136 3137 3138 3139
            vec![
                (ListStart,               vec![]),
                    (BooleanValue(false), vec![Index(0)]),
                (ListEnd,                 vec![]),
3140 3141 3142 3143
            ]
        );
        assert_stream_equal(
            "[null]",
3144 3145 3146 3147
            vec![
                (ListStart,     vec![]),
                    (NullValue, vec![Index(0)]),
                (ListEnd,       vec![]),
3148 3149 3150 3151
            ]
        );
        assert_stream_equal(
            "[3, 1]",
3152 3153 3154 3155 3156
            vec![
                (ListStart,     vec![]),
                    (NumberValue(3.0), vec![Index(0)]),
                    (NumberValue(1.0), vec![Index(1)]),
                (ListEnd,       vec![]),
3157 3158 3159 3160
            ]
        );
        assert_stream_equal(
            "\n[3, 2]\n",
3161 3162 3163 3164 3165
            vec![
                (ListStart,     vec![]),
                    (NumberValue(3.0), vec![Index(0)]),
                    (NumberValue(2.0), vec![Index(1)]),
                (ListEnd,       vec![]),
3166 3167 3168 3169
            ]
        );
        assert_stream_equal(
            "[2, [4, 1]]",
3170 3171 3172 3173 3174 3175 3176 3177
            vec![
                (ListStart,                 vec![]),
                    (NumberValue(2.0),      vec![Index(0)]),
                    (ListStart,             vec![Index(1)]),
                        (NumberValue(4.0),  vec![Index(1), Index(0)]),
                        (NumberValue(1.0),  vec![Index(1), Index(1)]),
                    (ListEnd,               vec![Index(1)]),
                (ListEnd,                   vec![]),
3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230
            ]
        );

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

        assert_eq!(from_str("["),     Err(SyntaxError(EOFWhileParsingValue, 1, 2)));
        assert_eq!(from_str("[1"),    Err(SyntaxError(EOFWhileParsingList,  1, 3)));
        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);
        assert!(stack.is_equal_to([Index(1)]));
        assert!(stack.starts_with([Index(1)]));
        assert!(stack.ends_with([Index(1)]));
        assert!(stack.last_is_index());
        assert!(stack.get(0) == Index(1));

3231
        stack.push_key("foo".to_string());
3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242

        assert!(stack.len() == 2);
        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")]));
        assert!(!stack.last_is_index());
        assert!(stack.get(0) == Index(1));
        assert!(stack.get(1) == Key("foo"));

3243
        stack.push_key("bar".to_string());
3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270

        assert!(stack.len() == 3);
        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")]));
        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);
        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")]));
        assert!(!stack.last_is_index());
        assert!(stack.get(0) == Index(1));
        assert!(stack.get(1) == Key("foo"));
    }

3271 3272
    #[test]
    fn test_to_json() {
3273
        use std::collections::{HashMap,TreeMap};
3274 3275 3276 3277 3278 3279 3280 3281
        use super::ToJson;

        let list2 = List(vec!(Number(1.0_f64), Number(2.0_f64)));
        let list3 = List(vec!(Number(1.0f64), Number(2.0f64), Number(3.0f64)));
        let object = {
            let mut tree_map = TreeMap::new();
            tree_map.insert("a".to_string(), Number(1.0_f64));
            tree_map.insert("b".to_string(), Number(2.0_f64));
A
Adolfo Ochagavía 已提交
3282
            Object(tree_map)
3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299
        };

        assert_eq!(list2.to_json(), list2);
        assert_eq!(object.to_json(), object);
        assert_eq!(3_i.to_json(), Number(3.0_f64));
        assert_eq!(4_i8.to_json(), Number(4.0_f64));
        assert_eq!(5_i16.to_json(), Number(5.0_f64));
        assert_eq!(6_i32.to_json(), Number(6.0_f64));
        assert_eq!(7_i64.to_json(), Number(7.0_f64));
        assert_eq!(8_u.to_json(), Number(8.0_f64));
        assert_eq!(9_u8.to_json(), Number(9.0_f64));
        assert_eq!(10_u16.to_json(), Number(10.0_f64));
        assert_eq!(11_u32.to_json(), Number(11.0_f64));
        assert_eq!(12_u64.to_json(), Number(12.0_f64));
        assert_eq!(13.0_f32.to_json(), Number(13.0_f64));
        assert_eq!(14.0_f64.to_json(), Number(14.0_f64));
        assert_eq!(().to_json(), Null);
M
mrec 已提交
3300 3301
        assert_eq!(f32::INFINITY.to_json(), Null);
        assert_eq!(f64::NAN.to_json(), Null);
3302 3303 3304
        assert_eq!(true.to_json(), Boolean(true));
        assert_eq!(false.to_json(), Boolean(false));
        assert_eq!("abc".to_string().to_json(), String("abc".to_string()));
3305 3306 3307 3308 3309 3310
        assert_eq!((1i, 2i).to_json(), list2);
        assert_eq!((1i, 2i, 3i).to_json(), list3);
        assert_eq!([1i, 2].to_json(), list2);
        assert_eq!((&[1i, 2, 3]).to_json(), list3);
        assert_eq!((vec![1i, 2]).to_json(), list2);
        assert_eq!(vec!(1i, 2i, 3i).to_json(), list3);
3311
        let mut tree_map = TreeMap::new();
3312
        tree_map.insert("a".to_string(), 1i);
3313 3314 3315
        tree_map.insert("b".to_string(), 2);
        assert_eq!(tree_map.to_json(), object);
        let mut hash_map = HashMap::new();
3316
        hash_map.insert("a".to_string(), 1i);
3317 3318
        hash_map.insert("b".to_string(), 2);
        assert_eq!(hash_map.to_json(), object);
3319
        assert_eq!(Some(15i).to_json(), Number(15f64));
3320 3321 3322
        assert_eq!(None::<int>.to_json(), Null);
    }

3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357
    #[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} }
                ]
            }"#);
        });
    }

3358
    fn big_json() -> String {
3359
        let mut src = "[\n".to_string();
3360
        for _ in range(0i, 500) {
3361 3362
            src.push_str(r#"{ "a": true, "b": null, "c":3.1415, "d": "Hello world", "e": \
                            [1,2,3]},"#);
3363
        }
3364
        src.push_str("{}]");
3365 3366 3367 3368 3369 3370 3371
        return src;
    }

    #[bench]
    fn bench_streaming_large(b: &mut Bencher) {
        let src = big_json();
        b.iter( || {
3372
            let mut parser = Parser::new(src.as_slice().chars());
3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383
            loop {
                match parser.next() {
                    None => return,
                    _ => {}
                }
            }
        });
    }
    #[bench]
    fn bench_large(b: &mut Bencher) {
        let src = big_json();
3384
        b.iter( || { let _ = from_str(src.as_slice()); });
3385
    }
3386
}