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

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

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

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
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`
31
* `List`: equivalent to rust's `Vec<T>`, but also allowing objects of different types in the same
A
Adolfo Ochagavía 已提交
32 33 34
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

T
Tshepang Lekhonkhobe 已提交
109
The examples above use the `ToJson` trait to generate the JSON string, which is required
I
Ilya Dmitrichenko 已提交
110 111 112
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

S
Steven Fackler 已提交
197 198 199 200 201 202 203 204 205
pub use self::JsonEvent::*;
pub use self::StackElement::*;
pub use self::Json::*;
pub use self::ErrorCode::*;
pub use self::ParserError::*;
pub use self::DecoderError::*;
use self::ParserState::*;
use self::InternalStackElement::*;

A
Adolfo Ochagavía 已提交
206
use std;
207
use std::collections::{HashMap, TreeMap};
A
Adolfo Ochagavía 已提交
208
use std::{char, f64, fmt, io, num, str};
A
Alex Crichton 已提交
209
use std::io::MemWriter;
A
Adolfo Ochagavía 已提交
210
use std::mem::{swap, transmute};
211
use std::num::{Float, FPNaN, FPInfinite, Int};
B
Brendan Zabarauskas 已提交
212
use std::str::{FromStr, ScalarValue};
213
use std::string;
214
use std::vec::Vec;
215
use std::ops;
216

A
Alex Crichton 已提交
217
use Encodable;
E
Elly Jones 已提交
218

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

232 233
pub type JsonList = Vec<Json>;
pub type JsonObject = TreeMap<string::String, Json>;
234

235
/// The errors that can arise while parsing a JSON stream.
236
#[deriving(Clone, PartialEq)]
237 238 239 240 241 242 243 244 245 246
pub enum ErrorCode {
    InvalidSyntax,
    InvalidNumber,
    EOFWhileParsingObject,
    EOFWhileParsingList,
    EOFWhileParsingValue,
    EOFWhileParsingString,
    KeyMustBeAString,
    ExpectedColon,
    TrailingCharacters,
247
    TrailingComma,
248 249 250 251 252 253 254 255 256
    InvalidEscape,
    InvalidUnicodeCodePoint,
    LoneLeadingSurrogateInHexEscape,
    UnexpectedEndOfHexEscape,
    UnrecognizedHex,
    NotFourDigit,
    NotUtf8,
}

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

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

267
#[deriving(Clone, PartialEq, Show)]
268 269
pub enum DecoderError {
    ParseError(ParserError),
270 271 272 273
    ExpectedError(string::String, string::String),
    MissingFieldError(string::String),
    UnknownVariantError(string::String),
    ApplicationError(string::String)
274 275 276 277 278 279 280 281 282 283 284 285 286 287
}

/// 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",
288
        TrailingComma => "trailing comma",
289 290 291 292
        InvalidEscape => "invalid escape",
        UnrecognizedHex => "invalid \\u escape (unrecognized hex)",
        NotFourDigit => "invalid \\u escape (not four digits)",
        NotUtf8 => "contents not utf-8",
293
        InvalidUnicodeCodePoint => "invalid Unicode code point",
294 295 296 297 298
        LoneLeadingSurrogateInHexEscape => "lone leading surrogate in hex escape",
        UnexpectedEndOfHexEscape => "unexpected end of hex escape",
    }
}

299 300 301 302 303 304 305 306 307 308 309 310
/// 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`
311
pub fn encode<'a, T: Encodable<Encoder<'a>, io::IoError>>(object: &T) -> string::String {
312
    let buff = Encoder::buffer_encode(object);
313
    string::String::from_utf8(buff).unwrap()
314 315
}

316 317 318 319 320 321 322 323
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)
324
}
325

326 327 328 329 330
impl std::error::Error for DecoderError {
    fn description(&self) -> &str { "decoder error" }
    fn detail(&self) -> Option<std::string::String> { Some(self.to_string()) }
}

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

334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351
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 {
352
            try!(wr.write(bytes[start..i]));
E
Elly Jones 已提交
353
        }
354 355 356 357

        try!(wr.write_str(escaped));

        start = i + 1;
358
    }
359 360

    if start != bytes.len() {
361
        try!(wr.write(bytes[start..]));
362 363 364
    }

    wr.write_str("\"")
365 366 367 368 369 370 371 372
}

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];
N
Nick Cameron 已提交
373 374
    v.encode_utf8(&mut buf);
    escape_bytes(writer, &mut buf)
375 376
}

377
fn spaces(wr: &mut io::Writer, mut n: uint) -> Result<(), io::IoError> {
378 379 380 381
    const LEN: uint = 16;
    static BUF: [u8, ..LEN] = [b' ', ..LEN];

    while n >= LEN {
N
Nick Cameron 已提交
382
        try!(wr.write(&BUF));
383
        n -= LEN;
384 385 386
    }

    if n > 0 {
387
        wr.write(BUF[..n])
388 389
    } else {
        Ok(())
390
    }
E
Elly Jones 已提交
391 392
}

393
fn fmt_number_or_null(v: f64) -> string::String {
M
mrec 已提交
394
    match v.classify() {
395
        FPNaN | FPInfinite => string::String::from_str("null"),
M
mrec 已提交
396 397 398 399
        _ => f64::to_str_digits(v, 6u)
    }
}

400
/// A structure for implementing serialization to JSON.
E
Erik Price 已提交
401
pub struct Encoder<'a> {
402
    writer: &'a mut io::Writer+'a,
403 404
}

E
Erik Price 已提交
405
impl<'a> Encoder<'a> {
406 407
    /// Creates a new JSON encoder whose output will be written to the writer
    /// specified.
A
Adolfo Ochagavía 已提交
408 409
    pub fn new(writer: &'a mut io::Writer) -> Encoder<'a> {
        Encoder { writer: writer }
410
    }
M
musitdev 已提交
411 412

    /// Encode the specified struct into a json [u8]
A
Adolfo Ochagavía 已提交
413 414
    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 已提交
415
        let mut m = MemWriter::new();
N
Nick Cameron 已提交
416 417
        // FIXME(14302) remove the transmute and unsafe block.
        unsafe {
M
musitdev 已提交
418
            let mut encoder = Encoder::new(&mut m as &mut io::Writer);
S
Sean McArthur 已提交
419
            // MemWriter never Errs
A
Adolfo Ochagavía 已提交
420
            let _ = object.encode(transmute(&mut encoder));
M
musitdev 已提交
421
        }
422
        m.unwrap()
M
musitdev 已提交
423
    }
424 425
}

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

S
Sean McArthur 已提交
429 430 431 432 433
    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) }
434

S
Sean McArthur 已提交
435 436 437 438 439
    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) }
440

S
Sean McArthur 已提交
441
    fn emit_bool(&mut self, v: bool) -> EncodeResult {
442
        if v {
A
Adolfo Ochagavía 已提交
443
            write!(self.writer, "true")
444
        } else {
A
Adolfo Ochagavía 已提交
445
            write!(self.writer, "false")
446 447 448
        }
    }

S
Sean McArthur 已提交
449
    fn emit_f64(&mut self, v: f64) -> EncodeResult {
A
Adolfo Ochagavía 已提交
450
        write!(self.writer, "{}", fmt_number_or_null(v))
A
Alex Crichton 已提交
451
    }
S
Sean McArthur 已提交
452
    fn emit_f32(&mut self, v: f32) -> EncodeResult { self.emit_f64(v as f64) }
453

454
    fn emit_char(&mut self, v: char) -> EncodeResult {
455
        escape_char(self.writer, v)
456
    }
S
Sean McArthur 已提交
457
    fn emit_str(&mut self, v: &str) -> EncodeResult {
458
        escape_str(self.writer, v)
A
Alex Crichton 已提交
459
    }
460

A
Adolfo Ochagavía 已提交
461 462 463
    fn emit_enum(&mut self, _name: &str, f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
        f(self)
    }
464

465 466 467 468 469 470 471 472 473
    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 {
474
            escape_str(self.writer, name)
475
        } else {
A
Adolfo Ochagavía 已提交
476
            try!(write!(self.writer, "{{\"variant\":"));
477
            try!(escape_str(self.writer, name));
A
Adolfo Ochagavía 已提交
478
            try!(write!(self.writer, ",\"fields\":["));
479
            try!(f(self));
A
Adolfo Ochagavía 已提交
480
            write!(self.writer, "]}}")
481 482
        }
    }
483

S
Sean McArthur 已提交
484 485 486
    fn emit_enum_variant_arg(&mut self,
                             idx: uint,
                             f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
487
        if idx != 0 {
A
Adolfo Ochagavía 已提交
488
            try!(write!(self.writer, ","));
489
        }
S
Sean McArthur 已提交
490
        f(self)
491 492 493 494 495 496
    }

    fn emit_enum_struct_variant(&mut self,
                                name: &str,
                                id: uint,
                                cnt: uint,
S
Sean McArthur 已提交
497
                                f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
498 499 500 501 502 503
        self.emit_enum_variant(name, id, cnt, f)
    }

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

508 509 510 511
    fn emit_struct(&mut self,
                   _: &str,
                   _: uint,
                   f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
A
Adolfo Ochagavía 已提交
512
        try!(write!(self.writer, "{{"));
513
        try!(f(self));
A
Adolfo Ochagavía 已提交
514
        write!(self.writer, "}}")
515
    }
516 517 518 519

    fn emit_struct_field(&mut self,
                         name: &str,
                         idx: uint,
S
Sean McArthur 已提交
520
                         f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
A
Adolfo Ochagavía 已提交
521
        if idx != 0 { try!(write!(self.writer, ",")); }
522 523
        try!(escape_str(self.writer, name));
        try!(write!(self.writer, ":"));
S
Sean McArthur 已提交
524
        f(self)
525 526
    }

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

    fn emit_tuple_struct(&mut self,
                         _name: &str,
                         len: uint,
S
Sean McArthur 已提交
539
                         f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
540 541
        self.emit_seq(len, f)
    }
S
Sean McArthur 已提交
542 543 544
    fn emit_tuple_struct_arg(&mut self,
                             idx: uint,
                             f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
545 546 547
        self.emit_seq_elt(idx, f)
    }

S
Sean McArthur 已提交
548 549 550 551 552 553 554
    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)
    }
555

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

S
Sean McArthur 已提交
562
    fn emit_seq_elt(&mut self, idx: uint, f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
563
        if idx != 0 {
A
Adolfo Ochagavía 已提交
564
            try!(write!(self.writer, ","));
565 566 567 568
        }
        f(self)
    }

569
    fn emit_map(&mut self, _len: uint, f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
A
Adolfo Ochagavía 已提交
570
        try!(write!(self.writer, "{{"));
571
        try!(f(self));
A
Adolfo Ochagavía 已提交
572
        write!(self.writer, "}}")
573
    }
574

S
Sean McArthur 已提交
575 576 577
    fn emit_map_elt_key(&mut self,
                        idx: uint,
                        f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
A
Adolfo Ochagavía 已提交
578
        if idx != 0 { try!(write!(self.writer, ",")) }
579 580 581
        // 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 已提交
582 583 584 585 586
        // FIXME(14302) remove the transmute and unsafe block.
        unsafe {
            let mut check_encoder = Encoder::new(&mut buf);
            try!(f(transmute(&mut check_encoder)));
        }
587
        let out = str::from_utf8(buf.get_ref()).unwrap();
A
Adolfo Ochagavía 已提交
588 589
        let needs_wrapping = out.char_at(0) != '"' && out.char_at_reverse(out.len()) != '"';
        if needs_wrapping { try!(write!(self.writer, "\"")); }
S
Sean McArthur 已提交
590
        try!(f(self));
A
Adolfo Ochagavía 已提交
591
        if needs_wrapping { try!(write!(self.writer, "\"")); }
S
Sean McArthur 已提交
592
        Ok(())
593 594
    }

S
Sean McArthur 已提交
595 596 597
    fn emit_map_elt_val(&mut self,
                        _idx: uint,
                        f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
A
Adolfo Ochagavía 已提交
598
        try!(write!(self.writer, ":"));
599 600 601 602
        f(self)
    }
}

603 604
/// Another encoder for JSON, but prints out human-readable JSON instead of
/// compact data
E
Erik Price 已提交
605
pub struct PrettyEncoder<'a> {
606
    writer: &'a mut io::Writer+'a,
607
    curr_indent: uint,
608
    indent: uint,
609 610
}

E
Erik Price 已提交
611
impl<'a> PrettyEncoder<'a> {
612
    /// Creates a new encoder whose output will be written to the specified writer
A
Adolfo Ochagavía 已提交
613
    pub fn new<'a>(writer: &'a mut io::Writer) -> PrettyEncoder<'a> {
614 615 616 617 618 619 620
        PrettyEncoder { writer: writer, curr_indent: 0, indent: 2, }
    }

    /// Set the number of spaces to indent for each level.
    /// This is safe to set during encoding.
    pub fn set_indent<'a>(&mut self, indent: uint) {
        // self.indent very well could be 0 so we need to use checked division.
621
        let level = self.curr_indent.checked_div(self.indent).unwrap_or(0);
622 623
        self.indent = indent;
        self.curr_indent = level * self.indent;
624
    }
625
}
626

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

S
Sean McArthur 已提交
630 631 632 633 634
    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) }
635

S
Sean McArthur 已提交
636 637 638 639 640
    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) }
641

S
Sean McArthur 已提交
642
    fn emit_bool(&mut self, v: bool) -> EncodeResult {
643
        if v {
A
Adolfo Ochagavía 已提交
644
            write!(self.writer, "true")
645
        } else {
A
Adolfo Ochagavía 已提交
646
            write!(self.writer, "false")
647 648 649
        }
    }

S
Sean McArthur 已提交
650
    fn emit_f64(&mut self, v: f64) -> EncodeResult {
A
Adolfo Ochagavía 已提交
651
        write!(self.writer, "{}", fmt_number_or_null(v))
A
Alex Crichton 已提交
652
    }
653 654 655
    fn emit_f32(&mut self, v: f32) -> EncodeResult {
        self.emit_f64(v as f64)
    }
656

657
    fn emit_char(&mut self, v: char) -> EncodeResult {
658
        escape_char(self.writer, v)
659
    }
S
Sean McArthur 已提交
660
    fn emit_str(&mut self, v: &str) -> EncodeResult {
661
        escape_str(self.writer, v)
A
Alex Crichton 已提交
662
    }
663

S
Sean McArthur 已提交
664 665 666
    fn emit_enum(&mut self,
                 _name: &str,
                 f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
667 668 669 670 671 672 673
        f(self)
    }

    fn emit_enum_variant(&mut self,
                         name: &str,
                         _: uint,
                         cnt: uint,
S
Sean McArthur 已提交
674
                         f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
675
        if cnt == 0 {
676
            escape_str(self.writer, name)
677
        } else {
678
            try!(write!(self.writer, "{{\n"));
679 680
            self.curr_indent += self.indent;
            try!(spaces(self.writer, self.curr_indent));
681
            try!(write!(self.writer, "\"variant\": "));
682 683
            try!(escape_str(self.writer, name));
            try!(write!(self.writer, ",\n"));
684 685 686
            try!(spaces(self.writer, self.curr_indent));
            try!(write!(self.writer, "\"fields\": [\n"));
            self.curr_indent += self.indent;
S
Sean McArthur 已提交
687
            try!(f(self));
688
            self.curr_indent -= self.indent;
689
            try!(write!(self.writer, "\n"));
690
            try!(spaces(self.writer, self.curr_indent));
691 692 693 694
            self.curr_indent -= self.indent;
            try!(write!(self.writer, "]\n"));
            try!(spaces(self.writer, self.curr_indent));
            write!(self.writer, "}}")
695 696 697 698 699
        }
    }

    fn emit_enum_variant_arg(&mut self,
                             idx: uint,
S
Sean McArthur 已提交
700
                             f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
701
        if idx != 0 {
A
Adolfo Ochagavía 已提交
702
            try!(write!(self.writer, ",\n"));
703
        }
704
        try!(spaces(self.writer, self.curr_indent));
705 706 707 708 709 710 711
        f(self)
    }

    fn emit_enum_struct_variant(&mut self,
                                name: &str,
                                id: uint,
                                cnt: uint,
S
Sean McArthur 已提交
712
                                f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
713 714 715 716 717 718
        self.emit_enum_variant(name, id, cnt, f)
    }

    fn emit_enum_struct_variant_field(&mut self,
                                      _: &str,
                                      idx: uint,
S
Sean McArthur 已提交
719
                                      f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
720 721 722 723
        self.emit_enum_variant_arg(idx, f)
    }


724 725 726 727 728
    fn emit_struct(&mut self,
                   _: &str,
                   len: uint,
                   f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
        if len == 0 {
A
Adolfo Ochagavía 已提交
729
            write!(self.writer, "{{}}")
730
        } else {
A
Adolfo Ochagavía 已提交
731
            try!(write!(self.writer, "{{"));
732
            self.curr_indent += self.indent;
733
            try!(f(self));
734
            self.curr_indent -= self.indent;
735
            try!(write!(self.writer, "\n"));
736
            try!(spaces(self.writer, self.curr_indent));
737
            write!(self.writer, "}}")
738 739
        }
    }
740 741 742 743

    fn emit_struct_field(&mut self,
                         name: &str,
                         idx: uint,
S
Sean McArthur 已提交
744
                         f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
745
        if idx == 0 {
A
Adolfo Ochagavía 已提交
746
            try!(write!(self.writer, "\n"));
747
        } else {
A
Adolfo Ochagavía 已提交
748
            try!(write!(self.writer, ",\n"));
749
        }
750
        try!(spaces(self.writer, self.curr_indent));
751 752
        try!(escape_str(self.writer, name));
        try!(write!(self.writer, ": "));
S
Sean McArthur 已提交
753
        f(self)
754 755
    }

S
Sean McArthur 已提交
756 757 758
    fn emit_tuple(&mut self,
                  len: uint,
                  f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
759 760
        self.emit_seq(len, f)
    }
S
Sean McArthur 已提交
761 762 763
    fn emit_tuple_arg(&mut self,
                      idx: uint,
                      f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
764 765 766 767 768 769
        self.emit_seq_elt(idx, f)
    }

    fn emit_tuple_struct(&mut self,
                         _: &str,
                         len: uint,
S
Sean McArthur 已提交
770
                         f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
771 772 773 774
        self.emit_seq(len, f)
    }
    fn emit_tuple_struct_arg(&mut self,
                             idx: uint,
S
Sean McArthur 已提交
775
                             f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
776 777 778
        self.emit_seq_elt(idx, f)
    }

S
Sean McArthur 已提交
779 780 781 782 783 784 785
    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)
    }
786

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

S
Sean McArthur 已提交
803 804 805
    fn emit_seq_elt(&mut self,
                    idx: uint,
                    f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
806
        if idx == 0 {
A
Adolfo Ochagavía 已提交
807
            try!(write!(self.writer, "\n"));
808
        } else {
A
Adolfo Ochagavía 已提交
809
            try!(write!(self.writer, ",\n"));
810
        }
811
        try!(spaces(self.writer, self.curr_indent));
812 813 814
        f(self)
    }

815 816 817 818
    fn emit_map(&mut self,
                len: uint,
                f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
        if len == 0 {
A
Adolfo Ochagavía 已提交
819
            write!(self.writer, "{{}}")
820
        } else {
A
Adolfo Ochagavía 已提交
821
            try!(write!(self.writer, "{{"));
822
            self.curr_indent += self.indent;
823
            try!(f(self));
824
            self.curr_indent -= self.indent;
825
            try!(write!(self.writer, "\n"));
826
            try!(spaces(self.writer, self.curr_indent));
827
            write!(self.writer, "}}")
828 829
        }
    }
830

S
Sean McArthur 已提交
831 832 833
    fn emit_map_elt_key(&mut self,
                        idx: uint,
                        f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
834
        if idx == 0 {
A
Adolfo Ochagavía 已提交
835
            try!(write!(self.writer, "\n"));
836
        } else {
A
Adolfo Ochagavía 已提交
837
            try!(write!(self.writer, ",\n"));
838
        }
839
        try!(spaces(self.writer, self.curr_indent));
840 841 842
        // 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 已提交
843 844 845 846 847
        // FIXME(14302) remove the transmute and unsafe block.
        unsafe {
            let mut check_encoder = PrettyEncoder::new(&mut buf);
            try!(f(transmute(&mut check_encoder)));
        }
848
        let out = str::from_utf8(buf.get_ref()).unwrap();
A
Adolfo Ochagavía 已提交
849 850
        let needs_wrapping = out.char_at(0) != '"' && out.char_at_reverse(out.len()) != '"';
        if needs_wrapping { try!(write!(self.writer, "\"")); }
S
Sean McArthur 已提交
851
        try!(f(self));
A
Adolfo Ochagavía 已提交
852
        if needs_wrapping { try!(write!(self.writer, "\"")); }
S
Sean McArthur 已提交
853
        Ok(())
854 855
    }

S
Sean McArthur 已提交
856 857 858
    fn emit_map_elt_val(&mut self,
                        _idx: uint,
                        f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
A
Adolfo Ochagavía 已提交
859
        try!(write!(self.writer, ": "));
S
Sean McArthur 已提交
860
        f(self)
861 862 863
    }
}

864 865
impl<E: ::Encoder<S>, S> Encodable<E, S> for Json {
    fn encode(&self, e: &mut E) -> Result<(), S> {
866
        match *self {
867 868 869
            I64(v) => v.encode(e),
            U64(v) => v.encode(e),
            F64(v) => v.encode(e),
870 871 872 873 874 875 876 877 878
            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(),
        }
    }
}

879
impl Json {
A
Adolfo Ochagavía 已提交
880 881 882
    /// 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 已提交
883
        self.encode(&mut encoder)
884
    }
885

J
Jorge Aparicio 已提交
886
    /// Encodes a json value into an io::writer.
887
    /// Pretty-prints in a more readable format.
A
Adolfo Ochagavía 已提交
888 889
    pub fn to_pretty_writer(&self, writer: &mut io::Writer) -> EncodeResult {
        let mut encoder = PrettyEncoder::new(writer);
S
Sean McArthur 已提交
890
        self.encode(&mut encoder)
891
    }
892

893
    /// Encodes a json value into a string
894
    pub fn to_pretty_str(&self) -> string::String {
895
        let mut s = MemWriter::new();
A
Alex Crichton 已提交
896
        self.to_pretty_writer(&mut s as &mut io::Writer).unwrap();
897
        string::String::from_utf8(s.unwrap()).unwrap()
898
    }
899 900 901

     /// If the Json value is an Object, returns the value associated with the provided key.
    /// Otherwise, returns None.
902 903 904 905 906 907 908
    pub fn find<'a>(&'a self, key: &str) -> Option<&'a Json>{
        match self {
            &Object(ref map) => map.find_with(|s| key.cmp(s.as_slice())),
            _ => None
        }
    }

909
    /// Attempts to get a nested Json Object for each key in `keys`.
910
    /// If any key is found not to exist, find_path will return None.
911
    /// Otherwise, it will return the Json value associated with the final key.
912
    pub fn find_path<'a>(&'a self, keys: &[&str]) -> Option<&'a Json>{
913 914 915 916 917 918 919 920
        let mut target = self;
        for key in keys.iter() {
            match target.find(*key) {
                Some(t) => { target = t; },
                None => return None
            }
        }
        Some(target)
921 922 923 924 925
    }

    /// 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.
926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945
    pub fn search<'a>(&'a self, key: &str) -> Option<&'a Json> {
        match self {
            &Object(ref map) => {
                match map.find_with(|s| key.cmp(s.as_slice())) {
                    Some(json_value) => Some(json_value),
                    None => {
                        for (_, v) in map.iter() {
                            match v.search(key) {
                                x if x.is_some() => return x,
                                _ => ()
                            }
                        }
                        None
                    }
                }
            },
            _ => None
        }
    }

946 947
    /// Returns true if the Json value is an Object. Returns false otherwise.
    pub fn is_object<'a>(&'a self) -> bool {
948
        self.as_object().is_some()
949 950 951 952
    }

    /// If the Json value is an Object, returns the associated TreeMap.
    /// Returns None otherwise.
953
    pub fn as_object<'a>(&'a self) -> Option<&'a JsonObject> {
954
        match self {
A
Adolfo Ochagavía 已提交
955
            &Object(ref map) => Some(map),
956 957 958 959 960 961
            _ => None
        }
    }

    /// Returns true if the Json value is a List. Returns false otherwise.
    pub fn is_list<'a>(&'a self) -> bool {
962
        self.as_list().is_some()
963 964 965 966
    }

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

    /// Returns true if the Json value is a String. Returns false otherwise.
975 976
    pub fn is_string<'a>(&'a self) -> bool {
        self.as_string().is_some()
977 978 979 980
    }

    /// If the Json value is a String, returns the associated str.
    /// Returns None otherwise.
981
    pub fn as_string<'a>(&'a self) -> Option<&'a str> {
982 983 984 985 986 987 988 989
        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 {
990
        match *self {
991
            I64(_) | U64(_) | F64(_) => true,
992 993 994 995 996 997 998
            _ => false,
        }
    }

    /// Returns true if the Json value is a i64. Returns false otherwise.
    pub fn is_i64(&self) -> bool {
        match *self {
999 1000 1001 1002 1003 1004 1005 1006 1007
            I64(_) => true,
            _ => false,
        }
    }

    /// Returns true if the Json value is a u64. Returns false otherwise.
    pub fn is_u64(&self) -> bool {
        match *self {
            U64(_) => true,
1008 1009
            _ => false,
        }
1010 1011
    }

1012 1013 1014
    /// Returns true if the Json value is a f64. Returns false otherwise.
    pub fn is_f64(&self) -> bool {
        match *self {
1015
            F64(_) => true,
1016 1017 1018 1019
            _ => false,
        }
    }

1020
    /// If the Json value is a number, return or cast it to a i64.
1021
    /// Returns None otherwise.
1022 1023
    pub fn as_i64(&self) -> Option<i64> {
        match *self {
1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035
            I64(n) => Some(n),
            U64(n) => num::cast(n),
            _ => None
        }
    }

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

1040
    /// If the Json value is a number, return or cast it to a f64.
1041 1042 1043
    /// Returns None otherwise.
    pub fn as_f64(&self) -> Option<f64> {
        match *self {
1044 1045 1046
            I64(n) => num::cast(n),
            U64(n) => num::cast(n),
            F64(n) => Some(n),
1047 1048 1049 1050 1051 1052
            _ => None
        }
    }

    /// Returns true if the Json value is a Boolean. Returns false otherwise.
    pub fn is_boolean(&self) -> bool {
1053
        self.as_boolean().is_some()
1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066
    }

    /// 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 {
1067
        self.as_null().is_some()
1068 1069 1070 1071 1072 1073 1074 1075 1076 1077
    }

    /// 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 已提交
1078 1079
}

1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094
impl<'a> ops::Index<&'a str, Json>  for Json {
    fn index<'a>(&'a self, idx: & &str) -> &'a Json {
        self.find(*idx).unwrap()
    }
}

impl ops::Index<uint, Json> for Json {
    fn index<'a>(&'a self, idx: &uint) -> &'a Json {
        match self {
            &List(ref v) => v.index(idx),
            _ => panic!("can only index Json with uint if it is a list")
        }
    }
}

1095
/// The output of the streaming parser.
1096
#[deriving(PartialEq, Clone, Show)]
1097 1098 1099 1100 1101 1102
pub enum JsonEvent {
    ObjectStart,
    ObjectEnd,
    ListStart,
    ListEnd,
    BooleanValue(bool),
1103 1104 1105
    I64Value(i64),
    U64Value(u64),
    F64Value(f64),
1106
    StringValue(string::String),
1107 1108 1109 1110
    NullValue,
    Error(ParserError),
}

1111
#[deriving(PartialEq, Show)]
1112 1113
enum ParserState {
    // Parse a value in a list, true means first element.
1114
    ParseArray(bool),
1115 1116 1117 1118 1119 1120
    // 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 已提交
1121
    // Initial state.
1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139
    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
1140
#[deriving(PartialEq, Clone, Show)]
1141 1142 1143 1144 1145 1146 1147
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.
1148
#[deriving(PartialEq, Clone, Show)]
1149 1150 1151 1152 1153 1154 1155
enum InternalStackElement {
    InternalIndex(u32),
    InternalKey(u16, u16), // start, size
}

impl Stack {
    pub fn new() -> Stack {
A
Adolfo Ochagavía 已提交
1156
        Stack { stack: Vec::new(), str_buffer: Vec::new() }
1157 1158 1159 1160 1161
    }

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

A
Adolfo Ochagavía 已提交
1162 1163
    /// Returns true if the stack is empty.
    pub fn is_empty(&self) -> bool { self.stack.is_empty() }
1164 1165 1166 1167 1168

    /// 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 已提交
1169
        match self.stack[idx] {
A
Adolfo Ochagavía 已提交
1170 1171
            InternalIndex(i) => { Index(i) }
            InternalKey(start, size) => {
A
Adolfo Ochagavía 已提交
1172
                Key(str::from_utf8(
1173
                    self.str_buffer[start as uint .. start as uint + size as uint]).unwrap())
A
Adolfo Ochagavía 已提交
1174
            }
1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214
        }
    }

    /// 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(
1215
                    self.str_buffer[start as uint .. (start+size) as uint]
1216 1217 1218 1219 1220 1221
                ).unwrap()))
            }
        }
    }

    // Used by Parser to insert Key elements at the top of the stack.
1222
    fn push_key(&mut self, key: string::String) {
1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239
        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 已提交
1240
                self.str_buffer.truncate(new_size);
1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259
            }
            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 已提交
1260
            InternalIndex(i) => { i + 1 }
S
Steve Klabnik 已提交
1261
            _ => { panic!(); }
1262
        };
1263
        self.stack[len - 1] = InternalIndex(idx);
1264 1265 1266 1267 1268
    }
}

/// A streaming JSON parser implemented as an iterator of JsonEvent, consuming
/// an iterator of char.
G
Gary Linscott 已提交
1269
pub struct Parser<T> {
1270 1271 1272 1273
    rdr: T,
    ch: Option<char>,
    line: uint,
    col: uint,
1274 1275 1276
    // We maintain a stack representing where we are in the logical structure
    // of the JSON stream.
    stack: Stack,
J
Joseph Crail 已提交
1277
    // A state machine is kept to make it possible to interrupt and resume parsing.
1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299
    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());
    }
1300 1301
}

1302
impl<T: Iterator<char>> Parser<T> {
1303
    /// Creates the JSON parser.
1304
    pub fn new(rdr: T) -> Parser<T> {
1305 1306
        let mut p = Parser {
            rdr: rdr,
1307
            ch: Some('\x00'),
1308 1309
            line: 1,
            col: 0,
1310 1311
            stack: Stack::new(),
            state: ParseStart,
1312 1313
        };
        p.bump();
1314
        return p;
1315
    }
E
Elly Jones 已提交
1316

1317 1318 1319
    /// Provides access to the current position in the logical structure of the
    /// JSON stream.
    pub fn stack<'l>(&'l self) -> &'l Stack {
1320
        return &self.stack;
1321
    }
1322

1323 1324
    fn eof(&self) -> bool { self.ch.is_none() }
    fn ch_or_null(&self) -> char { self.ch.unwrap_or('\x00') }
1325
    fn bump(&mut self) {
1326
        self.ch = self.rdr.next();
E
Elly Jones 已提交
1327

1328
        if self.ch_is('\n') {
1329 1330
            self.line += 1u;
            self.col = 1u;
G
Gary Linscott 已提交
1331 1332
        } else {
            self.col += 1u;
E
Elly Jones 已提交
1333
        }
1334 1335
    }

1336
    fn next_char(&mut self) -> Option<char> {
1337 1338 1339
        self.bump();
        self.ch
    }
1340 1341 1342
    fn ch_is(&self, c: char) -> bool {
        self.ch == Some(c)
    }
1343

1344 1345
    fn error<T>(&self, reason: ErrorCode) -> Result<T, ParserError> {
        Err(SyntaxError(reason, self.line, self.col))
1346 1347
    }

1348
    fn parse_whitespace(&mut self) {
1349 1350 1351 1352
        while self.ch_is(' ') ||
              self.ch_is('\n') ||
              self.ch_is('\t') ||
              self.ch_is('\r') { self.bump(); }
1353 1354
    }

1355
    fn parse_number(&mut self) -> JsonEvent {
1356
        let mut neg = false;
1357

1358
        if self.ch_is('-') {
1359
            self.bump();
1360
            neg = true;
E
Elly Jones 已提交
1361
        }
1362

1363
        let res = match self.parse_u64() {
1364 1365 1366
            Ok(res) => res,
            Err(e) => { return Error(e); }
        };
1367

1368 1369
        if self.ch_is('.') || self.ch_is('e') || self.ch_is('E') {
            let mut res = res as f64;
1370

1371 1372 1373 1374 1375 1376
            if self.ch_is('.') {
                res = match self.parse_decimal(res) {
                    Ok(res) => res,
                    Err(e) => { return Error(e); }
                };
            }
1377

1378 1379 1380 1381 1382 1383 1384
            if self.ch_is('e') || self.ch_is('E') {
                res = match self.parse_exponent(res) {
                    Ok(res) => res,
                    Err(e) => { return Error(e); }
                };
            }

1385 1386 1387 1388 1389
            if neg {
                res *= -1.0;
            }

            F64Value(res)
1390
        } else {
1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402
            if neg {
                let res = -(res as i64);

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

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

1410 1411 1412
        match self.ch_or_null() {
            '0' => {
                self.bump();
1413

M
mrec 已提交
1414
                // A leading '0' must be the only digit before the decimal point.
1415
                match self.ch_or_null() {
1416
                    '0' ... '9' => return self.error(InvalidNumber),
1417 1418 1419
                    _ => ()
                }
            },
1420
            '1' ... '9' => {
1421 1422
                while !self.eof() {
                    match self.ch_or_null() {
1423
                        c @ '0' ... '9' => {
1424 1425 1426 1427 1428 1429
                            accum *= 10;
                            accum += (c as u64) - ('0' as u64);

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

1430 1431 1432 1433
                            self.bump();
                        }
                        _ => break,
                    }
1434 1435
                }
            }
1436
            _ => return self.error(InvalidNumber),
E
Elly Jones 已提交
1437
        }
1438 1439

        Ok(accum)
E
Elly Jones 已提交
1440 1441
    }

A
Adolfo Ochagavía 已提交
1442
    fn parse_decimal(&mut self, mut res: f64) -> Result<f64, ParserError> {
1443 1444 1445
        self.bump();

        // Make sure a digit follows the decimal place.
1446
        match self.ch_or_null() {
1447
            '0' ... '9' => (),
1448
             _ => return self.error(InvalidNumber)
1449 1450
        }

D
Daniel Micay 已提交
1451
        let mut dec = 1.0;
1452
        while !self.eof() {
1453
            match self.ch_or_null() {
1454
                c @ '0' ... '9' => {
1455 1456 1457 1458 1459
                    dec /= 10.0;
                    res += (((c as int) - ('0' as int)) as f64) * dec;
                    self.bump();
                }
                _ => break,
E
Elly Jones 已提交
1460 1461
            }
        }
1462

1463
        Ok(res)
E
Elly Jones 已提交
1464 1465
    }

1466
    fn parse_exponent(&mut self, mut res: f64) -> Result<f64, ParserError> {
1467 1468
        self.bump();

1469 1470
        let mut exp = 0u;
        let mut neg_exp = false;
1471

1472 1473 1474 1475 1476
        if self.ch_is('+') {
            self.bump();
        } else if self.ch_is('-') {
            self.bump();
            neg_exp = true;
1477 1478 1479
        }

        // Make sure a digit follows the exponent place.
1480
        match self.ch_or_null() {
1481
            '0' ... '9' => (),
1482
            _ => return self.error(InvalidNumber)
1483 1484
        }
        while !self.eof() {
1485
            match self.ch_or_null() {
1486
                c @ '0' ... '9' => {
1487 1488
                    exp *= 10;
                    exp += (c as uint) - ('0' as uint);
1489

1490 1491 1492
                    self.bump();
                }
                _ => break
1493 1494 1495
            }
        }

1496
        let exp = 10_f64.powi(exp as i32);
1497 1498 1499 1500 1501 1502
        if neg_exp {
            res /= exp;
        } else {
            res *= exp;
        }

1503
        Ok(res)
E
Elly Jones 已提交
1504 1505
    }

1506
    fn decode_hex_escape(&mut self) -> Result<u16, ParserError> {
1507 1508
        let mut i = 0u;
        let mut n = 0u16;
A
Adolfo Ochagavía 已提交
1509
        while i < 4 && !self.eof() {
1510 1511
            self.bump();
            n = match self.ch_or_null() {
1512
                c @ '0' ... '9' => n * 16 + ((c as u16) - ('0' as u16)),
A
Adolfo Ochagavía 已提交
1513 1514 1515 1516 1517 1518
                '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,
1519
                _ => return self.error(InvalidEscape)
1520 1521 1522 1523 1524 1525
            };

            i += 1u;
        }

        // Error out if we didn't parse 4 digits.
A
Adolfo Ochagavía 已提交
1526
        if i != 4 {
1527
            return self.error(InvalidEscape);
1528 1529 1530 1531 1532
        }

        Ok(n)
    }

1533
    fn parse_str(&mut self) -> Result<string::String, ParserError> {
1534
        let mut escape = false;
1535
        let mut res = string::String::new();
1536

G
Gary Linscott 已提交
1537
        loop {
1538
            self.bump();
G
Gary Linscott 已提交
1539
            if self.eof() {
1540
                return self.error(EOFWhileParsingString);
G
Gary Linscott 已提交
1541
            }
1542

H
Huon Wilson 已提交
1543
            if escape {
1544
                match self.ch_or_null() {
1545 1546 1547 1548 1549 1550 1551 1552
                    '"' => res.push('"'),
                    '\\' => res.push('\\'),
                    '/' => res.push('/'),
                    'b' => res.push('\x08'),
                    'f' => res.push('\x0c'),
                    'n' => res.push('\n'),
                    'r' => res.push('\r'),
                    't' => res.push('\t'),
1553
                    'u' => match try!(self.decode_hex_escape()) {
1554 1555 1556
                        0xDC00 ... 0xDFFF => {
                            return self.error(LoneLeadingSurrogateInHexEscape)
                        }
1557 1558 1559

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

1566 1567
                            let buf = [n1, try!(self.decode_hex_escape())];
                            match str::utf16_items(buf.as_slice()).next() {
1568
                                Some(ScalarValue(c)) => res.push(c),
1569
                                _ => return self.error(LoneLeadingSurrogateInHexEscape),
1570
                            }
1571 1572
                        }

1573
                        n => match char::from_u32(n as u32) {
1574
                            Some(c) => res.push(c),
1575
                            None => return self.error(InvalidUnicodeCodePoint),
1576 1577
                        },
                    },
1578
                    _ => return self.error(InvalidEscape),
1579 1580
                }
                escape = false;
1581
            } else if self.ch_is('\\') {
1582 1583
                escape = true;
            } else {
1584
                match self.ch {
1585 1586
                    Some('"') => {
                        self.bump();
1587
                        return Ok(res);
1588
                    },
1589
                    Some(c) => res.push(c),
1590
                    None => unreachable!()
1591
                }
E
Elly Jones 已提交
1592 1593 1594 1595
            }
        }
    }

1596 1597 1598 1599
    // 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 已提交
1600
    // stream int the form of a stack that can be queried by the user using the
1601 1602 1603 1604 1605 1606
    // 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)
1607
            // ParseArray(false) and ParseObject(false), which always return,
1608 1609 1610
            // 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();
1611

1612 1613 1614 1615
            match self.state {
                ParseStart => {
                    return self.parse_start();
                }
1616
                ParseArray(first) => {
1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647
                    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 }
1648
            ListStart => { ParseArray(true) }
1649 1650 1651 1652 1653
            ObjectStart => { ParseObject(true) }
            _ => { ParseBeforeFinish }
        };
        return val;
    }
1654

1655
    fn parse_list(&mut self, first: bool) -> JsonEvent {
1656
        if self.ch_is(']') {
1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668
            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
                }
            }
1669
            self.bump();
1670 1671 1672 1673
            return ListEnd;
        }
        if first {
            self.stack.push_index(0);
1674 1675
        }

1676
        let val = self.parse_value();
1677

1678 1679
        self.state = match val {
            Error(_) => { ParseFinished }
1680
            ListStart => { ParseArray(true) }
1681 1682 1683 1684 1685
            ObjectStart => { ParseObject(true) }
            _ => { ParseListComma }
        };
        return val;
    }
1686

1687 1688 1689
    fn parse_list_comma_or_end(&mut self) -> Option<JsonEvent> {
        if self.ch_is(',') {
            self.stack.bump_index();
1690
            self.state = ParseArray(false);
1691 1692 1693 1694 1695 1696
            self.bump();
            return None;
        } else if self.ch_is(']') {
            self.stack.pop();
            if self.stack.is_empty() {
                self.state = ParseBeforeFinish;
1697
            } else {
1698 1699 1700 1701 1702
                self.state = if self.stack.last_is_index() {
                    ParseListComma
                } else {
                    ParseObjectComma
                }
1703
            }
1704 1705 1706 1707 1708 1709 1710
            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 已提交
1711 1712
    }

1713 1714 1715
    fn parse_object(&mut self, first: bool) -> JsonEvent {
        if self.ch_is('}') {
            if !first {
1716 1717 1718 1719 1720
                if self.stack.is_empty() {
                    return self.error_event(TrailingComma);
                } else {
                    self.stack.pop();
                }
1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753
            }
            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);
1754 1755 1756
        self.bump();
        self.parse_whitespace();

1757
        let val = self.parse_value();
1758

1759 1760
        self.state = match val {
            Error(_) => { ParseFinished }
1761
            ListStart => { ParseArray(true) }
1762 1763 1764 1765 1766 1767 1768
            ObjectStart => { ParseObject(true) }
            _ => { ParseObjectComma }
        };
        return val;
    }

    fn parse_object_end(&mut self) -> JsonEvent {
1769
        if self.ch_is('}') {
1770 1771 1772 1773 1774 1775 1776 1777 1778 1779
            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 已提交
1780
            ObjectEnd
1781
        } else if self.eof() {
A
Adolfo Ochagavía 已提交
1782
            self.error_event(EOFWhileParsingObject)
1783
        } else {
A
Adolfo Ochagavía 已提交
1784
            self.error_event(InvalidSyntax)
1785
        }
1786
    }
1787

1788 1789 1790
    fn parse_value(&mut self) -> JsonEvent {
        if self.eof() { return self.error_event(EOFWhileParsingValue); }
        match self.ch_or_null() {
A
Adolfo Ochagavía 已提交
1791 1792 1793
            'n' => { self.parse_ident("ull", NullValue) }
            't' => { self.parse_ident("rue", BooleanValue(true)) }
            'f' => { self.parse_ident("alse", BooleanValue(false)) }
1794
            '0' ... '9' | '-' => self.parse_number(),
A
Adolfo Ochagavía 已提交
1795
            '"' => match self.parse_str() {
1796 1797 1798 1799 1800
                Ok(s) => StringValue(s),
                Err(e) => Error(e),
            },
            '[' => {
                self.bump();
A
Adolfo Ochagavía 已提交
1801
                ListStart
1802 1803 1804
            }
            '{' => {
                self.bump();
A
Adolfo Ochagavía 已提交
1805
                ObjectStart
1806
            }
A
Adolfo Ochagavía 已提交
1807
            _ => { self.error_event(InvalidSyntax) }
1808 1809
        }
    }
1810

1811 1812 1813 1814 1815 1816 1817 1818
    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))
        }
    }
1819

1820 1821 1822 1823 1824
    fn error_event(&mut self, reason: ErrorCode) -> JsonEvent {
        self.state = ParseFinished;
        Error(SyntaxError(reason, self.line, self.col))
    }
}
1825

1826 1827 1828 1829 1830
/// A Builder consumes a json::Parser to create a generic Json structure.
pub struct Builder<T> {
    parser: Parser<T>,
    token: Option<JsonEvent>,
}
1831

1832 1833 1834
impl<T: Iterator<char>> Builder<T> {
    /// Create a JSON Builder.
    pub fn new(src: T) -> Builder<T> {
A
Adolfo Ochagavía 已提交
1835
        Builder { parser: Parser::new(src), token: None, }
1836 1837 1838 1839 1840 1841 1842 1843 1844 1845
    }

    // Decode a Json value from a Parser.
    pub fn build(&mut self) -> Result<Json, BuilderError> {
        self.bump();
        let result = self.build_value();
        self.bump();
        match self.token {
            None => {}
            Some(Error(e)) => { return Err(e); }
S
Steve Klabnik 已提交
1846
            ref tok => { panic!("unexpected token {}", tok.clone()); }
1847
        }
A
Adolfo Ochagavía 已提交
1848
        result
1849 1850 1851 1852 1853 1854 1855 1856 1857
    }

    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) }
1858 1859 1860
            Some(I64Value(n)) => { Ok(I64(n)) }
            Some(U64Value(n)) => { Ok(U64(n)) }
            Some(F64Value(n)) => { Ok(F64(n)) }
1861 1862
            Some(BooleanValue(b)) => { Ok(Boolean(b)) }
            Some(StringValue(ref mut s)) => {
1863
                let mut temp = string::String::new();
1864 1865
                swap(s, &mut temp);
                Ok(String(temp))
1866
            }
1867 1868 1869 1870 1871 1872 1873 1874
            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) }
        }
    }
1875

1876 1877 1878 1879 1880 1881
    fn build_list(&mut self) -> Result<Json, BuilderError> {
        self.bump();
        let mut values = Vec::new();

        loop {
            if self.token == Some(ListEnd) {
A
Aaron Turon 已提交
1882
                return Ok(List(values.into_iter().collect()));
1883 1884 1885 1886
            }
            match self.build_value() {
                Ok(v) => values.push(v),
                Err(e) => { return Err(e) }
1887
            }
1888
            self.bump();
1889
        }
1890
    }
1891

1892 1893 1894
    fn build_object(&mut self) -> Result<Json, BuilderError> {
        self.bump();

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

A
Adolfo Ochagavía 已提交
1897
        loop {
1898 1899 1900 1901 1902 1903 1904
            match self.token {
                Some(ObjectEnd) => { return Ok(Object(values)); }
                Some(Error(e)) => { return Err(e); }
                None => { break; }
                _ => {}
            }
            let key = match self.parser.stack().top() {
1905
                Some(Key(k)) => { k.to_string() }
S
Steve Klabnik 已提交
1906
                _ => { panic!("invalid state"); }
1907 1908 1909 1910 1911 1912 1913 1914
            };
            match self.build_value() {
                Ok(value) => { values.insert(key, value); }
                Err(e) => { return Err(e); }
            }
            self.bump();
        }
        return self.parser.error(EOFWhileParsingObject);
L
Lenny222 已提交
1915 1916 1917
    }
}

A
Alex Crichton 已提交
1918
/// Decodes a json value from an `&mut io::Reader`
1919
pub fn from_reader(rdr: &mut io::Reader) -> Result<Json, BuilderError> {
A
Alex Crichton 已提交
1920
    let contents = match rdr.read_to_end() {
1921
        Ok(c)  => c,
1922
        Err(e) => return Err(io_error_to_error(e))
A
Alex Crichton 已提交
1923
    };
1924 1925 1926
    let s = match str::from_utf8(contents.as_slice()) {
        Some(s) => s,
        _       => return Err(SyntaxError(NotUtf8, 0, 0))
A
Alex Crichton 已提交
1927
    };
1928
    let mut builder = Builder::new(s.chars());
1929
    builder.build()
E
Elly Jones 已提交
1930 1931
}

1932
/// Decodes a json value from a string
1933 1934
pub fn from_str(s: &str) -> Result<Json, BuilderError> {
    let mut builder = Builder::new(s.chars());
A
Adolfo Ochagavía 已提交
1935
    builder.build()
1936 1937
}

1938
/// A structure to decode JSON to values in rust.
1939
pub struct Decoder {
1940
    stack: Vec<Json>,
1941 1942
}

1943 1944
impl Decoder {
    /// Creates a new decoder instance for decoding the specified JSON value.
1945
    pub fn new(json: Json) -> Decoder {
A
Adolfo Ochagavía 已提交
1946
        Decoder { stack: vec![json] }
1947
    }
1948 1949
}

1950
impl Decoder {
S
Sean McArthur 已提交
1951 1952
    fn pop(&mut self) -> Json {
        self.stack.pop().unwrap()
1953 1954 1955
    }
}

S
Sean McArthur 已提交
1956 1957 1958 1959
macro_rules! expect(
    ($e:expr, Null) => ({
        match $e {
            Null => Ok(()),
1960
            other => Err(ExpectedError("Null".to_string(),
A
Alex Crichton 已提交
1961
                                       format!("{}", other)))
S
Sean McArthur 已提交
1962 1963 1964 1965 1966
        }
    });
    ($e:expr, $t:ident) => ({
        match $e {
            $t(v) => Ok(v),
1967
            other => {
1968
                Err(ExpectedError(stringify!($t).to_string(),
A
Alex Crichton 已提交
1969
                                  format!("{}", other)))
1970
            }
1971
        }
S
Sean McArthur 已提交
1972 1973 1974
    })
)

1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999
macro_rules! read_primitive {
    ($name:ident, $ty:ty) => {
        fn $name(&mut self) -> DecodeResult<$ty> {
            match self.pop() {
                I64(f) => {
                    match num::cast(f) {
                        Some(f) => Ok(f),
                        None => Err(ExpectedError("Number".to_string(), format!("{}", f))),
                    }
                }
                U64(f) => {
                    match num::cast(f) {
                        Some(f) => Ok(f),
                        None => Err(ExpectedError("Number".to_string(), format!("{}", f))),
                    }
                }
                F64(f) => {
                    match num::cast(f) {
                        Some(f) => Ok(f),
                        None => Err(ExpectedError("Number".to_string(), format!("{}", f))),
                    }
                }
                String(s) => {
                    // re: #12967.. a type w/ numeric keys (ie HashMap<uint, V> etc)
                    // is going to have a string here, as per JSON spec.
B
Brendan Zabarauskas 已提交
2000
                    match std::str::from_str(s.as_slice()) {
2001 2002 2003
                        Some(f) => Ok(f),
                        None => Err(ExpectedError("Number".to_string(), s)),
                    }
2004 2005 2006 2007 2008 2009 2010
                },
                value => Err(ExpectedError("Number".to_string(), format!("{}", value)))
            }
        }
    }
}

2011
impl ::Decoder<DecoderError> for Decoder {
S
Sean McArthur 已提交
2012 2013
    fn read_nil(&mut self) -> DecodeResult<()> {
        debug!("read_nil");
A
Adolfo Ochagavía 已提交
2014
        expect!(self.pop(), Null)
2015 2016
    }

2017 2018 2019 2020 2021 2022 2023 2024 2025 2026
    read_primitive!(read_uint, uint)
    read_primitive!(read_u8, u8)
    read_primitive!(read_u16, u16)
    read_primitive!(read_u32, u32)
    read_primitive!(read_u64, u64)
    read_primitive!(read_int, int)
    read_primitive!(read_i8, i8)
    read_primitive!(read_i16, i16)
    read_primitive!(read_i32, i32)
    read_primitive!(read_i64, i64)
2027

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

S
Sean McArthur 已提交
2030
    fn read_f64(&mut self) -> DecodeResult<f64> {
2031
        debug!("read_f64");
S
Sean McArthur 已提交
2032
        match self.pop() {
2033 2034 2035
            I64(f) => Ok(f as f64),
            U64(f) => Ok(f as f64),
            F64(f) => Ok(f),
2036 2037
            String(s) => {
                // re: #12967.. a type w/ numeric keys (ie HashMap<uint, V> etc)
A
Adolfo Ochagavía 已提交
2038
                // is going to have a string here, as per JSON spec.
B
Brendan Zabarauskas 已提交
2039
                match std::str::from_str(s.as_slice()) {
2040 2041 2042
                    Some(f) => Ok(f),
                    None => Err(ExpectedError("Number".to_string(), s)),
                }
2043
            },
M
mrec 已提交
2044
            Null => Ok(f64::NAN),
A
Adolfo Ochagavía 已提交
2045
            value => Err(ExpectedError("Number".to_string(), format!("{}", value)))
2046 2047
        }
    }
2048

2049 2050 2051 2052
    fn read_bool(&mut self) -> DecodeResult<bool> {
        debug!("read_bool");
        expect!(self.pop(), Boolean)
    }
2053

S
Sean McArthur 已提交
2054 2055
    fn read_char(&mut self) -> DecodeResult<char> {
        let s = try!(self.read_str());
2056
        {
2057
            let mut it = s.as_slice().chars();
2058 2059
            match (it.next(), it.next()) {
                // exactly one character
S
Sean McArthur 已提交
2060
                (Some(c), None) => return Ok(c),
2061 2062 2063
                _ => ()
            }
        }
A
Adolfo Ochagavía 已提交
2064
        Err(ExpectedError("single character string".to_string(), format!("{}", s)))
2065 2066
    }

2067
    fn read_str(&mut self) -> DecodeResult<string::String> {
2068
        debug!("read_str");
A
Adolfo Ochagavía 已提交
2069
        expect!(self.pop(), String)
2070 2071
    }

S
Sean McArthur 已提交
2072 2073 2074
    fn read_enum<T>(&mut self,
                    name: &str,
                    f: |&mut Decoder| -> DecodeResult<T>) -> DecodeResult<T> {
2075
        debug!("read_enum({})", name);
2076 2077 2078 2079 2080
        f(self)
    }

    fn read_enum_variant<T>(&mut self,
                            names: &[&str],
S
Sean McArthur 已提交
2081 2082
                            f: |&mut Decoder, uint| -> DecodeResult<T>)
                            -> DecodeResult<T> {
2083
        debug!("read_enum_variant(names={})", names);
S
Sean McArthur 已提交
2084
        let name = match self.pop() {
2085
            String(s) => s,
2086
            Object(mut o) => {
2087
                let n = match o.remove(&"variant".to_string()) {
2088
                    Some(String(s)) => s,
2089
                    Some(val) => {
A
Adolfo Ochagavía 已提交
2090
                        return Err(ExpectedError("String".to_string(), format!("{}", val)))
2091 2092
                    }
                    None => {
2093
                        return Err(MissingFieldError("variant".to_string()))
2094
                    }
2095
                };
2096
                match o.remove(&"fields".to_string()) {
2097
                    Some(List(l)) => {
A
Aaron Turon 已提交
2098
                        for field in l.into_iter().rev() {
A
Adolfo Ochagavía 已提交
2099
                            self.stack.push(field);
2100 2101
                        }
                    },
2102
                    Some(val) => {
A
Adolfo Ochagavía 已提交
2103
                        return Err(ExpectedError("List".to_string(), format!("{}", val)))
2104 2105
                    }
                    None => {
2106
                        return Err(MissingFieldError("fields".to_string()))
2107
                    }
2108
                }
2109
                n
2110
            }
2111
            json => {
A
Adolfo Ochagavía 已提交
2112
                return Err(ExpectedError("String or Object".to_string(), format!("{}", json)))
2113
            }
2114
        };
2115
        let idx = match names.iter()
A
Adolfo Ochagavía 已提交
2116
                             .position(|n| str::eq_slice(*n, name.as_slice())) {
2117
            Some(idx) => idx,
S
Sean McArthur 已提交
2118
            None => return Err(UnknownVariantError(name))
2119 2120 2121 2122
        };
        f(self, idx)
    }

S
Sean McArthur 已提交
2123 2124
    fn read_enum_variant_arg<T>(&mut self, idx: uint, f: |&mut Decoder| -> DecodeResult<T>)
                                -> DecodeResult<T> {
2125
        debug!("read_enum_variant_arg(idx={})", idx);
2126 2127 2128 2129 2130
        f(self)
    }

    fn read_enum_struct_variant<T>(&mut self,
                                   names: &[&str],
S
Sean McArthur 已提交
2131 2132
                                   f: |&mut Decoder, uint| -> DecodeResult<T>)
                                   -> DecodeResult<T> {
2133
        debug!("read_enum_struct_variant(names={})", names);
2134 2135 2136 2137 2138 2139 2140
        self.read_enum_variant(names, f)
    }


    fn read_enum_struct_variant_field<T>(&mut self,
                                         name: &str,
                                         idx: uint,
S
Sean McArthur 已提交
2141 2142
                                         f: |&mut Decoder| -> DecodeResult<T>)
                                         -> DecodeResult<T> {
2143
        debug!("read_enum_struct_variant_field(name={}, idx={})", name, idx);
2144 2145 2146 2147 2148 2149
        self.read_enum_variant_arg(idx, f)
    }

    fn read_struct<T>(&mut self,
                      name: &str,
                      len: uint,
S
Sean McArthur 已提交
2150 2151
                      f: |&mut Decoder| -> DecodeResult<T>)
                      -> DecodeResult<T> {
2152
        debug!("read_struct(name={}, len={})", name, len);
S
Sean McArthur 已提交
2153 2154 2155
        let value = try!(f(self));
        self.pop();
        Ok(value)
2156 2157 2158 2159 2160
    }

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

2166
        let value = match obj.remove(&name.to_string()) {
2167 2168 2169 2170 2171 2172 2173 2174 2175
            None => {
                // Add a Null and try to parse it as an Option<_>
                // to get None as a default value.
                self.stack.push(Null);
                match f(self) {
                    Ok(x) => x,
                    Err(_) => return Err(MissingFieldError(name.to_string())),
                }
            },
S
Sean McArthur 已提交
2176 2177 2178
            Some(json) => {
                self.stack.push(json);
                try!(f(self))
2179
            }
S
Sean McArthur 已提交
2180 2181 2182
        };
        self.stack.push(Object(obj));
        Ok(value)
2183 2184
    }

2185 2186 2187 2188
    fn read_tuple<T>(&mut self,
                     tuple_len: uint,
                     f: |&mut Decoder| -> DecodeResult<T>)
                     -> DecodeResult<T> {
2189
        debug!("read_tuple()");
2190
        self.read_seq(|d, len| {
2191 2192 2193 2194 2195
            if len == tuple_len {
                f(d)
            } else {
                Err(ExpectedError(format!("Tuple{}", tuple_len), format!("Tuple{}", len)))
            }
2196
        })
2197 2198
    }

S
Sean McArthur 已提交
2199 2200 2201
    fn read_tuple_arg<T>(&mut self,
                         idx: uint,
                         f: |&mut Decoder| -> DecodeResult<T>) -> DecodeResult<T> {
2202
        debug!("read_tuple_arg(idx={})", idx);
2203 2204 2205 2206 2207
        self.read_seq_elt(idx, f)
    }

    fn read_tuple_struct<T>(&mut self,
                            name: &str,
2208 2209
                            len: uint,
                            f: |&mut Decoder| -> DecodeResult<T>)
S
Sean McArthur 已提交
2210
                            -> DecodeResult<T> {
2211
        debug!("read_tuple_struct(name={})", name);
2212
        self.read_tuple(len, f)
2213 2214 2215 2216
    }

    fn read_tuple_struct_arg<T>(&mut self,
                                idx: uint,
S
Sean McArthur 已提交
2217 2218
                                f: |&mut Decoder| -> DecodeResult<T>)
                                -> DecodeResult<T> {
2219
        debug!("read_tuple_struct_arg(idx={})", idx);
2220 2221 2222
        self.read_tuple_arg(idx, f)
    }

S
Sean McArthur 已提交
2223
    fn read_option<T>(&mut self, f: |&mut Decoder, bool| -> DecodeResult<T>) -> DecodeResult<T> {
2224
        debug!("read_option()");
S
Sean McArthur 已提交
2225
        match self.pop() {
2226 2227 2228 2229 2230
            Null => f(self, false),
            value => { self.stack.push(value); f(self, true) }
        }
    }

S
Sean McArthur 已提交
2231
    fn read_seq<T>(&mut self, f: |&mut Decoder, uint| -> DecodeResult<T>) -> DecodeResult<T> {
2232
        debug!("read_seq()");
S
Sean McArthur 已提交
2233 2234
        let list = try!(expect!(self.pop(), List));
        let len = list.len();
A
Aaron Turon 已提交
2235
        for v in list.into_iter().rev() {
S
Sean McArthur 已提交
2236 2237
            self.stack.push(v);
        }
2238 2239 2240
        f(self, len)
    }

S
Sean McArthur 已提交
2241 2242 2243
    fn read_seq_elt<T>(&mut self,
                       idx: uint,
                       f: |&mut Decoder| -> DecodeResult<T>) -> DecodeResult<T> {
2244
        debug!("read_seq_elt(idx={})", idx);
2245 2246 2247
        f(self)
    }

S
Sean McArthur 已提交
2248
    fn read_map<T>(&mut self, f: |&mut Decoder, uint| -> DecodeResult<T>) -> DecodeResult<T> {
2249
        debug!("read_map()");
S
Sean McArthur 已提交
2250 2251
        let obj = try!(expect!(self.pop(), Object));
        let len = obj.len();
A
Aaron Turon 已提交
2252
        for (key, value) in obj.into_iter() {
S
Sean McArthur 已提交
2253 2254 2255
            self.stack.push(value);
            self.stack.push(String(key));
        }
2256 2257 2258
        f(self, len)
    }

S
Sean McArthur 已提交
2259 2260
    fn read_map_elt_key<T>(&mut self, idx: uint, f: |&mut Decoder| -> DecodeResult<T>)
                           -> DecodeResult<T> {
2261
        debug!("read_map_elt_key(idx={})", idx);
2262 2263 2264
        f(self)
    }

S
Sean McArthur 已提交
2265 2266
    fn read_map_elt_val<T>(&mut self, idx: uint, f: |&mut Decoder| -> DecodeResult<T>)
                           -> DecodeResult<T> {
2267
        debug!("read_map_elt_val(idx={})", idx);
2268 2269
        f(self)
    }
2270 2271 2272 2273

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

2276
/// A trait for converting values to JSON
J
Jorge Aparicio 已提交
2277
pub trait ToJson for Sized? {
2278 2279 2280
    /// Converts the value of `self` to an instance of JSON
    fn to_json(&self) -> Json;
}
2281

2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292
macro_rules! to_json_impl_i64(
    ($($t:ty), +) => (
        $(impl ToJson for $t {
            fn to_json(&self) -> Json { I64(*self as i64) }
        })+
    )
)

to_json_impl_i64!(int, i8, i16, i32, i64)

macro_rules! to_json_impl_u64(
A
Adolfo Ochagavía 已提交
2293 2294
    ($($t:ty), +) => (
        $(impl ToJson for $t {
2295
            fn to_json(&self) -> Json { U64(*self as u64) }
A
Adolfo Ochagavía 已提交
2296 2297 2298
        })+
    )
)
2299

2300
to_json_impl_u64!(uint, u8, u16, u32, u64)
2301

A
Adolfo Ochagavía 已提交
2302 2303
impl ToJson for Json {
    fn to_json(&self) -> Json { self.clone() }
2304 2305
}

2306
impl ToJson for f32 {
M
mrec 已提交
2307
    fn to_json(&self) -> Json { (*self as f64).to_json() }
2308 2309
}

2310
impl ToJson for f64 {
M
mrec 已提交
2311 2312 2313
    fn to_json(&self) -> Json {
        match self.classify() {
            FPNaN | FPInfinite => Null,
2314
            _                  => F64(*self)
M
mrec 已提交
2315 2316
        }
    }
2317 2318
}

2319
impl ToJson for () {
B
Ben Striegel 已提交
2320
    fn to_json(&self) -> Json { Null }
2321 2322
}

2323
impl ToJson for bool {
B
Ben Striegel 已提交
2324
    fn to_json(&self) -> Json { Boolean(*self) }
2325 2326
}

2327 2328 2329 2330
impl ToJson for str {
    fn to_json(&self) -> Json { String(self.into_string()) }
}

2331
impl ToJson for string::String {
2332
    fn to_json(&self) -> Json { String((*self).clone()) }
2333 2334
}

2335 2336 2337 2338 2339 2340 2341 2342 2343
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]
2344
            #[allow(non_snake_case)]
2345 2346 2347 2348
            fn to_json(&self) -> Json {
                match *self {
                    ($(ref $tyvar),*,) => List(vec![$($tyvar.to_json()),*])
                }
A
Adolfo Ochagavía 已提交
2349
            }
2350
        }
2351 2352 2353
    }
}

2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365
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}
2366

J
Jorge Aparicio 已提交
2367
impl<A: ToJson> ToJson for [A] {
2368 2369 2370
    fn to_json(&self) -> Json { List(self.iter().map(|elt| elt.to_json()).collect()) }
}

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

2375
impl<A: ToJson> ToJson for TreeMap<string::String, A> {
B
Ben Striegel 已提交
2376
    fn to_json(&self) -> Json {
2377
        let mut d = TreeMap::new();
D
Daniel Micay 已提交
2378
        for (key, value) in self.iter() {
2379
            d.insert((*key).clone(), value.to_json());
2380
        }
A
Adolfo Ochagavía 已提交
2381
        Object(d)
2382 2383 2384
    }
}

2385
impl<A: ToJson> ToJson for HashMap<string::String, A> {
G
Graydon Hoare 已提交
2386
    fn to_json(&self) -> Json {
2387
        let mut d = TreeMap::new();
D
Daniel Micay 已提交
2388
        for (key, value) in self.iter() {
2389
            d.insert((*key).clone(), value.to_json());
G
Graydon Hoare 已提交
2390
        }
A
Adolfo Ochagavía 已提交
2391
        Object(d)
G
Graydon Hoare 已提交
2392 2393 2394
    }
}

2395
impl<A:ToJson> ToJson for Option<A> {
B
Ben Striegel 已提交
2396 2397
    fn to_json(&self) -> Json {
        match *self {
A
Adolfo Ochagavía 已提交
2398 2399
            None => Null,
            Some(ref value) => value.to_json()
2400 2401 2402 2403
        }
    }
}

2404
impl fmt::Show for Json {
2405
    /// Encodes a json value into a string
2406
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
A
Alex Crichton 已提交
2407
        self.to_writer(f).map_err(|_| fmt::WriteError)
2408
    }
2409 2410
}

B
Brendan Zabarauskas 已提交
2411
impl FromStr for Json {
A
Adolfo Ochagavía 已提交
2412 2413 2414 2415 2416
    fn from_str(s: &str) -> Option<Json> {
        from_str(s).ok()
    }
}

2417 2418
#[cfg(test)]
mod tests {
2419
    extern crate test;
S
Steven Fackler 已提交
2420 2421
    use self::Animal::*;
    use self::DecodeEnum::*;
2422
    use self::test::Bencher;
A
Alex Crichton 已提交
2423
    use {Encodable, Decodable};
2424
    use super::{List, Encoder, Decoder, Error, Boolean, I64, U64, F64, String, Null,
S
Sean McArthur 已提交
2425
                PrettyEncoder, Object, Json, from_str, ParseError, ExpectedError,
2426 2427
                MissingFieldError, UnknownVariantError, DecodeResult, DecoderError,
                JsonEvent, Parser, StackElement,
2428 2429
                ObjectStart, ObjectEnd, ListStart, ListEnd, BooleanValue, U64Value,
                F64Value, StringValue, NullValue, SyntaxError, Key, Index, Stack,
2430 2431
                InvalidSyntax, InvalidNumber, EOFWhileParsingObject, EOFWhileParsingList,
                EOFWhileParsingValue, EOFWhileParsingString, KeyMustBeAString, ExpectedColon,
2432
                TrailingCharacters, TrailingComma};
2433
    use std::{i64, u64, f32, f64, io};
2434
    use std::collections::TreeMap;
2435
    use std::num::Float;
2436
    use std::string;
2437

2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464
    #[deriving(Decodable, Eq, PartialEq, Show)]
    struct OptionData {
        opt: Option<uint>,
    }

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

    #[test]
    fn test_decode_option_some() {
        let s = "{ \"opt\": 10 }";
        let obj: OptionData = super::decode(s).unwrap();
        assert_eq!(obj, OptionData { opt: Some(10u) });
    }

    #[test]
    fn test_decode_option_malformed() {
        check_err::<OptionData>("{ \"opt\": [] }",
                                ExpectedError("Number".to_string(), "[]".to_string()));
        check_err::<OptionData>("{ \"opt\": false }",
                                ExpectedError("Number".to_string(), "false".to_string()));
    }

2465
    #[deriving(PartialEq, Encodable, Decodable, Show)]
2466 2467
    enum Animal {
        Dog,
2468
        Frog(string::String, int)
2469 2470
    }

2471
    #[deriving(PartialEq, Encodable, Decodable, Show)]
2472 2473 2474
    struct Inner {
        a: (),
        b: uint,
2475
        c: Vec<string::String>,
2476 2477
    }

2478
    #[deriving(PartialEq, Encodable, Decodable, Show)]
2479
    struct Outer {
K
Kevin Ballard 已提交
2480
        inner: Vec<Inner>,
2481 2482
    }

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

D
Daniel Micay 已提交
2486
        for item in items.iter() {
2487
            match *item {
2488
                (ref key, ref value) => { d.insert((*key).clone(), (*value).clone()); },
2489
            }
2490 2491
        };

L
Luqman Aden 已提交
2492
        Object(d)
2493 2494
    }

A
Adolfo Ochagavía 已提交
2495 2496 2497
    #[test]
    fn test_from_str_trait() {
        let s = "null";
B
Brendan Zabarauskas 已提交
2498
        assert!(::std::str::from_str::<Json>(s).unwrap() == from_str(s).unwrap());
A
Adolfo Ochagavía 已提交
2499 2500
    }

2501 2502
    #[test]
    fn test_write_null() {
2503
        assert_eq!(Null.to_string().into_string(), "null".to_string());
2504
        assert_eq!(Null.to_pretty_str().into_string(), "null".to_string());
2505 2506
    }

2507 2508
    #[test]
    fn test_write_i64() {
2509 2510
        assert_eq!(U64(0).to_string().into_string(), "0".to_string());
        assert_eq!(U64(0).to_pretty_str().into_string(), "0".to_string());
2511

2512 2513
        assert_eq!(U64(1234).to_string().into_string(), "1234".to_string());
        assert_eq!(U64(1234).to_pretty_str().into_string(), "1234".to_string());
2514

2515 2516
        assert_eq!(I64(-5678).to_string().into_string(), "-5678".to_string());
        assert_eq!(I64(-5678).to_pretty_str().into_string(), "-5678".to_string());
2517
    }
2518

2519
    #[test]
2520
    fn test_write_f64() {
2521 2522
        assert_eq!(F64(3.0).to_string().into_string(), "3".to_string());
        assert_eq!(F64(3.0).to_pretty_str().into_string(), "3".to_string());
2523

2524 2525
        assert_eq!(F64(3.1).to_string().into_string(), "3.1".to_string());
        assert_eq!(F64(3.1).to_pretty_str().into_string(), "3.1".to_string());
2526

2527 2528
        assert_eq!(F64(-1.5).to_string().into_string(), "-1.5".to_string());
        assert_eq!(F64(-1.5).to_pretty_str().into_string(), "-1.5".to_string());
2529

2530 2531
        assert_eq!(F64(0.5).to_string().into_string(), "0.5".to_string());
        assert_eq!(F64(0.5).to_pretty_str().into_string(), "0.5".to_string());
M
mrec 已提交
2532

2533 2534
        assert_eq!(F64(f64::NAN).to_string().into_string(), "null".to_string());
        assert_eq!(F64(f64::NAN).to_pretty_str().into_string(), "null".to_string());
M
mrec 已提交
2535

2536 2537
        assert_eq!(F64(f64::INFINITY).to_string().into_string(), "null".to_string());
        assert_eq!(F64(f64::INFINITY).to_pretty_str().into_string(), "null".to_string());
M
mrec 已提交
2538

2539 2540
        assert_eq!(F64(f64::NEG_INFINITY).to_string().into_string(), "null".to_string());
        assert_eq!(F64(f64::NEG_INFINITY).to_pretty_str().into_string(), "null".to_string());
2541 2542 2543 2544
    }

    #[test]
    fn test_write_str() {
2545
        assert_eq!(String("".to_string()).to_string().into_string(), "\"\"".to_string());
2546
        assert_eq!(String("".to_string()).to_pretty_str().into_string(), "\"\"".to_string());
2547

2548
        assert_eq!(String("foo".to_string()).to_string().into_string(), "\"foo\"".to_string());
2549
        assert_eq!(String("foo".to_string()).to_pretty_str().into_string(), "\"foo\"".to_string());
2550 2551 2552 2553
    }

    #[test]
    fn test_write_bool() {
2554
        assert_eq!(Boolean(true).to_string().into_string(), "true".to_string());
2555
        assert_eq!(Boolean(true).to_pretty_str().into_string(), "true".to_string());
2556

2557
        assert_eq!(Boolean(false).to_string().into_string(), "false".to_string());
2558
        assert_eq!(Boolean(false).to_pretty_str().into_string(), "false".to_string());
2559 2560 2561 2562
    }

    #[test]
    fn test_write_list() {
2563
        assert_eq!(List(vec![]).to_string().into_string(), "[]".to_string());
2564
        assert_eq!(List(vec![]).to_pretty_str().into_string(), "[]".to_string());
2565

2566
        assert_eq!(List(vec![Boolean(true)]).to_string().into_string(), "[true]".to_string());
2567
        assert_eq!(
2568
            List(vec![Boolean(true)]).to_pretty_str().into_string(),
2569
            "\
2570 2571
            [\n  \
                true\n\
2572
            ]".to_string()
2573
        );
2574

K
Kevin Ballard 已提交
2575
        let long_test_list = List(vec![
2576 2577
            Boolean(false),
            Null,
2578
            List(vec![String("foo\nbar".to_string()), F64(3.5)])]);
2579

2580
        assert_eq!(long_test_list.to_string().into_string(),
2581
            "[false,null,[\"foo\\nbar\",3.5]]".to_string());
2582
        assert_eq!(
2583
            long_test_list.to_pretty_str().into_string(),
2584
            "\
2585 2586 2587 2588 2589 2590 2591
            [\n  \
                false,\n  \
                null,\n  \
                [\n    \
                    \"foo\\nbar\",\n    \
                    3.5\n  \
                ]\n\
2592
            ]".to_string()
2593 2594 2595
        );
    }

2596
    #[test]
2597
    fn test_write_object() {
N
Nick Cameron 已提交
2598 2599
        assert_eq!(mk_object(&[]).to_string().into_string(), "{}".to_string());
        assert_eq!(mk_object(&[]).to_pretty_str().into_string(), "{}".to_string());
2600

2601
        assert_eq!(
N
Nick Cameron 已提交
2602
            mk_object(&[
2603
                ("a".to_string(), Boolean(true))
2604
            ]).to_string().into_string(),
2605
            "{\"a\":true}".to_string()
2606
        );
2607
        assert_eq!(
N
Nick Cameron 已提交
2608
            mk_object(&[("a".to_string(), Boolean(true))]).to_pretty_str(),
2609
            "\
2610 2611
            {\n  \
                \"a\": true\n\
2612
            }".to_string()
2613 2614
        );

N
Nick Cameron 已提交
2615
        let complex_obj = mk_object(&[
2616
                ("b".to_string(), List(vec![
N
Nick Cameron 已提交
2617 2618
                    mk_object(&[("c".to_string(), String("\x0c\r".to_string()))]),
                    mk_object(&[("d".to_string(), String("".to_string()))])
2619
                ]))
2620 2621 2622
            ]);

        assert_eq!(
2623
            complex_obj.to_string().into_string(),
2624
            "{\
2625 2626 2627 2628
                \"b\":[\
                    {\"c\":\"\\f\\r\"},\
                    {\"d\":\"\"}\
                ]\
2629
            }".to_string()
2630 2631
        );
        assert_eq!(
2632
            complex_obj.to_pretty_str().into_string(),
2633
            "\
2634 2635 2636 2637 2638 2639 2640 2641 2642
            {\n  \
                \"b\": [\n    \
                    {\n      \
                        \"c\": \"\\f\\r\"\n    \
                    },\n    \
                    {\n      \
                        \"d\": \"\"\n    \
                    }\n  \
                ]\n\
2643
            }".to_string()
2644
        );
2645

N
Nick Cameron 已提交
2646
        let a = mk_object(&[
2647 2648
            ("a".to_string(), Boolean(true)),
            ("b".to_string(), List(vec![
N
Nick Cameron 已提交
2649 2650
                mk_object(&[("c".to_string(), String("\x0c\r".to_string()))]),
                mk_object(&[("d".to_string(), String("".to_string()))])
2651
            ]))
G
Graydon Hoare 已提交
2652
        ]);
2653

2654 2655
        // We can't compare the strings directly because the object fields be
        // printed in a different order.
2656
        assert_eq!(a.clone(), from_str(a.to_string().as_slice()).unwrap());
2657 2658
        assert_eq!(a.clone(),
                   from_str(a.to_pretty_str().as_slice()).unwrap());
2659 2660
    }

2661
    fn with_str_writer(f: |&mut io::Writer|) -> string::String {
A
Alex Crichton 已提交
2662
        use std::io::MemWriter;
A
Alex Crichton 已提交
2663 2664
        use std::str;

2665 2666
        let mut m = MemWriter::new();
        f(&mut m as &mut io::Writer);
2667
        str::from_utf8(m.unwrap().as_slice()).unwrap().to_string()
A
Alex Crichton 已提交
2668 2669
    }

2670
    #[test]
2671
    fn test_write_enum() {
2672
        let animal = Dog;
2673
        assert_eq!(
A
Adolfo Ochagavía 已提交
2674 2675
            with_str_writer(|writer| {
                let mut encoder = Encoder::new(writer);
S
Sean McArthur 已提交
2676
                animal.encode(&mut encoder).unwrap();
2677
            }),
2678
            "\"Dog\"".to_string()
2679 2680
        );
        assert_eq!(
A
Adolfo Ochagavía 已提交
2681 2682
            with_str_writer(|writer| {
                let mut encoder = PrettyEncoder::new(writer);
S
Sean McArthur 已提交
2683
                animal.encode(&mut encoder).unwrap();
2684
            }),
2685
            "\"Dog\"".to_string()
2686
        );
2687

2688
        let animal = Frog("Henry".to_string(), 349);
2689
        assert_eq!(
A
Adolfo Ochagavía 已提交
2690 2691
            with_str_writer(|writer| {
                let mut encoder = Encoder::new(writer);
S
Sean McArthur 已提交
2692
                animal.encode(&mut encoder).unwrap();
2693
            }),
2694
            "{\"variant\":\"Frog\",\"fields\":[\"Henry\",349]}".to_string()
2695 2696
        );
        assert_eq!(
A
Adolfo Ochagavía 已提交
2697 2698
            with_str_writer(|writer| {
                let mut encoder = PrettyEncoder::new(writer);
S
Sean McArthur 已提交
2699
                animal.encode(&mut encoder).unwrap();
2700
            }),
2701 2702 2703 2704 2705 2706 2707
            "{\n  \
               \"variant\": \"Frog\",\n  \
               \"fields\": [\n    \
                 \"Henry\",\n    \
                 349\n  \
               ]\n\
             }".to_string()
2708
        );
2709 2710 2711
    }

    #[test]
2712
    fn test_write_some() {
2713
        let value = Some("jodhpurs".to_string());
A
Adolfo Ochagavía 已提交
2714 2715
        let s = with_str_writer(|writer| {
            let mut encoder = Encoder::new(writer);
S
Sean McArthur 已提交
2716
            value.encode(&mut encoder).unwrap();
2717
        });
2718
        assert_eq!(s, "\"jodhpurs\"".to_string());
2719

2720
        let value = Some("jodhpurs".to_string());
A
Adolfo Ochagavía 已提交
2721 2722
        let s = with_str_writer(|writer| {
            let mut encoder = PrettyEncoder::new(writer);
S
Sean McArthur 已提交
2723
            value.encode(&mut encoder).unwrap();
2724
        });
2725
        assert_eq!(s, "\"jodhpurs\"".to_string());
2726 2727
    }

2728
    #[test]
2729
    fn test_write_none() {
2730
        let value: Option<string::String> = None;
A
Adolfo Ochagavía 已提交
2731 2732
        let s = with_str_writer(|writer| {
            let mut encoder = Encoder::new(writer);
S
Sean McArthur 已提交
2733
            value.encode(&mut encoder).unwrap();
2734
        });
2735
        assert_eq!(s, "null".to_string());
J
John Clements 已提交
2736

A
Adolfo Ochagavía 已提交
2737 2738
        let s = with_str_writer(|writer| {
            let mut encoder = Encoder::new(writer);
S
Sean McArthur 已提交
2739
            value.encode(&mut encoder).unwrap();
2740
        });
2741
        assert_eq!(s, "null".to_string());
2742 2743
    }

2744
    #[test]
2745
    fn test_trailing_characters() {
2746 2747 2748 2749 2750 2751
        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)));
2752 2753 2754 2755
    }

    #[test]
    fn test_read_identifiers() {
2756 2757 2758 2759 2760 2761
        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)));
2762

E
Erick Tryzelaar 已提交
2763 2764 2765 2766 2767 2768
        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)));
2769 2770
    }

2771 2772
    #[test]
    fn test_decode_identifiers() {
2773
        let v: () = super::decode("null").unwrap();
2774 2775
        assert_eq!(v, ());

2776
        let v: bool = super::decode("true").unwrap();
2777 2778
        assert_eq!(v, true);

2779
        let v: bool = super::decode("false").unwrap();
2780 2781 2782
        assert_eq!(v, false);
    }

2783
    #[test]
2784
    fn test_read_number() {
2785 2786
        assert_eq!(from_str("+"),   Err(SyntaxError(InvalidSyntax, 1, 1)));
        assert_eq!(from_str("."),   Err(SyntaxError(InvalidSyntax, 1, 1)));
M
mrec 已提交
2787
        assert_eq!(from_str("NaN"), Err(SyntaxError(InvalidSyntax, 1, 1)));
2788 2789 2790 2791 2792
        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)));
2793

2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808
        assert_eq!(from_str("18446744073709551616"), Err(SyntaxError(InvalidNumber, 1, 20)));
        assert_eq!(from_str("-9223372036854775809"), Err(SyntaxError(InvalidNumber, 1, 21)));

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

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

2811 2812
    #[test]
    fn test_decode_numbers() {
2813
        let v: f64 = super::decode("3").unwrap();
D
Daniel Micay 已提交
2814
        assert_eq!(v, 3.0);
2815

2816
        let v: f64 = super::decode("3.1").unwrap();
D
Daniel Micay 已提交
2817
        assert_eq!(v, 3.1);
2818

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

2822
        let v: f64 = super::decode("0.4").unwrap();
D
Daniel Micay 已提交
2823
        assert_eq!(v, 0.4);
2824

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

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

2831
        let v: f64 = super::decode("0.4e-01").unwrap();
D
Daniel Micay 已提交
2832
        assert_eq!(v, 0.4e-01);
2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844

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

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

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

        let v: i64 = super::decode("9223372036854775807").unwrap();
        assert_eq!(v, i64::MAX);
2845 2846
    }

G
Gary Linscott 已提交
2847
    #[test]
2848
    fn test_read_str() {
2849 2850 2851
        assert_eq!(from_str("\""),    Err(SyntaxError(EOFWhileParsingString, 1, 2)));
        assert_eq!(from_str("\"lol"), Err(SyntaxError(EOFWhileParsingString, 1, 5)));

2852 2853 2854 2855 2856 2857 2858 2859 2860 2861
        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())));
2862 2863
    }

2864
    #[test]
2865
    fn test_decode_str() {
2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876
        let s = [("\"\"", ""),
                 ("\"foo\"", "foo"),
                 ("\"\\\"\"", "\""),
                 ("\"\\b\"", "\x08"),
                 ("\"\\n\"", "\n"),
                 ("\"\\r\"", "\r"),
                 ("\"\\t\"", "\t"),
                 ("\"\\u12ab\"", "\u12ab"),
                 ("\"\\uAB12\"", "\uAB12")];

        for &(i, o) in s.iter() {
2877
            let v: string::String = super::decode(i).unwrap();
2878 2879
            assert_eq!(v.as_slice(), o);
        }
2880 2881
    }

2882
    #[test]
2883
    fn test_read_list() {
2884 2885 2886 2887 2888
        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)));
2889

K
Kevin Ballard 已提交
2890 2891 2892 2893 2894
        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 已提交
2895
        assert_eq!(from_str("[3, 1]"),
2896
                     Ok(List(vec![U64(3), U64(1)])));
E
Erick Tryzelaar 已提交
2897
        assert_eq!(from_str("\n[3, 2]\n"),
2898
                     Ok(List(vec![U64(3), U64(2)])));
E
Erick Tryzelaar 已提交
2899
        assert_eq!(from_str("[2, [4, 1]]"),
2900
               Ok(List(vec![U64(2), List(vec![U64(4), U64(1)])])));
2901 2902
    }

2903 2904
    #[test]
    fn test_decode_list() {
2905
        let v: Vec<()> = super::decode("[]").unwrap();
K
Kevin Ballard 已提交
2906
        assert_eq!(v, vec![]);
2907

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

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

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

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

2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936
    #[test]
    fn test_decode_tuple() {
        let t: (uint, uint, uint) = super::decode("[1, 2, 3]").unwrap();
        assert_eq!(t, (1u, 2, 3))

        let t: (uint, string::String) = super::decode("[1, \"two\"]").unwrap();
        assert_eq!(t, (1u, "two".to_string()));
    }

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

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

2940
    #[test]
2941
    fn test_read_object() {
2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953
        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)));
2954

N
Nick Cameron 已提交
2955
        assert_eq!(from_str("{}").unwrap(), mk_object(&[]));
E
Erick Tryzelaar 已提交
2956
        assert_eq!(from_str("{\"a\": 3}").unwrap(),
N
Nick Cameron 已提交
2957
                  mk_object(&[("a".to_string(), U64(3))]));
2958

E
Erick Tryzelaar 已提交
2959 2960
        assert_eq!(from_str(
                      "{ \"a\": null, \"b\" : true }").unwrap(),
N
Nick Cameron 已提交
2961
                  mk_object(&[
2962 2963
                      ("a".to_string(), Null),
                      ("b".to_string(), Boolean(true))]));
E
Erick Tryzelaar 已提交
2964
        assert_eq!(from_str("\n{ \"a\": null, \"b\" : true }\n").unwrap(),
N
Nick Cameron 已提交
2965
                  mk_object(&[
2966 2967
                      ("a".to_string(), Null),
                      ("b".to_string(), Boolean(true))]));
E
Erick Tryzelaar 已提交
2968 2969
        assert_eq!(from_str(
                      "{\"a\" : 1.0 ,\"b\": [ true ]}").unwrap(),
N
Nick Cameron 已提交
2970
                  mk_object(&[
2971
                      ("a".to_string(), F64(1.0)),
2972
                      ("b".to_string(), List(vec![Boolean(true)]))
2973
                  ]));
E
Erick Tryzelaar 已提交
2974
        assert_eq!(from_str(
2975 2976 2977 2978 2979 2980 2981 2982
                      "{\
                          \"a\": 1.0, \
                          \"b\": [\
                              true,\
                              \"foo\\nbar\", \
                              { \"c\": {\"d\": null} } \
                          ]\
                      }").unwrap(),
N
Nick Cameron 已提交
2983
                  mk_object(&[
2984
                      ("a".to_string(), F64(1.0)),
2985
                      ("b".to_string(), List(vec![
B
Ben Striegel 已提交
2986
                          Boolean(true),
2987
                          String("foo\nbar".to_string()),
N
Nick Cameron 已提交
2988 2989
                          mk_object(&[
                              ("c".to_string(), mk_object(&[("d".to_string(), Null)]))
2990 2991
                          ])
                      ]))
2992
                  ]));
2993 2994
    }

2995
    #[test]
2996
    fn test_decode_struct() {
2997
        let s = "{
2998 2999 3000
            \"inner\": [
                { \"a\": null, \"b\": 2, \"c\": [\"abc\", \"xyz\"] }
            ]
3001
        }";
3002 3003

        let v: Outer = super::decode(s).unwrap();
3004 3005 3006
        assert_eq!(
            v,
            Outer {
K
Kevin Ballard 已提交
3007
                inner: vec![
3008
                    Inner { a: (), b: 2, c: vec!["abc".to_string(), "xyz".to_string()] }
3009 3010 3011 3012 3013
                ]
            }
        );
    }

M
mrec 已提交
3014 3015 3016 3017 3018 3019 3020
    #[deriving(Decodable)]
    struct FloatStruct {
        f: f64,
        a: Vec<f64>
    }
    #[test]
    fn test_decode_struct_with_nan() {
3021 3022 3023
        let s = "{\"f\":null,\"a\":[null,123]}";
        let obj: FloatStruct = super::decode(s).unwrap();
        assert!(obj.f.is_nan());
N
NODA, Kai 已提交
3024 3025
        assert!(obj.a[0].is_nan());
        assert_eq!(obj.a[1], 123f64);
M
mrec 已提交
3026 3027
    }

3028 3029
    #[test]
    fn test_decode_option() {
3030
        let value: Option<string::String> = super::decode("null").unwrap();
3031 3032
        assert_eq!(value, None);

3033
        let value: Option<string::String> = super::decode("\"jodhpurs\"").unwrap();
3034
        assert_eq!(value, Some("jodhpurs".to_string()));
3035 3036
    }

3037
    #[test]
3038
    fn test_decode_enum() {
3039
        let value: Animal = super::decode("\"Dog\"").unwrap();
3040 3041
        assert_eq!(value, Dog);

3042
        let s = "{\"variant\":\"Frog\",\"fields\":[\"Henry\",349]}";
3043
        let value: Animal = super::decode(s).unwrap();
3044
        assert_eq!(value, Frog("Henry".to_string(), 349));
3045 3046
    }

3047
    #[test]
3048
    fn test_decode_map() {
3049
        let s = "{\"a\": \"Dog\", \"b\": {\"variant\":\"Frog\",\
3050
                  \"fields\":[\"Henry\", 349]}}";
3051
        let mut map: TreeMap<string::String, Animal> = super::decode(s).unwrap();
3052

3053 3054
        assert_eq!(map.remove(&"a".to_string()), Some(Dog));
        assert_eq!(map.remove(&"b".to_string()), Some(Frog("Henry".to_string(), 349)));
3055 3056
    }

3057
    #[test]
3058
    fn test_multiline_errors() {
E
Erick Tryzelaar 已提交
3059
        assert_eq!(from_str("{\n  \"foo\":\n \"bar\""),
3060
            Err(SyntaxError(EOFWhileParsingObject, 3u, 8u)));
3061
    }
3062 3063

    #[deriving(Decodable)]
M
mrec 已提交
3064
    #[allow(dead_code)]
3065 3066 3067
    struct DecodeStruct {
        x: f64,
        y: bool,
3068
        z: string::String,
K
Kevin Ballard 已提交
3069
        w: Vec<DecodeStruct>
3070 3071 3072 3073
    }
    #[deriving(Decodable)]
    enum DecodeEnum {
        A(f64),
3074
        B(string::String)
3075
    }
3076 3077
    fn check_err<T: Decodable<Decoder, DecoderError>>(to_parse: &'static str,
                                                      expected: DecoderError) {
S
Sean McArthur 已提交
3078
        let res: DecodeResult<T> = match from_str(to_parse) {
3079
            Err(e) => Err(ParseError(e)),
S
Sean McArthur 已提交
3080 3081
            Ok(json) => Decodable::decode(&mut Decoder::new(json))
        };
3082
        match res {
S
Steve Klabnik 已提交
3083
            Ok(_) => panic!("`{}` parsed & decoded ok, expecting error `{}`",
S
Sean McArthur 已提交
3084
                              to_parse, expected),
S
Steve Klabnik 已提交
3085
            Err(ParseError(e)) => panic!("`{}` is not valid json: {}",
S
Sean McArthur 已提交
3086
                                           to_parse, e),
3087
            Err(e) => {
S
Sean McArthur 已提交
3088
                assert_eq!(e, expected);
3089 3090 3091 3092 3093
            }
        }
    }
    #[test]
    fn test_decode_errors_struct() {
3094
        check_err::<DecodeStruct>("[]", ExpectedError("Object".to_string(), "[]".to_string()));
3095
        check_err::<DecodeStruct>("{\"x\": true, \"y\": true, \"z\": \"\", \"w\": []}",
3096
                                  ExpectedError("Number".to_string(), "true".to_string()));
3097
        check_err::<DecodeStruct>("{\"x\": 1, \"y\": [], \"z\": \"\", \"w\": []}",
3098
                                  ExpectedError("Boolean".to_string(), "[]".to_string()));
3099
        check_err::<DecodeStruct>("{\"x\": 1, \"y\": true, \"z\": {}, \"w\": []}",
3100
                                  ExpectedError("String".to_string(), "{}".to_string()));
3101
        check_err::<DecodeStruct>("{\"x\": 1, \"y\": true, \"z\": \"\", \"w\": null}",
3102
                                  ExpectedError("List".to_string(), "null".to_string()));
3103
        check_err::<DecodeStruct>("{\"x\": 1, \"y\": true, \"z\": \"\"}",
3104
                                  MissingFieldError("w".to_string()));
3105 3106 3107 3108
    }
    #[test]
    fn test_decode_errors_enum() {
        check_err::<DecodeEnum>("{}",
3109
                                MissingFieldError("variant".to_string()));
3110
        check_err::<DecodeEnum>("{\"variant\": 1}",
3111
                                ExpectedError("String".to_string(), "1".to_string()));
3112
        check_err::<DecodeEnum>("{\"variant\": \"A\"}",
3113
                                MissingFieldError("fields".to_string()));
3114
        check_err::<DecodeEnum>("{\"variant\": \"A\", \"fields\": null}",
3115
                                ExpectedError("List".to_string(), "null".to_string()));
3116
        check_err::<DecodeEnum>("{\"variant\": \"C\", \"fields\": []}",
3117
                                UnknownVariantError("C".to_string()));
3118
    }
3119 3120 3121 3122

    #[test]
    fn test_find(){
        let json_value = from_str("{\"dog\" : \"cat\"}").unwrap();
3123 3124
        let found_str = json_value.find("dog");
        assert!(found_str.unwrap().as_string().unwrap() == "cat");
3125 3126 3127 3128 3129
    }

    #[test]
    fn test_find_path(){
        let json_value = from_str("{\"dog\":{\"cat\": {\"mouse\" : \"cheese\"}}}").unwrap();
3130 3131
        let found_str = json_value.find_path(&["dog", "cat", "mouse"]);
        assert!(found_str.unwrap().as_string().unwrap() == "cheese");
3132 3133 3134 3135 3136
    }

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

3141 3142 3143 3144 3145 3146 3147 3148 3149
    #[test]
    fn test_index(){
        let json_value = from_str("{\"animals\":[\"dog\",\"cat\",\"mouse\"]}").unwrap();
        let ref list = json_value["animals"];
        assert_eq!(list[0].as_string().unwrap(), "dog");
        assert_eq!(list[1].as_string().unwrap(), "cat");
        assert_eq!(list[2].as_string().unwrap(), "mouse");
    }

3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177
    #[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]
3178
    fn test_is_string(){
3179
        let json_value = from_str("\"dog\"").unwrap();
3180
        assert!(json_value.is_string());
3181 3182 3183
    }

    #[test]
3184
    fn test_as_string(){
3185
        let json_value = from_str("\"dog\"").unwrap();
3186
        let json_str = json_value.as_string();
3187
        let expected_str = "dog";
3188 3189 3190 3191 3192 3193 3194 3195 3196 3197
        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]
3198
    fn test_is_i64(){
3199
        let json_value = from_str("-12").unwrap();
3200 3201
        assert!(json_value.is_i64());

3202 3203 3204
        let json_value = from_str("12").unwrap();
        assert!(!json_value.is_i64());

3205 3206 3207 3208
        let json_value = from_str("12.0").unwrap();
        assert!(!json_value.is_i64());
    }

3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220
    #[test]
    fn test_is_u64(){
        let json_value = from_str("12").unwrap();
        assert!(json_value.is_u64());

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

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

3221 3222
    #[test]
    fn test_is_f64(){
3223
        let json_value = from_str("12").unwrap();
3224 3225
        assert!(!json_value.is_f64());

3226 3227 3228
        let json_value = from_str("-12").unwrap();
        assert!(!json_value.is_f64());

3229 3230
        let json_value = from_str("12.0").unwrap();
        assert!(json_value.is_f64());
3231 3232 3233

        let json_value = from_str("-12.0").unwrap();
        assert!(json_value.is_f64());
3234 3235 3236 3237
    }

    #[test]
    fn test_as_i64(){
3238
        let json_value = from_str("-12").unwrap();
3239
        let json_num = json_value.as_i64();
3240 3241 3242 3243 3244 3245 3246
        assert_eq!(json_num, Some(-12));
    }

    #[test]
    fn test_as_u64(){
        let json_value = from_str("12").unwrap();
        let json_num = json_value.as_u64();
3247 3248 3249 3250 3251 3252 3253 3254
        assert_eq!(json_num, Some(12));
    }

    #[test]
    fn test_as_f64(){
        let json_value = from_str("12.0").unwrap();
        let json_num = json_value.as_f64();
        assert_eq!(json_num, Some(12f64));
3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283
    }

    #[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);
    }
3284 3285 3286 3287 3288 3289

    #[test]
    fn test_encode_hashmap_with_numeric_key() {
        use std::str::from_utf8;
        use std::io::Writer;
        use std::io::MemWriter;
3290
        use std::collections::HashMap;
3291 3292 3293 3294 3295
        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 已提交
3296
            hm.encode(&mut encoder).unwrap();
3297 3298
        }
        let bytes = mem_buf.unwrap();
S
Steven Fackler 已提交
3299
        let json_str = from_utf8(bytes.as_slice()).unwrap();
3300
        match from_str(json_str) {
S
Steve Klabnik 已提交
3301
            Err(_) => panic!("Unable to parse json_str: {}", json_str),
3302 3303 3304
            _ => {} // it parsed and we are good to go
        }
    }
3305

3306 3307 3308 3309 3310
    #[test]
    fn test_prettyencode_hashmap_with_numeric_key() {
        use std::str::from_utf8;
        use std::io::Writer;
        use std::io::MemWriter;
3311
        use std::collections::HashMap;
3312 3313 3314 3315 3316
        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);
3317
            hm.encode(&mut encoder).unwrap()
3318 3319
        }
        let bytes = mem_buf.unwrap();
S
Steven Fackler 已提交
3320
        let json_str = from_utf8(bytes.as_slice()).unwrap();
3321
        match from_str(json_str) {
S
Steve Klabnik 已提交
3322
            Err(_) => panic!("Unable to parse json_str: {}", json_str),
3323 3324 3325
            _ => {} // it parsed and we are good to go
        }
    }
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 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383
    #[test]
    fn test_prettyencoder_indent_level_param() {
        use std::str::from_utf8;
        use std::io::MemWriter;
        use std::collections::TreeMap;

        let mut tree = TreeMap::new();

        tree.insert("hello".into_string(), String("guten tag".into_string()));
        tree.insert("goodbye".into_string(), String("sayonara".into_string()));

        let json = List(
            // The following layout below should look a lot like
            // the pretty-printed JSON (indent * x)
            vec!
            ( // 0x
                String("greetings".into_string()), // 1x
                Object(tree), // 1x + 2x + 2x + 1x
            ) // 0x
            // End JSON list (7 lines)
        );

        // Helper function for counting indents
        fn indents(source: &str) -> uint {
            let trimmed = source.trim_left_chars(' ');
            source.len() - trimmed.len()
        }

        // Test up to 4 spaces of indents (more?)
        for i in range(0, 4u) {
            let mut writer = MemWriter::new();
            {
                let ref mut encoder = PrettyEncoder::new(&mut writer);
                encoder.set_indent(i);
                json.encode(encoder).unwrap();
            }

            let bytes = writer.unwrap();
            let printed = from_utf8(bytes.as_slice()).unwrap();

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

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

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

3384 3385
    #[test]
    fn test_hashmap_with_numeric_key_can_handle_double_quote_delimited_key() {
3386
        use std::collections::HashMap;
3387 3388 3389
        use Decodable;
        let json_str = "{\"1\":true}";
        let json_obj = match from_str(json_str) {
S
Steve Klabnik 已提交
3390
            Err(_) => panic!("Unable to parse json_str: {}", json_str),
3391 3392 3393
            Ok(o) => o
        };
        let mut decoder = Decoder::new(json_obj);
S
Sean McArthur 已提交
3394
        let _hm: HashMap<uint, bool> = Decodable::decode(&mut decoder).unwrap();
3395
    }
3396

3397 3398 3399 3400 3401 3402
    #[test]
    fn test_hashmap_with_numeric_key_will_error_with_string_keys() {
        use std::collections::HashMap;
        use Decodable;
        let json_str = "{\"a\":true}";
        let json_obj = match from_str(json_str) {
S
Steve Klabnik 已提交
3403
            Err(_) => panic!("Unable to parse json_str: {}", json_str),
3404 3405 3406 3407 3408 3409 3410
            Ok(o) => o
        };
        let mut decoder = Decoder::new(json_obj);
        let result: Result<HashMap<uint, bool>, DecoderError> = Decodable::decode(&mut decoder);
        assert_eq!(result, Err(ExpectedError("Number".to_string(), "a".to_string())));
    }

3411 3412
    fn assert_stream_equal(src: &str,
                           expected: Vec<(JsonEvent, Vec<StackElement>)>) {
3413 3414 3415 3416 3417 3418 3419
        let mut parser = Parser::new(src.chars());
        let mut i = 0;
        loop {
            let evt = match parser.next() {
                Some(e) => e,
                None => { break; }
            };
E
Erick Tryzelaar 已提交
3420
            let (ref expected_evt, ref expected_stack) = expected[i];
3421
            if !parser.stack().is_equal_to(expected_stack.as_slice()) {
S
Steve Klabnik 已提交
3422
                panic!("Parser stack is not equal to {}", expected_stack);
3423 3424 3425 3426 3427 3428
            }
            assert_eq!(&evt, expected_evt);
            i+=1;
        }
    }
    #[test]
S
Steven Fackler 已提交
3429
    #[cfg_attr(target_word_size = "32", ignore)] // FIXME(#14064)
3430 3431
    fn test_streaming_parser() {
        assert_stream_equal(
3432
            r#"{ "foo":"bar", "array" : [0, 1, 2, 3, 4, 5], "idents":[null,true,false]}"#,
3433 3434 3435 3436
            vec![
                (ObjectStart,             vec![]),
                  (StringValue("bar".to_string()),   vec![Key("foo")]),
                  (ListStart,             vec![Key("array")]),
3437 3438 3439 3440 3441 3442
                    (U64Value(0),         vec![Key("array"), Index(0)]),
                    (U64Value(1),         vec![Key("array"), Index(1)]),
                    (U64Value(2),         vec![Key("array"), Index(2)]),
                    (U64Value(3),         vec![Key("array"), Index(3)]),
                    (U64Value(4),         vec![Key("array"), Index(4)]),
                    (U64Value(5),         vec![Key("array"), Index(5)]),
3443 3444 3445 3446 3447 3448 3449
                  (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![]),
3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462
            ]
        );
    }
    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,
            }
        }
    }
3463

3464
    #[test]
S
Steven Fackler 已提交
3465
    #[cfg_attr(target_word_size = "32", ignore)] // FIXME(#14064)
3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477
    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)));
3478
        assert_eq!(last_event("{\"a\":1,}"), Error(SyntaxError(TrailingComma, 1, 8)));
3479 3480 3481

        assert_stream_equal(
            "{}",
3482
            vec![(ObjectStart, vec![]), (ObjectEnd, vec![])]
3483 3484 3485
        );
        assert_stream_equal(
            "{\"a\": 3}",
3486 3487
            vec![
                (ObjectStart,        vec![]),
3488
                  (U64Value(3),      vec![Key("a")]),
3489
                (ObjectEnd,          vec![]),
3490 3491 3492 3493
            ]
        );
        assert_stream_equal(
            "{ \"a\": null, \"b\" : true }",
3494 3495 3496 3497 3498
            vec![
                (ObjectStart,           vec![]),
                  (NullValue,           vec![Key("a")]),
                  (BooleanValue(true),  vec![Key("b")]),
                (ObjectEnd,             vec![]),
3499 3500 3501 3502
            ]
        );
        assert_stream_equal(
            "{\"a\" : 1.0 ,\"b\": [ true ]}",
3503 3504
            vec![
                (ObjectStart,           vec![]),
3505
                  (F64Value(1.0),       vec![Key("a")]),
3506 3507 3508 3509
                  (ListStart,           vec![Key("b")]),
                    (BooleanValue(true),vec![Key("b"), Index(0)]),
                  (ListEnd,             vec![Key("b")]),
                (ObjectEnd,             vec![]),
3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520
            ]
        );
        assert_stream_equal(
            r#"{
                "a": 1.0,
                "b": [
                    true,
                    "foo\nbar",
                    { "c": {"d": null} }
                ]
            }"#,
3521 3522
            vec![
                (ObjectStart,                   vec![]),
3523
                  (F64Value(1.0),               vec![Key("a")]),
3524 3525 3526 3527 3528 3529 3530 3531 3532 3533
                  (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![]),
3534 3535 3536 3537
            ]
        );
    }
    #[test]
S
Steven Fackler 已提交
3538
    #[cfg_attr(target_word_size = "32", ignore)] // FIXME(#14064)
3539 3540 3541
    fn test_read_list_streaming() {
        assert_stream_equal(
            "[]",
3542 3543 3544
            vec![
                (ListStart, vec![]),
                (ListEnd,   vec![]),
3545 3546 3547 3548
            ]
        );
        assert_stream_equal(
            "[ ]",
3549 3550 3551
            vec![
                (ListStart, vec![]),
                (ListEnd,   vec![]),
3552 3553 3554 3555
            ]
        );
        assert_stream_equal(
            "[true]",
3556 3557 3558 3559
            vec![
                (ListStart,              vec![]),
                    (BooleanValue(true), vec![Index(0)]),
                (ListEnd,                vec![]),
3560 3561 3562 3563
            ]
        );
        assert_stream_equal(
            "[ false ]",
3564 3565 3566 3567
            vec![
                (ListStart,               vec![]),
                    (BooleanValue(false), vec![Index(0)]),
                (ListEnd,                 vec![]),
3568 3569 3570 3571
            ]
        );
        assert_stream_equal(
            "[null]",
3572 3573 3574 3575
            vec![
                (ListStart,     vec![]),
                    (NullValue, vec![Index(0)]),
                (ListEnd,       vec![]),
3576 3577 3578 3579
            ]
        );
        assert_stream_equal(
            "[3, 1]",
3580 3581
            vec![
                (ListStart,     vec![]),
3582 3583
                    (U64Value(3), vec![Index(0)]),
                    (U64Value(1), vec![Index(1)]),
3584
                (ListEnd,       vec![]),
3585 3586 3587 3588
            ]
        );
        assert_stream_equal(
            "\n[3, 2]\n",
3589 3590
            vec![
                (ListStart,     vec![]),
3591 3592
                    (U64Value(3), vec![Index(0)]),
                    (U64Value(2), vec![Index(1)]),
3593
                (ListEnd,       vec![]),
3594 3595 3596 3597
            ]
        );
        assert_stream_equal(
            "[2, [4, 1]]",
3598
            vec![
3599
                (ListStart,            vec![]),
3600
                    (U64Value(2),      vec![Index(0)]),
3601
                    (ListStart,        vec![Index(1)]),
3602 3603
                        (U64Value(4),  vec![Index(1), Index(0)]),
                        (U64Value(1),  vec![Index(1), Index(1)]),
3604 3605
                    (ListEnd,          vec![Index(1)]),
                (ListEnd,              vec![]),
3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652
            ]
        );

        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);
N
Nick Cameron 已提交
3653 3654 3655
        assert!(stack.is_equal_to(&[Index(1)]));
        assert!(stack.starts_with(&[Index(1)]));
        assert!(stack.ends_with(&[Index(1)]));
3656 3657 3658
        assert!(stack.last_is_index());
        assert!(stack.get(0) == Index(1));

3659
        stack.push_key("foo".to_string());
3660 3661

        assert!(stack.len() == 2);
N
Nick Cameron 已提交
3662 3663 3664 3665 3666
        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")]));
3667 3668 3669 3670
        assert!(!stack.last_is_index());
        assert!(stack.get(0) == Index(1));
        assert!(stack.get(1) == Key("foo"));

3671
        stack.push_key("bar".to_string());
3672 3673

        assert!(stack.len() == 3);
N
Nick Cameron 已提交
3674 3675 3676 3677 3678 3679 3680
        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")]));
3681 3682 3683 3684 3685 3686 3687 3688
        assert!(!stack.last_is_index());
        assert!(stack.get(0) == Index(1));
        assert!(stack.get(1) == Key("foo"));
        assert!(stack.get(2) == Key("bar"));

        stack.pop();

        assert!(stack.len() == 2);
N
Nick Cameron 已提交
3689 3690 3691 3692 3693
        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")]));
3694 3695 3696 3697 3698
        assert!(!stack.last_is_index());
        assert!(stack.get(0) == Index(1));
        assert!(stack.get(1) == Key("foo"));
    }

3699 3700
    #[test]
    fn test_to_json() {
3701
        use std::collections::{HashMap,TreeMap};
3702 3703
        use super::ToJson;

3704 3705
        let list2 = List(vec!(U64(1), U64(2)));
        let list3 = List(vec!(U64(1), U64(2), U64(3)));
3706 3707
        let object = {
            let mut tree_map = TreeMap::new();
3708 3709
            tree_map.insert("a".to_string(), U64(1));
            tree_map.insert("b".to_string(), U64(2));
A
Adolfo Ochagavía 已提交
3710
            Object(tree_map)
3711 3712 3713 3714
        };

        assert_eq!(list2.to_json(), list2);
        assert_eq!(object.to_json(), object);
3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726
        assert_eq!(3_i.to_json(), I64(3));
        assert_eq!(4_i8.to_json(), I64(4));
        assert_eq!(5_i16.to_json(), I64(5));
        assert_eq!(6_i32.to_json(), I64(6));
        assert_eq!(7_i64.to_json(), I64(7));
        assert_eq!(8_u.to_json(), U64(8));
        assert_eq!(9_u8.to_json(), U64(9));
        assert_eq!(10_u16.to_json(), U64(10));
        assert_eq!(11_u32.to_json(), U64(11));
        assert_eq!(12_u64.to_json(), U64(12));
        assert_eq!(13.0_f32.to_json(), F64(13.0_f64));
        assert_eq!(14.0_f64.to_json(), F64(14.0_f64));
3727
        assert_eq!(().to_json(), Null);
M
mrec 已提交
3728 3729
        assert_eq!(f32::INFINITY.to_json(), Null);
        assert_eq!(f64::NAN.to_json(), Null);
3730 3731
        assert_eq!(true.to_json(), Boolean(true));
        assert_eq!(false.to_json(), Boolean(false));
3732 3733
        assert_eq!("abc".to_json(), String("abc".into_string()));
        assert_eq!("abc".into_string().to_json(), String("abc".into_string()));
3734 3735 3736 3737 3738 3739
        assert_eq!((1u, 2u).to_json(), list2);
        assert_eq!((1u, 2u, 3u).to_json(), list3);
        assert_eq!([1u, 2].to_json(), list2);
        assert_eq!((&[1u, 2, 3]).to_json(), list3);
        assert_eq!((vec![1u, 2]).to_json(), list2);
        assert_eq!(vec!(1u, 2, 3).to_json(), list3);
3740
        let mut tree_map = TreeMap::new();
3741
        tree_map.insert("a".to_string(), 1u);
3742 3743 3744
        tree_map.insert("b".to_string(), 2);
        assert_eq!(tree_map.to_json(), object);
        let mut hash_map = HashMap::new();
3745
        hash_map.insert("a".to_string(), 1u);
3746 3747
        hash_map.insert("b".to_string(), 2);
        assert_eq!(hash_map.to_json(), object);
3748 3749
        assert_eq!(Some(15i).to_json(), I64(15));
        assert_eq!(Some(15u).to_json(), U64(15));
3750 3751 3752
        assert_eq!(None::<int>.to_json(), Null);
    }

3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787
    #[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} }
                ]
            }"#);
        });
    }

3788
    fn big_json() -> string::String {
3789
        let mut src = "[\n".to_string();
3790
        for _ in range(0i, 500) {
3791 3792
            src.push_str(r#"{ "a": true, "b": null, "c":3.1415, "d": "Hello world", "e": \
                            [1,2,3]},"#);
3793
        }
3794
        src.push_str("{}]");
3795 3796 3797 3798 3799 3800 3801
        return src;
    }

    #[bench]
    fn bench_streaming_large(b: &mut Bencher) {
        let src = big_json();
        b.iter( || {
3802
            let mut parser = Parser::new(src.as_slice().chars());
3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813
            loop {
                match parser.next() {
                    None => return,
                    _ => {}
                }
            }
        });
    }
    #[bench]
    fn bench_large(b: &mut Bencher) {
        let src = big_json();
3814
        b.iter( || { let _ = from_str(src.as_slice()); });
3815
    }
3816
}