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

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

14 15
#![forbid(non_camel_case_types)]
#![allow(missing_doc)]
E
Elly Jones 已提交
16

M
musitdev 已提交
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
/*!
JSON parsing and serialization

# What is JSON?

JSON (JavaScript Object Notation) is a way to write data in Javascript.
Like XML it allows one to encode structured data in a text format that can be read by humans easily.
Its native compatibility with JavaScript and its simple syntax make it used widely.

Json data are encoded in a form of "key":"value".
Data types that can be encoded are JavaScript types :
boolean (`true` or `false`), number (`f64`), string, array, object, null.
An object is a series of string keys mapping to values, in `"key": value` format.
Arrays are enclosed in square brackets ([ ... ]) and objects in curly brackets ({ ... }).
A simple JSON document encoding a person, his/her age, address and phone numbers could look like:

A
Alex Crichton 已提交
33
```ignore
M
musitdev 已提交
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
{
    "FirstName": "John",
    "LastName": "Doe",
    "Age": 43,
    "Address": {
        "Street": "Downing Street 10",
        "City": "London",
        "Country": "Great Britain"
    },
    "PhoneNumbers": [
        "+44 1234567",
        "+44 2345678"
    ]
}
```

# Rust Type-based Encoding and Decoding

Rust provides a mechanism for low boilerplate encoding & decoding
of values to and from JSON via the serialization API.
54 55
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.
M
musitdev 已提交
56 57 58 59 60 61 62
The Rust compiler provides an annotation to automatically generate
the code for these traits: `#[deriving(Decodable, Encodable)]`

To encode using Encodable :

```rust
use std::io;
A
Alex Crichton 已提交
63
use serialize::{json, Encodable};
M
musitdev 已提交
64 65 66

 #[deriving(Encodable)]
 pub struct TestStruct   {
67
    data_str: String,
M
musitdev 已提交
68 69 70
 }

fn main() {
71
    let to_encode_object = TestStruct{data_str:"example of string to encode".to_string()};
72
    let mut m = io::MemWriter::new();
M
musitdev 已提交
73
    {
74
        let mut encoder = json::Encoder::new(&mut m as &mut Writer);
S
Sean McArthur 已提交
75 76 77 78
        match to_encode_object.encode(&mut encoder) {
            Ok(()) => (),
            Err(e) => fail!("json encoding error: {}", e)
        };
M
musitdev 已提交
79 80 81 82 83
    }
}
```

Two wrapper functions are provided to encode a Encodable object
84
into a string (String) or buffer (vec![u8]): `str_encode(&m)` and `buffer_encode(&m)`.
M
musitdev 已提交
85 86

```rust
A
Alex Crichton 已提交
87
use serialize::json;
88
let to_encode_object = "example of string to encode".to_string();
89
let encoded_str: String = json::Encoder::str_encode(&to_encode_object);
M
musitdev 已提交
90 91 92 93 94 95 96 97 98 99 100 101
```

JSON API provide an enum `json::Json` and a trait `ToJson` to encode object.
The trait `ToJson` encode object into a container `json::Json` and the API provide writer
to encode them into a stream or a string ...

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

A basic `ToJson` example using a TreeMap of attribute name / attribute value:


```rust
102
use std::collections::TreeMap;
A
Alex Crichton 已提交
103 104
use serialize::json;
use serialize::json::ToJson;
M
musitdev 已提交
105 106 107

pub struct MyStruct  {
    attr1: u8,
108
    attr2: String,
M
musitdev 已提交
109 110 111 112
}

impl ToJson for MyStruct {
    fn to_json( &self ) -> json::Json {
113
        let mut d = box TreeMap::new();
114 115
        d.insert("attr1".to_string(), self.attr1.to_json());
        d.insert("attr2".to_string(), self.attr2.to_json());
M
musitdev 已提交
116 117 118 119 120
        json::Object(d)
    }
}

fn main() {
121
    let test2: MyStruct = MyStruct {attr1: 1, attr2:"test".to_string()};
M
musitdev 已提交
122
    let tjson: json::Json = test2.to_json();
123
    let json_str: String = tjson.to_str().into_string();
M
musitdev 已提交
124 125 126
}
```

H
Huon Wilson 已提交
127
To decode a JSON string using `Decodable` trait :
M
musitdev 已提交
128 129

```rust
A
Alex Crichton 已提交
130
extern crate serialize;
A
Alex Crichton 已提交
131
use serialize::{json, Decodable};
M
musitdev 已提交
132 133 134 135

#[deriving(Decodable)]
pub struct MyStruct  {
     attr1: u8,
136
     attr2: String,
M
musitdev 已提交
137 138 139
}

fn main() {
140
    let json_str_to_decode: String =
141
            "{\"attr1\":1,\"attr2\":\"toto\"}".to_string();
142
    let json_object = json::from_str(json_str_to_decode.as_slice());
A
Alex Crichton 已提交
143
    let mut decoder = json::Decoder::new(json_object.unwrap());
S
Sean McArthur 已提交
144 145 146 147
    let decoded_object: MyStruct = match Decodable::decode(&mut decoder) {
        Ok(v) => v,
        Err(e) => fail!("Decoding error: {}", e)
    }; // create the final object
M
musitdev 已提交
148 149 150 151 152 153 154 155 156 157 158
}
```

# Examples of use

## Using Autoserialization

Create a struct called TestStruct1 and serialize and deserialize it to and from JSON
using the serialization API, using the derived serialization code.

```rust
A
Alex Crichton 已提交
159
extern crate serialize;
A
Alex Crichton 已提交
160
use serialize::{json, Encodable, Decodable};
M
musitdev 已提交
161 162 163 164

 #[deriving(Decodable, Encodable)] //generate Decodable, Encodable impl.
 pub struct TestStruct1  {
    data_int: u8,
165
    data_str: String,
K
Kevin Ballard 已提交
166
    data_vector: Vec<u8>,
M
musitdev 已提交
167 168 169 170 171 172
 }

// To serialize use the `json::str_encode` to encode an object in a string.
// It calls the generated `Encodable` impl.
fn main() {
    let to_encode_object = TestStruct1
173
         {data_int: 1, data_str:"toto".to_string(), data_vector:vec![2,3,4,5]};
174
    let encoded_str: String = json::Encoder::str_encode(&to_encode_object);
M
musitdev 已提交
175

A
Alex Crichton 已提交
176
    // To deserialize use the `json::from_str` and `json::Decoder`
M
musitdev 已提交
177

178
    let json_object = json::from_str(encoded_str.as_slice());
M
musitdev 已提交
179
    let mut decoder = json::Decoder::new(json_object.unwrap());
S
Sean McArthur 已提交
180
    let decoded1: TestStruct1 = Decodable::decode(&mut decoder).unwrap(); // create the final object
M
musitdev 已提交
181 182 183 184 185
}
```

## Using `ToJson`

T
theptrk 已提交
186
This example uses the ToJson impl to deserialize the JSON string.
M
musitdev 已提交
187 188 189
Example of `ToJson` trait implementation for TestStruct1.

```rust
190
use std::collections::TreeMap;
A
Alex Crichton 已提交
191 192
use serialize::json::ToJson;
use serialize::{json, Encodable, Decodable};
M
musitdev 已提交
193 194 195 196

#[deriving(Decodable, Encodable)] // generate Decodable, Encodable impl.
pub struct TestStruct1  {
    data_int: u8,
197
    data_str: String,
K
Kevin Ballard 已提交
198
    data_vector: Vec<u8>,
M
musitdev 已提交
199 200 201 202
}

impl ToJson for TestStruct1 {
    fn to_json( &self ) -> json::Json {
203
        let mut d = box TreeMap::new();
204 205 206
        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 已提交
207 208 209 210 211
        json::Object(d)
    }
}

fn main() {
H
Huon Wilson 已提交
212
    // Serialization using our impl of to_json
M
musitdev 已提交
213

214
    let test2: TestStruct1 = TestStruct1 {data_int: 1, data_str:"toto".to_string(),
K
Kevin Ballard 已提交
215
                                          data_vector:vec![2,3,4,5]};
M
musitdev 已提交
216
    let tjson: json::Json = test2.to_json();
217
    let json_str: String = tjson.to_str().into_string();
M
musitdev 已提交
218

H
Huon Wilson 已提交
219
    // Deserialize like before.
M
musitdev 已提交
220

221 222
    let mut decoder =
        json::Decoder::new(json::from_str(json_str.as_slice()).unwrap());
M
musitdev 已提交
223
    // create the final object
S
Sean McArthur 已提交
224
    let decoded2: TestStruct1 = Decodable::decode(&mut decoder).unwrap();
M
musitdev 已提交
225 226 227 228
}
```

*/
B
Brian Anderson 已提交
229

A
Adolfo Ochagavía 已提交
230
use std;
231
use std::collections::{HashMap, TreeMap};
A
Adolfo Ochagavía 已提交
232
use std::{char, f64, fmt, io, num, str};
A
Alex Crichton 已提交
233
use std::io::MemWriter;
A
Adolfo Ochagavía 已提交
234
use std::mem::{swap, transmute};
M
mrec 已提交
235
use std::num::{FPNaN, FPInfinite};
236
use std::str::ScalarValue;
237
use std::string::String;
238
use std::vec::Vec;
239

A
Alex Crichton 已提交
240
use Encodable;
E
Elly Jones 已提交
241

242
/// Represents a json value
243
#[deriving(Clone, PartialEq, PartialOrd)]
244
pub enum Json {
D
Daniel Micay 已提交
245
    Number(f64),
246
    String(String),
B
Ben Striegel 已提交
247
    Boolean(bool),
248
    List(List),
A
Adolfo Ochagavía 已提交
249
    Object(Object),
B
Ben Striegel 已提交
250
    Null,
E
Elly Jones 已提交
251 252
}

K
Kevin Ballard 已提交
253
pub type List = Vec<Json>;
254
pub type Object = TreeMap<String, Json>;
255

256
/// The errors that can arise while parsing a JSON stream.
257
#[deriving(Clone, PartialEq)]
258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276
pub enum ErrorCode {
    InvalidSyntax,
    InvalidNumber,
    EOFWhileParsingObject,
    EOFWhileParsingList,
    EOFWhileParsingValue,
    EOFWhileParsingString,
    KeyMustBeAString,
    ExpectedColon,
    TrailingCharacters,
    InvalidEscape,
    InvalidUnicodeCodePoint,
    LoneLeadingSurrogateInHexEscape,
    UnexpectedEndOfHexEscape,
    UnrecognizedHex,
    NotFourDigit,
    NotUtf8,
}

277
#[deriving(Clone, PartialEq, Show)]
278
pub enum ParserError {
S
Sean McArthur 已提交
279
    /// msg, line, col
280 281 282 283 284 285 286
    SyntaxError(ErrorCode, uint, uint),
    IoError(io::IoErrorKind, &'static str),
}

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

287
#[deriving(Clone, PartialEq, Show)]
288 289
pub enum DecoderError {
    ParseError(ParserError),
290 291 292
    ExpectedError(String, String),
    MissingFieldError(String),
    UnknownVariantError(String),
293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316
}

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

317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333
/// Shortcut function to decode a JSON `&str` into an object
pub fn decode<T: ::Decodable<Decoder, DecoderError>>(s: &str) -> DecodeResult<T> {
    let json = match from_str(s) {
        Ok(x) => x,
        Err(e) => return Err(ParseError(e))
    };

    let mut decoder = Decoder::new(json);
    ::Decodable::decode(&mut decoder)
}

/// Shortcut function to encode a `T` into a JSON `String`
pub fn encode<'a, T: Encodable<Encoder<'a>, io::IoError>>(object: &T) -> String {
    let buff = Encoder::buffer_encode(object);
    str::from_utf8_owned(buff).unwrap()
}

334 335 336 337 338 339 340 341
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)
342
}
343

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

347 348
fn escape_str(s: &str) -> String {
    let mut escaped = String::from_str("\"");
349
    for c in s.chars() {
350
        match c {
351 352 353 354 355 356 357 358
            '"' => escaped.push_str("\\\""),
            '\\' => escaped.push_str("\\\\"),
            '\x08' => escaped.push_str("\\b"),
            '\x0c' => escaped.push_str("\\f"),
            '\n' => escaped.push_str("\\n"),
            '\r' => escaped.push_str("\\r"),
            '\t' => escaped.push_str("\\t"),
            _ => escaped.push_char(c),
E
Elly Jones 已提交
359
        }
360
    };
361
    escaped.push_char('"');
362
    escaped
E
Elly Jones 已提交
363 364
}

M
mrec 已提交
365 366 367 368 369 370 371
fn fmt_number_or_null(v: f64) -> String {
    match v.classify() {
        FPNaN | FPInfinite => String::from_str("null"),
        _ => f64::to_str_digits(v, 6u)
    }
}

372
fn spaces(n: uint) -> String {
373
    String::from_char(n, ' ')
374 375
}

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

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

    /// Encode the specified struct into a json [u8]
A
Adolfo Ochagavía 已提交
389 390
    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 已提交
391
        let mut m = MemWriter::new();
N
Nick Cameron 已提交
392 393
        // FIXME(14302) remove the transmute and unsafe block.
        unsafe {
M
musitdev 已提交
394
            let mut encoder = Encoder::new(&mut m as &mut io::Writer);
S
Sean McArthur 已提交
395
            // MemWriter never Errs
A
Adolfo Ochagavía 已提交
396
            let _ = object.encode(transmute(&mut encoder));
M
musitdev 已提交
397
        }
398
        m.unwrap()
M
musitdev 已提交
399 400 401
    }

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

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

S
Sean McArthur 已提交
413 414 415 416 417
    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) }
418

S
Sean McArthur 已提交
419 420 421 422 423
    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) }
424

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

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

438 439 440
    fn emit_char(&mut self, v: char) -> EncodeResult {
        self.emit_str(str::from_char(v).as_slice())
    }
S
Sean McArthur 已提交
441
    fn emit_str(&mut self, v: &str) -> EncodeResult {
A
Adolfo Ochagavía 已提交
442
        write!(self.writer, "{}", escape_str(v))
A
Alex Crichton 已提交
443
    }
444

A
Adolfo Ochagavía 已提交
445 446 447
    fn emit_enum(&mut self, _name: &str, f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
        f(self)
    }
448

449 450 451 452 453 454 455 456 457
    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 {
A
Adolfo Ochagavía 已提交
458
            write!(self.writer, "{}", escape_str(name))
459
        } else {
A
Adolfo Ochagavía 已提交
460 461 462
            try!(write!(self.writer, "{{\"variant\":"));
            try!(write!(self.writer, "{}", escape_str(name)));
            try!(write!(self.writer, ",\"fields\":["));
463
            try!(f(self));
A
Adolfo Ochagavía 已提交
464
            write!(self.writer, "]}}")
465 466
        }
    }
467

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

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

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

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

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

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

    fn emit_tuple_struct(&mut self,
                         _name: &str,
                         len: uint,
S
Sean McArthur 已提交
522
                         f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
523 524
        self.emit_seq(len, f)
    }
S
Sean McArthur 已提交
525 526 527
    fn emit_tuple_struct_arg(&mut self,
                             idx: uint,
                             f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
528 529 530
        self.emit_seq_elt(idx, f)
    }

S
Sean McArthur 已提交
531 532 533 534 535 536 537
    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)
    }
538

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

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

552
    fn emit_map(&mut self, _len: uint, f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
A
Adolfo Ochagavía 已提交
553
        try!(write!(self.writer, "{{"));
554
        try!(f(self));
A
Adolfo Ochagavía 已提交
555
        write!(self.writer, "}}")
556
    }
557

S
Sean McArthur 已提交
558 559 560
    fn emit_map_elt_key(&mut self,
                        idx: uint,
                        f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
A
Adolfo Ochagavía 已提交
561
        if idx != 0 { try!(write!(self.writer, ",")) }
562 563 564
        // 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 已提交
565 566 567 568 569
        // FIXME(14302) remove the transmute and unsafe block.
        unsafe {
            let mut check_encoder = Encoder::new(&mut buf);
            try!(f(transmute(&mut check_encoder)));
        }
A
Adolfo Ochagavía 已提交
570 571 572 573
        let out = str::from_utf8_owned(buf.unwrap()).unwrap();
        let out = out.as_slice();
        let needs_wrapping = out.char_at(0) != '"' && out.char_at_reverse(out.len()) != '"';
        if needs_wrapping { try!(write!(self.writer, "\"")); }
S
Sean McArthur 已提交
574
        try!(f(self));
A
Adolfo Ochagavía 已提交
575
        if needs_wrapping { try!(write!(self.writer, "\"")); }
S
Sean McArthur 已提交
576
        Ok(())
577 578
    }

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

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

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

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

S
Sean McArthur 已提交
604 605 606 607 608
    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) }
609

S
Sean McArthur 已提交
610 611 612 613 614
    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) }
615

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

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

631 632 633
    fn emit_char(&mut self, v: char) -> EncodeResult {
        self.emit_str(str::from_char(v).as_slice())
    }
S
Sean McArthur 已提交
634
    fn emit_str(&mut self, v: &str) -> EncodeResult {
A
Adolfo Ochagavía 已提交
635
        write!(self.writer, "{}", escape_str(v))
A
Alex Crichton 已提交
636
    }
637

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

    fn emit_enum_variant(&mut self,
                         name: &str,
                         _: uint,
                         cnt: uint,
S
Sean McArthur 已提交
648
                         f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
649
        if cnt == 0 {
A
Adolfo Ochagavía 已提交
650
            write!(self.writer, "{}", escape_str(name))
651 652
        } else {
            self.indent += 2;
A
Adolfo Ochagavía 已提交
653
            try!(write!(self.writer, "[\n{}{},\n", spaces(self.indent),
A
Alex Crichton 已提交
654
                          escape_str(name)));
S
Sean McArthur 已提交
655
            try!(f(self));
656
            self.indent -= 2;
A
Adolfo Ochagavía 已提交
657
            write!(self.writer, "\n{}]", spaces(self.indent))
658 659 660 661 662
        }
    }

    fn emit_enum_variant_arg(&mut self,
                             idx: uint,
S
Sean McArthur 已提交
663
                             f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
664
        if idx != 0 {
A
Adolfo Ochagavía 已提交
665
            try!(write!(self.writer, ",\n"));
666
        }
A
Adolfo Ochagavía 已提交
667
        try!(write!(self.writer, "{}", spaces(self.indent)));
668 669 670 671 672 673 674
        f(self)
    }

    fn emit_enum_struct_variant(&mut self,
                                name: &str,
                                id: uint,
                                cnt: uint,
S
Sean McArthur 已提交
675
                                f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
676 677 678 679 680 681
        self.emit_enum_variant(name, id, cnt, f)
    }

    fn emit_enum_struct_variant_field(&mut self,
                                      _: &str,
                                      idx: uint,
S
Sean McArthur 已提交
682
                                      f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
683 684 685 686
        self.emit_enum_variant_arg(idx, f)
    }


687 688 689 690 691
    fn emit_struct(&mut self,
                   _: &str,
                   len: uint,
                   f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
        if len == 0 {
A
Adolfo Ochagavía 已提交
692
            write!(self.writer, "{{}}")
693
        } else {
A
Adolfo Ochagavía 已提交
694
            try!(write!(self.writer, "{{"));
695 696 697
            self.indent += 2;
            try!(f(self));
            self.indent -= 2;
A
Adolfo Ochagavía 已提交
698
            write!(self.writer, "\n{}}}", spaces(self.indent))
699 700
        }
    }
701 702 703 704

    fn emit_struct_field(&mut self,
                         name: &str,
                         idx: uint,
S
Sean McArthur 已提交
705
                         f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
706
        if idx == 0 {
A
Adolfo Ochagavía 已提交
707
            try!(write!(self.writer, "\n"));
708
        } else {
A
Adolfo Ochagavía 已提交
709
            try!(write!(self.writer, ",\n"));
710
        }
A
Adolfo Ochagavía 已提交
711
        try!(write!(self.writer, "{}{}: ", spaces(self.indent), escape_str(name)));
S
Sean McArthur 已提交
712
        f(self)
713 714
    }

S
Sean McArthur 已提交
715 716 717
    fn emit_tuple(&mut self,
                  len: uint,
                  f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
718 719
        self.emit_seq(len, f)
    }
S
Sean McArthur 已提交
720 721 722
    fn emit_tuple_arg(&mut self,
                      idx: uint,
                      f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
723 724 725 726 727 728
        self.emit_seq_elt(idx, f)
    }

    fn emit_tuple_struct(&mut self,
                         _: &str,
                         len: uint,
S
Sean McArthur 已提交
729
                         f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
730 731 732 733
        self.emit_seq(len, f)
    }
    fn emit_tuple_struct_arg(&mut self,
                             idx: uint,
S
Sean McArthur 已提交
734
                             f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
735 736 737
        self.emit_seq_elt(idx, f)
    }

S
Sean McArthur 已提交
738 739 740 741 742 743 744
    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)
    }
745

S
Sean McArthur 已提交
746 747 748
    fn emit_seq(&mut self,
                len: uint,
                f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
749
        if len == 0 {
A
Adolfo Ochagavía 已提交
750
            write!(self.writer, "[]")
751
        } else {
A
Adolfo Ochagavía 已提交
752
            try!(write!(self.writer, "["));
753
            self.indent += 2;
S
Sean McArthur 已提交
754
            try!(f(self));
755
            self.indent -= 2;
A
Adolfo Ochagavía 已提交
756
            write!(self.writer, "\n{}]", spaces(self.indent))
757 758 759
        }
    }

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

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

S
Sean McArthur 已提交
786 787 788
    fn emit_map_elt_key(&mut self,
                        idx: uint,
                        f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
789
        if idx == 0 {
A
Adolfo Ochagavía 已提交
790
            try!(write!(self.writer, "\n"));
791
        } else {
A
Adolfo Ochagavía 已提交
792
            try!(write!(self.writer, ",\n"));
793
        }
A
Adolfo Ochagavía 已提交
794
        try!(write!(self.writer, "{}", spaces(self.indent)));
795 796 797
        // 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 已提交
798 799 800 801 802
        // FIXME(14302) remove the transmute and unsafe block.
        unsafe {
            let mut check_encoder = PrettyEncoder::new(&mut buf);
            try!(f(transmute(&mut check_encoder)));
        }
A
Adolfo Ochagavía 已提交
803 804 805 806
        let out = str::from_utf8_owned(buf.unwrap()).unwrap();
        let out = out.as_slice();
        let needs_wrapping = out.char_at(0) != '"' && out.char_at_reverse(out.len()) != '"';
        if needs_wrapping { try!(write!(self.writer, "\"")); }
S
Sean McArthur 已提交
807
        try!(f(self));
A
Adolfo Ochagavía 已提交
808
        if needs_wrapping { try!(write!(self.writer, "\"")); }
S
Sean McArthur 已提交
809
        Ok(())
810 811
    }

S
Sean McArthur 已提交
812 813 814
    fn emit_map_elt_val(&mut self,
                        _idx: uint,
                        f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
A
Adolfo Ochagavía 已提交
815
        try!(write!(self.writer, ": "));
S
Sean McArthur 已提交
816
        f(self)
817 818 819
    }
}

820 821
impl<E: ::Encoder<S>, S> Encodable<E, S> for Json {
    fn encode(&self, e: &mut E) -> Result<(), S> {
822 823 824 825 826 827 828 829 830 831 832
        match *self {
            Number(v) => v.encode(e),
            String(ref v) => v.encode(e),
            Boolean(v) => v.encode(e),
            List(ref v) => v.encode(e),
            Object(ref v) => v.encode(e),
            Null => e.emit_nil(),
        }
    }
}

833
impl Json {
A
Adolfo Ochagavía 已提交
834 835 836
    /// 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 已提交
837
        self.encode(&mut encoder)
838
    }
839

J
Jorge Aparicio 已提交
840
    /// Encodes a json value into an io::writer.
841
    /// Pretty-prints in a more readable format.
A
Adolfo Ochagavía 已提交
842 843
    pub fn to_pretty_writer(&self, writer: &mut io::Writer) -> EncodeResult {
        let mut encoder = PrettyEncoder::new(writer);
S
Sean McArthur 已提交
844
        self.encode(&mut encoder)
845
    }
846

847
    /// Encodes a json value into a string
848
    pub fn to_pretty_str(&self) -> String {
849
        let mut s = MemWriter::new();
A
Alex Crichton 已提交
850
        self.to_pretty_writer(&mut s as &mut io::Writer).unwrap();
A
Adolfo Ochagavía 已提交
851
        str::from_utf8_owned(s.unwrap()).unwrap()
852
    }
853 854 855

     /// If the Json value is an Object, returns the value associated with the provided key.
    /// Otherwise, returns None.
856
    pub fn find<'a>(&'a self, key: &String) -> Option<&'a Json>{
857 858 859 860 861 862 863
        match self {
            &Object(ref map) => map.find(key),
            _ => None
        }
    }

    /// Attempts to get a nested Json Object for each key in `keys`.
864
    /// If any key is found not to exist, find_path will return None.
865
    /// Otherwise, it will return the Json value associated with the final key.
866
    pub fn find_path<'a>(&'a self, keys: &[&String]) -> Option<&'a Json>{
867 868 869 870 871 872 873 874
        let mut target = self;
        for key in keys.iter() {
            match target.find(*key) {
                Some(t) => { target = t; },
                None => return None
            }
        }
        Some(target)
875 876 877 878 879
    }

    /// 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.
880
    pub fn search<'a>(&'a self, key: &String) -> Option<&'a Json> {
881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902
        match self {
            &Object(ref map) => {
                match map.find(key) {
                    Some(json_value) => Some(json_value),
                    None => {
                        let mut value : Option<&'a Json> = None;
                        for (_, v) in map.iter() {
                            value = v.search(key);
                            if value.is_some() {
                                break;
                            }
                        }
                        value
                    }
                }
            },
            _ => None
        }
    }

    /// Returns true if the Json value is an Object. Returns false otherwise.
    pub fn is_object<'a>(&'a self) -> bool {
903
        self.as_object().is_some()
904 905 906 907 908 909
    }

    /// If the Json value is an Object, returns the associated TreeMap.
    /// Returns None otherwise.
    pub fn as_object<'a>(&'a self) -> Option<&'a Object> {
        match self {
A
Adolfo Ochagavía 已提交
910
            &Object(ref map) => Some(map),
911 912 913 914 915 916
            _ => None
        }
    }

    /// Returns true if the Json value is a List. Returns false otherwise.
    pub fn is_list<'a>(&'a self) -> bool {
917
        self.as_list().is_some()
918 919 920 921 922 923 924 925 926 927 928 929
    }

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

    /// Returns true if the Json value is a String. Returns false otherwise.
930 931
    pub fn is_string<'a>(&'a self) -> bool {
        self.as_string().is_some()
932 933 934 935
    }

    /// If the Json value is a String, returns the associated str.
    /// Returns None otherwise.
936
    pub fn as_string<'a>(&'a self) -> Option<&'a str> {
937 938 939 940 941 942 943 944
        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 {
945
        self.as_number().is_some()
946 947 948 949 950 951 952 953 954 955 956 957 958
    }

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

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

    /// 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 {
973
        self.as_null().is_some()
974 975 976 977 978 979 980 981 982 983
    }

    /// 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 已提交
984 985
}

986
/// The output of the streaming parser.
987
#[deriving(PartialEq, Clone, Show)]
988 989 990 991 992 993 994
pub enum JsonEvent {
    ObjectStart,
    ObjectEnd,
    ListStart,
    ListEnd,
    BooleanValue(bool),
    NumberValue(f64),
995
    StringValue(String),
996 997 998 999
    NullValue,
    Error(ParserError),
}

1000
#[deriving(PartialEq, Show)]
1001 1002 1003 1004 1005 1006 1007 1008 1009
enum ParserState {
    // Parse a value in a list, true means first element.
    ParseList(bool),
    // Parse ',' or ']' after an element in a list.
    ParseListComma,
    // Parse a key:value in an object, true means first element.
    ParseObject(bool),
    // Parse ',' or ']' after an element in an object.
    ParseObjectComma,
J
Joseph Crail 已提交
1010
    // Initial state.
1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028
    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
1029
#[deriving(PartialEq, Clone, Show)]
1030 1031 1032 1033 1034 1035 1036
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.
1037
#[deriving(PartialEq, Clone, Show)]
1038 1039 1040 1041 1042 1043 1044
enum InternalStackElement {
    InternalIndex(u32),
    InternalKey(u16, u16), // start, size
}

impl Stack {
    pub fn new() -> Stack {
A
Adolfo Ochagavía 已提交
1045
        Stack { stack: Vec::new(), str_buffer: Vec::new() }
1046 1047 1048 1049 1050
    }

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

A
Adolfo Ochagavía 已提交
1051 1052
    /// Returns true if the stack is empty.
    pub fn is_empty(&self) -> bool { self.stack.is_empty() }
1053 1054 1055 1056 1057

    /// 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> {
A
Adolfo Ochagavía 已提交
1058 1059 1060 1061 1062
        match *self.stack.get(idx) {
            InternalIndex(i) => { Index(i) }
            InternalKey(start, size) => {
                Key(str::from_utf8(self.str_buffer.slice(start as uint, (start+size) as uint)).unwrap())
            }
1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109
        }
    }

    /// Compares this stack with an array of StackElements.
    pub fn is_equal_to(&self, rhs: &[StackElement]) -> bool {
        if self.stack.len() != rhs.len() { return false; }
        for i in range(0, rhs.len()) {
            if self.get(i) != rhs[i] { return false; }
        }
        return true;
    }

    /// Returns true if the bottom-most elements of this stack are the same as
    /// the ones passed as parameter.
    pub fn starts_with(&self, rhs: &[StackElement]) -> bool {
        if self.stack.len() < rhs.len() { return false; }
        for i in range(0, rhs.len()) {
            if self.get(i) != rhs[i] { return false; }
        }
        return true;
    }

    /// Returns true if the top-most elements of this stack are the same as
    /// the ones passed as parameter.
    pub fn ends_with(&self, rhs: &[StackElement]) -> bool {
        if self.stack.len() < rhs.len() { return false; }
        let offset = self.stack.len() - rhs.len();
        for i in range(0, rhs.len()) {
            if self.get(i + offset) != rhs[i] { return false; }
        }
        return true;
    }

    /// Returns the top-most element (if any).
    pub fn top<'l>(&'l self) -> Option<StackElement<'l>> {
        return match self.stack.last() {
            None => None,
            Some(&InternalIndex(i)) => Some(Index(i)),
            Some(&InternalKey(start, size)) => {
                Some(Key(str::from_utf8(
                    self.str_buffer.slice(start as uint, (start+size) as uint)
                ).unwrap()))
            }
        }
    }

    // Used by Parser to insert Key elements at the top of the stack.
1110
    fn push_key(&mut self, key: String) {
1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127
        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 已提交
1128
                self.str_buffer.truncate(new_size);
1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147
            }
            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 已提交
1148 1149
            InternalIndex(i) => { i + 1 }
            _ => { fail!(); }
1150 1151 1152 1153 1154 1155 1156
        };
        *self.stack.get_mut(len - 1) = InternalIndex(idx);
    }
}

/// A streaming JSON parser implemented as an iterator of JsonEvent, consuming
/// an iterator of char.
G
Gary Linscott 已提交
1157
pub struct Parser<T> {
1158 1159 1160 1161
    rdr: T,
    ch: Option<char>,
    line: uint,
    col: uint,
1162 1163 1164
    // We maintain a stack representing where we are in the logical structure
    // of the JSON stream.
    stack: Stack,
J
Joseph Crail 已提交
1165
    // A state machine is kept to make it possible to interrupt and resume parsing.
1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187
    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());
    }
1188 1189
}

1190
impl<T: Iterator<char>> Parser<T> {
1191
    /// Creates the JSON parser.
1192
    pub fn new(rdr: T) -> Parser<T> {
1193 1194
        let mut p = Parser {
            rdr: rdr,
1195
            ch: Some('\x00'),
1196 1197
            line: 1,
            col: 0,
1198 1199
            stack: Stack::new(),
            state: ParseStart,
1200 1201
        };
        p.bump();
1202
        return p;
1203
    }
E
Elly Jones 已提交
1204

1205 1206 1207 1208
    /// Provides access to the current position in the logical structure of the
    /// JSON stream.
    pub fn stack<'l>(&'l self) -> &'l Stack {
        return &'l self.stack;
1209
    }
1210

1211 1212
    fn eof(&self) -> bool { self.ch.is_none() }
    fn ch_or_null(&self) -> char { self.ch.unwrap_or('\x00') }
1213
    fn bump(&mut self) {
1214
        self.ch = self.rdr.next();
E
Elly Jones 已提交
1215

1216
        if self.ch_is('\n') {
1217 1218
            self.line += 1u;
            self.col = 1u;
G
Gary Linscott 已提交
1219 1220
        } else {
            self.col += 1u;
E
Elly Jones 已提交
1221
        }
1222 1223
    }

1224
    fn next_char(&mut self) -> Option<char> {
1225 1226 1227
        self.bump();
        self.ch
    }
1228 1229 1230
    fn ch_is(&self, c: char) -> bool {
        self.ch == Some(c)
    }
1231

1232 1233
    fn error<T>(&self, reason: ErrorCode) -> Result<T, ParserError> {
        Err(SyntaxError(reason, self.line, self.col))
1234 1235
    }

1236
    fn parse_whitespace(&mut self) {
1237 1238 1239 1240
        while self.ch_is(' ') ||
              self.ch_is('\n') ||
              self.ch_is('\t') ||
              self.ch_is('\r') { self.bump(); }
1241 1242
    }

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

1246
        if self.ch_is('-') {
1247
            self.bump();
D
Daniel Micay 已提交
1248
            neg = -1.0;
E
Elly Jones 已提交
1249
        }
1250

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

1253
        if self.ch_is('.') {
A
Adolfo Ochagavía 已提交
1254
            res = try!(self.parse_decimal(res));
E
Elly Jones 已提交
1255
        }
1256

1257
        if self.ch_is('e') || self.ch_is('E') {
A
Adolfo Ochagavía 已提交
1258
            res = try!(self.parse_exponent(res));
E
Elly Jones 已提交
1259
        }
1260

1261
        Ok(neg * res)
E
Elly Jones 已提交
1262 1263
    }

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

1267 1268 1269
        match self.ch_or_null() {
            '0' => {
                self.bump();
1270

M
mrec 已提交
1271
                // A leading '0' must be the only digit before the decimal point.
1272
                match self.ch_or_null() {
1273
                    '0' .. '9' => return self.error(InvalidNumber),
1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286
                    _ => ()
                }
            },
            '1' .. '9' => {
                while !self.eof() {
                    match self.ch_or_null() {
                        c @ '0' .. '9' => {
                            res *= 10.0;
                            res += ((c as int) - ('0' as int)) as f64;
                            self.bump();
                        }
                        _ => break,
                    }
1287 1288
                }
            }
1289
            _ => return self.error(InvalidNumber),
E
Elly Jones 已提交
1290
        }
1291
        Ok(res)
E
Elly Jones 已提交
1292 1293
    }

A
Adolfo Ochagavía 已提交
1294
    fn parse_decimal(&mut self, mut res: f64) -> Result<f64, ParserError> {
1295 1296 1297
        self.bump();

        // Make sure a digit follows the decimal place.
1298 1299
        match self.ch_or_null() {
            '0' .. '9' => (),
1300
             _ => return self.error(InvalidNumber)
1301 1302
        }

D
Daniel Micay 已提交
1303
        let mut dec = 1.0;
1304
        while !self.eof() {
1305 1306 1307 1308 1309 1310 1311
            match self.ch_or_null() {
                c @ '0' .. '9' => {
                    dec /= 10.0;
                    res += (((c as int) - ('0' as int)) as f64) * dec;
                    self.bump();
                }
                _ => break,
E
Elly Jones 已提交
1312 1313
            }
        }
1314

1315
        Ok(res)
E
Elly Jones 已提交
1316 1317
    }

1318
    fn parse_exponent(&mut self, mut res: f64) -> Result<f64, ParserError> {
1319 1320
        self.bump();

1321 1322
        let mut exp = 0u;
        let mut neg_exp = false;
1323

1324 1325 1326 1327 1328
        if self.ch_is('+') {
            self.bump();
        } else if self.ch_is('-') {
            self.bump();
            neg_exp = true;
1329 1330 1331
        }

        // Make sure a digit follows the exponent place.
1332 1333
        match self.ch_or_null() {
            '0' .. '9' => (),
1334
            _ => return self.error(InvalidNumber)
1335 1336
        }
        while !self.eof() {
1337 1338 1339 1340
            match self.ch_or_null() {
                c @ '0' .. '9' => {
                    exp *= 10;
                    exp += (c as uint) - ('0' as uint);
1341

1342 1343 1344
                    self.bump();
                }
                _ => break
1345 1346 1347
            }
        }

A
Adolfo Ochagavía 已提交
1348
        let exp = num::pow(10_f64, exp);
1349 1350 1351 1352 1353 1354
        if neg_exp {
            res /= exp;
        } else {
            res *= exp;
        }

1355
        Ok(res)
E
Elly Jones 已提交
1356 1357
    }

1358
    fn decode_hex_escape(&mut self) -> Result<u16, ParserError> {
1359 1360
        let mut i = 0u;
        let mut n = 0u16;
A
Adolfo Ochagavía 已提交
1361
        while i < 4 && !self.eof() {
1362 1363
            self.bump();
            n = match self.ch_or_null() {
A
Adolfo Ochagavía 已提交
1364 1365 1366 1367 1368 1369 1370
                c @ '0' .. '9' => n * 16 + ((c as u16) - ('0' as u16)),
                'a' | 'A' => n * 16 + 10,
                'b' | 'B' => n * 16 + 11,
                'c' | 'C' => n * 16 + 12,
                'd' | 'D' => n * 16 + 13,
                'e' | 'E' => n * 16 + 14,
                'f' | 'F' => n * 16 + 15,
1371
                _ => return self.error(InvalidEscape)
1372 1373 1374 1375 1376 1377
            };

            i += 1u;
        }

        // Error out if we didn't parse 4 digits.
A
Adolfo Ochagavía 已提交
1378
        if i != 4 {
1379
            return self.error(InvalidEscape);
1380 1381 1382 1383 1384
        }

        Ok(n)
    }

1385
    fn parse_str(&mut self) -> Result<String, ParserError> {
1386
        let mut escape = false;
1387
        let mut res = String::new();
1388

G
Gary Linscott 已提交
1389
        loop {
1390
            self.bump();
G
Gary Linscott 已提交
1391
            if self.eof() {
1392
                return self.error(EOFWhileParsingString);
G
Gary Linscott 已提交
1393
            }
1394

H
Huon Wilson 已提交
1395
            if escape {
1396 1397 1398 1399 1400 1401 1402 1403 1404
                match self.ch_or_null() {
                    '"' => res.push_char('"'),
                    '\\' => res.push_char('\\'),
                    '/' => res.push_char('/'),
                    'b' => res.push_char('\x08'),
                    'f' => res.push_char('\x0c'),
                    'n' => res.push_char('\n'),
                    'r' => res.push_char('\r'),
                    't' => res.push_char('\t'),
1405
                    'u' => match try!(self.decode_hex_escape()) {
1406
                        0xDC00 .. 0xDFFF => return self.error(LoneLeadingSurrogateInHexEscape),
1407 1408 1409 1410

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

1416 1417 1418
                            let buf = [n1, try!(self.decode_hex_escape())];
                            match str::utf16_items(buf.as_slice()).next() {
                                Some(ScalarValue(c)) => res.push_char(c),
1419
                                _ => return self.error(LoneLeadingSurrogateInHexEscape),
1420
                            }
1421 1422
                        }

1423 1424
                        n => match char::from_u32(n as u32) {
                            Some(c) => res.push_char(c),
1425
                            None => return self.error(InvalidUnicodeCodePoint),
1426 1427
                        },
                    },
1428
                    _ => return self.error(InvalidEscape),
1429 1430
                }
                escape = false;
1431
            } else if self.ch_is('\\') {
1432 1433
                escape = true;
            } else {
1434
                match self.ch {
1435 1436
                    Some('"') => {
                        self.bump();
1437
                        return Ok(res);
1438
                    },
1439 1440
                    Some(c) => res.push_char(c),
                    None => unreachable!()
1441
                }
E
Elly Jones 已提交
1442 1443 1444 1445
            }
        }
    }

1446 1447 1448 1449
    // 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 已提交
1450
    // stream int the form of a stack that can be queried by the user using the
1451 1452 1453 1454 1455 1456 1457 1458 1459 1460
    // stack() method.
    fn parse(&mut self) -> JsonEvent {
        loop {
            // The only paths where the loop can spin a new iteration
            // are in the cases ParseListComma and ParseObjectComma if ','
            // is parsed. In these cases the state is set to (respectively)
            // ParseList(false) and ParseObject(false), which always return,
            // so there is no risk of getting stuck in an infinite loop.
            // All other paths return before the end of the loop's iteration.
            self.parse_whitespace();
1461

1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503
            match self.state {
                ParseStart => {
                    return self.parse_start();
                }
                ParseList(first) => {
                    return self.parse_list(first);
                }
                ParseListComma => {
                    match self.parse_list_comma_or_end() {
                        Some(evt) => { return evt; }
                        None => {}
                    }
                }
                ParseObject(first) => {
                    return self.parse_object(first);
                }
                ParseObjectComma => {
                    self.stack.pop();
                    if self.ch_is(',') {
                        self.state = ParseObject(false);
                        self.bump();
                    } else {
                        return self.parse_object_end();
                    }
                }
                _ => {
                    return self.error_event(InvalidSyntax);
                }
            }
        }
    }

    fn parse_start(&mut self) -> JsonEvent {
        let val = self.parse_value();
        self.state = match val {
            Error(_) => { ParseFinished }
            ListStart => { ParseList(true) }
            ObjectStart => { ParseObject(true) }
            _ => { ParseBeforeFinish }
        };
        return val;
    }
1504

1505
    fn parse_list(&mut self, first: bool) -> JsonEvent {
1506
        if self.ch_is(']') {
1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518
            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
                }
            }
1519
            self.bump();
1520 1521 1522 1523
            return ListEnd;
        }
        if first {
            self.stack.push_index(0);
1524 1525
        }

1526
        let val = self.parse_value();
1527

1528 1529 1530 1531 1532 1533 1534 1535
        self.state = match val {
            Error(_) => { ParseFinished }
            ListStart => { ParseList(true) }
            ObjectStart => { ParseObject(true) }
            _ => { ParseListComma }
        };
        return val;
    }
1536

1537 1538 1539 1540 1541 1542 1543 1544 1545 1546
    fn parse_list_comma_or_end(&mut self) -> Option<JsonEvent> {
        if self.ch_is(',') {
            self.stack.bump_index();
            self.state = ParseList(false);
            self.bump();
            return None;
        } else if self.ch_is(']') {
            self.stack.pop();
            if self.stack.is_empty() {
                self.state = ParseBeforeFinish;
1547
            } else {
1548 1549 1550 1551 1552
                self.state = if self.stack.last_is_index() {
                    ParseListComma
                } else {
                    ParseObjectComma
                }
1553
            }
1554 1555 1556 1557 1558 1559 1560
            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 已提交
1561 1562
    }

1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599
    fn parse_object(&mut self, first: bool) -> JsonEvent {
        if self.ch_is('}') {
            if !first {
                self.stack.pop();
            }
            if self.stack.is_empty() {
                self.state = ParseBeforeFinish;
            } else {
                self.state = if self.stack.last_is_index() {
                    ParseListComma
                } else {
                    ParseObjectComma
                }
            }
            self.bump();
            return ObjectEnd;
        }
        if self.eof() {
            return self.error_event(EOFWhileParsingObject);
        }
        if !self.ch_is('"') {
            return self.error_event(KeyMustBeAString);
        }
        let s = match self.parse_str() {
            Ok(s) => { s }
            Err(e) => {
                self.state = ParseFinished;
                return Error(e);
            }
        };
        self.parse_whitespace();
        if self.eof() {
            return self.error_event(EOFWhileParsingObject);
        } else if self.ch_or_null() != ':' {
            return self.error_event(ExpectedColon);
        }
        self.stack.push_key(s);
1600 1601 1602
        self.bump();
        self.parse_whitespace();

1603
        let val = self.parse_value();
1604

1605 1606 1607 1608 1609 1610 1611 1612 1613 1614
        self.state = match val {
            Error(_) => { ParseFinished }
            ListStart => { ParseList(true) }
            ObjectStart => { ParseObject(true) }
            _ => { ParseObjectComma }
        };
        return val;
    }

    fn parse_object_end(&mut self) -> JsonEvent {
1615
        if self.ch_is('}') {
1616 1617 1618 1619 1620 1621 1622 1623 1624 1625
            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 已提交
1626
            ObjectEnd
1627
        } else if self.eof() {
A
Adolfo Ochagavía 已提交
1628
            self.error_event(EOFWhileParsingObject)
1629
        } else {
A
Adolfo Ochagavía 已提交
1630
            self.error_event(InvalidSyntax)
1631
        }
1632
    }
1633

1634 1635 1636
    fn parse_value(&mut self) -> JsonEvent {
        if self.eof() { return self.error_event(EOFWhileParsingValue); }
        match self.ch_or_null() {
A
Adolfo Ochagavía 已提交
1637 1638 1639 1640
            'n' => { self.parse_ident("ull", NullValue) }
            't' => { self.parse_ident("rue", BooleanValue(true)) }
            'f' => { self.parse_ident("alse", BooleanValue(false)) }
            '0' .. '9' | '-' => match self.parse_number() {
1641 1642 1643
                Ok(f) => NumberValue(f),
                Err(e) => Error(e),
            },
A
Adolfo Ochagavía 已提交
1644
            '"' => match self.parse_str() {
1645 1646 1647 1648 1649
                Ok(s) => StringValue(s),
                Err(e) => Error(e),
            },
            '[' => {
                self.bump();
A
Adolfo Ochagavía 已提交
1650
                ListStart
1651 1652 1653
            }
            '{' => {
                self.bump();
A
Adolfo Ochagavía 已提交
1654
                ObjectStart
1655
            }
A
Adolfo Ochagavía 已提交
1656
            _ => { self.error_event(InvalidSyntax) }
1657 1658
        }
    }
1659

1660 1661 1662 1663 1664 1665 1666 1667
    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))
        }
    }
1668

1669 1670 1671 1672 1673
    fn error_event(&mut self, reason: ErrorCode) -> JsonEvent {
        self.state = ParseFinished;
        Error(SyntaxError(reason, self.line, self.col))
    }
}
1674

1675 1676 1677 1678 1679
/// A Builder consumes a json::Parser to create a generic Json structure.
pub struct Builder<T> {
    parser: Parser<T>,
    token: Option<JsonEvent>,
}
1680

1681 1682 1683
impl<T: Iterator<char>> Builder<T> {
    /// Create a JSON Builder.
    pub fn new(src: T) -> Builder<T> {
A
Adolfo Ochagavía 已提交
1684
        Builder { parser: Parser::new(src), token: None, }
1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696
    }

    // Decode a Json value from a Parser.
    pub fn build(&mut self) -> Result<Json, BuilderError> {
        self.bump();
        let result = self.build_value();
        self.bump();
        match self.token {
            None => {}
            Some(Error(e)) => { return Err(e); }
            ref tok => { fail!("unexpected token {}", tok.clone()); }
        }
A
Adolfo Ochagavía 已提交
1697
        result
1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709
    }

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

    fn build_value(&mut self) -> Result<Json, BuilderError> {
        return match self.token {
            Some(NullValue) => { Ok(Null) }
            Some(NumberValue(n)) => { Ok(Number(n)) }
            Some(BooleanValue(b)) => { Ok(Boolean(b)) }
            Some(StringValue(ref mut s)) => {
1710
                let mut temp = String::new();
1711 1712
                swap(s, &mut temp);
                Ok(String(temp))
1713
            }
1714 1715 1716 1717 1718 1719 1720 1721
            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) }
        }
    }
1722

1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733
    fn build_list(&mut self) -> Result<Json, BuilderError> {
        self.bump();
        let mut values = Vec::new();

        loop {
            if self.token == Some(ListEnd) {
                return Ok(List(values.move_iter().collect()));
            }
            match self.build_value() {
                Ok(v) => values.push(v),
                Err(e) => { return Err(e) }
1734
            }
1735
            self.bump();
1736
        }
1737
    }
1738

1739 1740 1741
    fn build_object(&mut self) -> Result<Json, BuilderError> {
        self.bump();

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

A
Adolfo Ochagavía 已提交
1744
        loop {
1745 1746 1747 1748 1749 1750 1751
            match self.token {
                Some(ObjectEnd) => { return Ok(Object(values)); }
                Some(Error(e)) => { return Err(e); }
                None => { break; }
                _ => {}
            }
            let key = match self.parser.stack().top() {
1752
                Some(Key(k)) => { k.to_string() }
1753 1754 1755 1756 1757 1758 1759 1760 1761
                _ => { fail!("invalid state"); }
            };
            match self.build_value() {
                Ok(value) => { values.insert(key, value); }
                Err(e) => { return Err(e); }
            }
            self.bump();
        }
        return self.parser.error(EOFWhileParsingObject);
L
Lenny222 已提交
1762 1763 1764
    }
}

A
Alex Crichton 已提交
1765
/// Decodes a json value from an `&mut io::Reader`
1766
pub fn from_reader(rdr: &mut io::Reader) -> Result<Json, BuilderError> {
A
Alex Crichton 已提交
1767 1768
    let contents = match rdr.read_to_end() {
        Ok(c) => c,
1769
        Err(e) => return Err(io_error_to_error(e))
A
Alex Crichton 已提交
1770
    };
A
Adolfo Ochagavía 已提交
1771 1772 1773
    let s = match str::from_utf8_owned(contents) {
        Ok(s) => s,
        _ => return Err(SyntaxError(NotUtf8, 0, 0))
A
Alex Crichton 已提交
1774
    };
1775
    let mut builder = Builder::new(s.as_slice().chars());
1776
    builder.build()
E
Elly Jones 已提交
1777 1778
}

1779
/// Decodes a json value from a string
1780 1781
pub fn from_str(s: &str) -> Result<Json, BuilderError> {
    let mut builder = Builder::new(s.chars());
A
Adolfo Ochagavía 已提交
1782
    builder.build()
1783 1784
}

1785
/// A structure to decode JSON to values in rust.
1786
pub struct Decoder {
1787
    stack: Vec<Json>,
1788 1789
}

1790 1791
impl Decoder {
    /// Creates a new decoder instance for decoding the specified JSON value.
1792
    pub fn new(json: Json) -> Decoder {
A
Adolfo Ochagavía 已提交
1793
        Decoder { stack: vec![json] }
1794
    }
1795 1796
}

1797
impl Decoder {
S
Sean McArthur 已提交
1798 1799
    fn pop(&mut self) -> Json {
        self.stack.pop().unwrap()
1800 1801 1802
    }
}

S
Sean McArthur 已提交
1803 1804 1805 1806
macro_rules! expect(
    ($e:expr, Null) => ({
        match $e {
            Null => Ok(()),
1807
            other => Err(ExpectedError("Null".to_string(),
A
Alex Crichton 已提交
1808
                                       format!("{}", other)))
S
Sean McArthur 已提交
1809 1810 1811 1812 1813
        }
    });
    ($e:expr, $t:ident) => ({
        match $e {
            $t(v) => Ok(v),
1814
            other => {
1815
                Err(ExpectedError(stringify!($t).to_string(),
A
Alex Crichton 已提交
1816
                                  format!("{}", other)))
1817
            }
1818
        }
S
Sean McArthur 已提交
1819 1820 1821
    })
)

1822
impl ::Decoder<DecoderError> for Decoder {
S
Sean McArthur 已提交
1823 1824
    fn read_nil(&mut self) -> DecodeResult<()> {
        debug!("read_nil");
A
Adolfo Ochagavía 已提交
1825
        expect!(self.pop(), Null)
1826 1827
    }

S
Sean McArthur 已提交
1828 1829 1830 1831 1832
    fn read_u64(&mut self)  -> DecodeResult<u64 > { Ok(try!(self.read_f64()) as u64) }
    fn read_u32(&mut self)  -> DecodeResult<u32 > { Ok(try!(self.read_f64()) as u32) }
    fn read_u16(&mut self)  -> DecodeResult<u16 > { Ok(try!(self.read_f64()) as u16) }
    fn read_u8 (&mut self)  -> DecodeResult<u8  > { Ok(try!(self.read_f64()) as u8) }
    fn read_uint(&mut self) -> DecodeResult<uint> { Ok(try!(self.read_f64()) as uint) }
1833

S
Sean McArthur 已提交
1834 1835 1836 1837 1838
    fn read_i64(&mut self) -> DecodeResult<i64> { Ok(try!(self.read_f64()) as i64) }
    fn read_i32(&mut self) -> DecodeResult<i32> { Ok(try!(self.read_f64()) as i32) }
    fn read_i16(&mut self) -> DecodeResult<i16> { Ok(try!(self.read_f64()) as i16) }
    fn read_i8 (&mut self) -> DecodeResult<i8 > { Ok(try!(self.read_f64()) as i8) }
    fn read_int(&mut self) -> DecodeResult<int> { Ok(try!(self.read_f64()) as int) }
1839

S
Sean McArthur 已提交
1840
    fn read_bool(&mut self) -> DecodeResult<bool> {
1841
        debug!("read_bool");
A
Adolfo Ochagavía 已提交
1842
        expect!(self.pop(), Boolean)
1843 1844
    }

S
Sean McArthur 已提交
1845
    fn read_f64(&mut self) -> DecodeResult<f64> {
1846
        debug!("read_f64");
S
Sean McArthur 已提交
1847 1848
        match self.pop() {
            Number(f) => Ok(f),
1849 1850
            String(s) => {
                // re: #12967.. a type w/ numeric keys (ie HashMap<uint, V> etc)
A
Adolfo Ochagavía 已提交
1851 1852
                // is going to have a string here, as per JSON spec.
                Ok(std::from_str::from_str(s.as_slice()).unwrap())
1853
            },
M
mrec 已提交
1854
            Null => Ok(f64::NAN),
A
Adolfo Ochagavía 已提交
1855
            value => Err(ExpectedError("Number".to_string(), format!("{}", value)))
1856 1857
        }
    }
1858

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

S
Sean McArthur 已提交
1861 1862
    fn read_char(&mut self) -> DecodeResult<char> {
        let s = try!(self.read_str());
1863
        {
1864
            let mut it = s.as_slice().chars();
1865 1866
            match (it.next(), it.next()) {
                // exactly one character
S
Sean McArthur 已提交
1867
                (Some(c), None) => return Ok(c),
1868 1869 1870
                _ => ()
            }
        }
A
Adolfo Ochagavía 已提交
1871
        Err(ExpectedError("single character string".to_string(), format!("{}", s)))
1872 1873
    }

1874
    fn read_str(&mut self) -> DecodeResult<String> {
1875
        debug!("read_str");
A
Adolfo Ochagavía 已提交
1876
        expect!(self.pop(), String)
1877 1878
    }

S
Sean McArthur 已提交
1879 1880 1881
    fn read_enum<T>(&mut self,
                    name: &str,
                    f: |&mut Decoder| -> DecodeResult<T>) -> DecodeResult<T> {
1882
        debug!("read_enum({})", name);
1883 1884 1885 1886 1887
        f(self)
    }

    fn read_enum_variant<T>(&mut self,
                            names: &[&str],
S
Sean McArthur 已提交
1888 1889
                            f: |&mut Decoder, uint| -> DecodeResult<T>)
                            -> DecodeResult<T> {
1890
        debug!("read_enum_variant(names={})", names);
S
Sean McArthur 已提交
1891
        let name = match self.pop() {
1892
            String(s) => s,
1893
            Object(mut o) => {
1894
                let n = match o.pop(&"variant".to_string()) {
1895
                    Some(String(s)) => s,
1896
                    Some(val) => {
A
Adolfo Ochagavía 已提交
1897
                        return Err(ExpectedError("String".to_string(), format!("{}", val)))
1898 1899
                    }
                    None => {
1900
                        return Err(MissingFieldError("variant".to_string()))
1901
                    }
1902
                };
1903
                match o.pop(&"fields".to_string()) {
1904
                    Some(List(l)) => {
1905
                        for field in l.move_iter().rev() {
A
Adolfo Ochagavía 已提交
1906
                            self.stack.push(field);
1907 1908
                        }
                    },
1909
                    Some(val) => {
A
Adolfo Ochagavía 已提交
1910
                        return Err(ExpectedError("List".to_string(), format!("{}", val)))
1911 1912
                    }
                    None => {
1913
                        return Err(MissingFieldError("fields".to_string()))
1914
                    }
1915
                }
1916
                n
1917
            }
1918
            json => {
A
Adolfo Ochagavía 已提交
1919
                return Err(ExpectedError("String or Object".to_string(), format!("{}", json)))
1920
            }
1921
        };
1922
        let idx = match names.iter()
A
Adolfo Ochagavía 已提交
1923
                             .position(|n| str::eq_slice(*n, name.as_slice())) {
1924
            Some(idx) => idx,
S
Sean McArthur 已提交
1925
            None => return Err(UnknownVariantError(name))
1926 1927 1928 1929
        };
        f(self, idx)
    }

S
Sean McArthur 已提交
1930 1931
    fn read_enum_variant_arg<T>(&mut self, idx: uint, f: |&mut Decoder| -> DecodeResult<T>)
                                -> DecodeResult<T> {
1932
        debug!("read_enum_variant_arg(idx={})", idx);
1933 1934 1935 1936 1937
        f(self)
    }

    fn read_enum_struct_variant<T>(&mut self,
                                   names: &[&str],
S
Sean McArthur 已提交
1938 1939
                                   f: |&mut Decoder, uint| -> DecodeResult<T>)
                                   -> DecodeResult<T> {
1940
        debug!("read_enum_struct_variant(names={})", names);
1941 1942 1943 1944 1945 1946 1947
        self.read_enum_variant(names, f)
    }


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

    fn read_struct<T>(&mut self,
                      name: &str,
                      len: uint,
S
Sean McArthur 已提交
1957 1958
                      f: |&mut Decoder| -> DecodeResult<T>)
                      -> DecodeResult<T> {
1959
        debug!("read_struct(name={}, len={})", name, len);
S
Sean McArthur 已提交
1960 1961 1962
        let value = try!(f(self));
        self.pop();
        Ok(value)
1963 1964 1965 1966 1967
    }

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

1973 1974
        let value = match obj.pop(&name.to_string()) {
            None => return Err(MissingFieldError(name.to_string())),
S
Sean McArthur 已提交
1975 1976 1977
            Some(json) => {
                self.stack.push(json);
                try!(f(self))
1978
            }
S
Sean McArthur 已提交
1979 1980 1981
        };
        self.stack.push(Object(obj));
        Ok(value)
1982 1983
    }

S
Sean McArthur 已提交
1984
    fn read_tuple<T>(&mut self, f: |&mut Decoder, uint| -> DecodeResult<T>) -> DecodeResult<T> {
1985
        debug!("read_tuple()");
1986 1987 1988
        self.read_seq(f)
    }

S
Sean McArthur 已提交
1989 1990 1991
    fn read_tuple_arg<T>(&mut self,
                         idx: uint,
                         f: |&mut Decoder| -> DecodeResult<T>) -> DecodeResult<T> {
1992
        debug!("read_tuple_arg(idx={})", idx);
1993 1994 1995 1996 1997
        self.read_seq_elt(idx, f)
    }

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

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

S
Sean McArthur 已提交
2012 2013
    fn read_option<T>(&mut self, f: |&mut Decoder, bool| -> DecodeResult<T>) -> DecodeResult<T> {
        match self.pop() {
2014 2015 2016 2017 2018
            Null => f(self, false),
            value => { self.stack.push(value); f(self, true) }
        }
    }

S
Sean McArthur 已提交
2019
    fn read_seq<T>(&mut self, f: |&mut Decoder, uint| -> DecodeResult<T>) -> DecodeResult<T> {
2020
        debug!("read_seq()");
S
Sean McArthur 已提交
2021 2022
        let list = try!(expect!(self.pop(), List));
        let len = list.len();
2023
        for v in list.move_iter().rev() {
S
Sean McArthur 已提交
2024 2025
            self.stack.push(v);
        }
2026 2027 2028
        f(self, len)
    }

S
Sean McArthur 已提交
2029 2030 2031
    fn read_seq_elt<T>(&mut self,
                       idx: uint,
                       f: |&mut Decoder| -> DecodeResult<T>) -> DecodeResult<T> {
2032
        debug!("read_seq_elt(idx={})", idx);
2033 2034 2035
        f(self)
    }

S
Sean McArthur 已提交
2036
    fn read_map<T>(&mut self, f: |&mut Decoder, uint| -> DecodeResult<T>) -> DecodeResult<T> {
2037
        debug!("read_map()");
S
Sean McArthur 已提交
2038 2039 2040 2041 2042 2043
        let obj = try!(expect!(self.pop(), Object));
        let len = obj.len();
        for (key, value) in obj.move_iter() {
            self.stack.push(value);
            self.stack.push(String(key));
        }
2044 2045 2046
        f(self, len)
    }

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

S
Sean McArthur 已提交
2053 2054
    fn read_map_elt_val<T>(&mut self, idx: uint, f: |&mut Decoder| -> DecodeResult<T>)
                           -> DecodeResult<T> {
2055
        debug!("read_map_elt_val(idx={})", idx);
2056 2057 2058 2059
        f(self)
    }
}

2060
/// A trait for converting values to JSON
2061
pub trait ToJson {
2062 2063 2064
    /// Converts the value of `self` to an instance of JSON
    fn to_json(&self) -> Json;
}
2065

A
Adolfo Ochagavía 已提交
2066 2067 2068 2069 2070 2071 2072
macro_rules! to_json_impl(
    ($($t:ty), +) => (
        $(impl ToJson for $t {
            fn to_json(&self) -> Json { Number(*self as f64) }
        })+
    )
)
2073

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

A
Adolfo Ochagavía 已提交
2076 2077
impl ToJson for Json {
    fn to_json(&self) -> Json { self.clone() }
2078 2079
}

2080
impl ToJson for f32 {
M
mrec 已提交
2081
    fn to_json(&self) -> Json { (*self as f64).to_json() }
2082 2083
}

2084
impl ToJson for f64 {
M
mrec 已提交
2085 2086 2087
    fn to_json(&self) -> Json {
        match self.classify() {
            FPNaN | FPInfinite => Null,
A
Adolfo Ochagavía 已提交
2088
            _                  => Number(*self)
M
mrec 已提交
2089 2090
        }
    }
2091 2092
}

2093
impl ToJson for () {
B
Ben Striegel 已提交
2094
    fn to_json(&self) -> Json { Null }
2095 2096
}

2097
impl ToJson for bool {
B
Ben Striegel 已提交
2098
    fn to_json(&self) -> Json { Boolean(*self) }
2099 2100
}

2101
impl ToJson for String {
2102
    fn to_json(&self) -> Json { String((*self).clone()) }
2103 2104
}

A
Adolfo Ochagavía 已提交
2105
impl<A: ToJson, B: ToJson> ToJson for (A, B) {
B
Ben Striegel 已提交
2106 2107
    fn to_json(&self) -> Json {
        match *self {
A
Adolfo Ochagavía 已提交
2108 2109 2110
            (ref a, ref b) => {
                List(vec![a.to_json(), b.to_json()])
            }
2111
        }
2112 2113 2114
    }
}

A
Adolfo Ochagavía 已提交
2115
impl<A: ToJson, B: ToJson, C: ToJson> ToJson for (A, B, C) {
B
Ben Striegel 已提交
2116 2117
    fn to_json(&self) -> Json {
        match *self {
A
Adolfo Ochagavía 已提交
2118 2119 2120
            (ref a, ref b, ref c) => {
                List(vec![a.to_json(), b.to_json(), c.to_json()])
            }
2121
        }
2122 2123 2124
    }
}

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

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

A
Adolfo Ochagavía 已提交
2133
impl<A: ToJson> ToJson for TreeMap<String, A> {
B
Ben Striegel 已提交
2134
    fn to_json(&self) -> Json {
2135
        let mut d = TreeMap::new();
D
Daniel Micay 已提交
2136
        for (key, value) in self.iter() {
2137
            d.insert((*key).clone(), value.to_json());
2138
        }
A
Adolfo Ochagavía 已提交
2139
        Object(d)
2140 2141 2142
    }
}

A
Adolfo Ochagavía 已提交
2143
impl<A: ToJson> ToJson for HashMap<String, A> {
G
Graydon Hoare 已提交
2144
    fn to_json(&self) -> Json {
2145
        let mut d = TreeMap::new();
D
Daniel Micay 已提交
2146
        for (key, value) in self.iter() {
2147
            d.insert((*key).clone(), value.to_json());
G
Graydon Hoare 已提交
2148
        }
A
Adolfo Ochagavía 已提交
2149
        Object(d)
G
Graydon Hoare 已提交
2150 2151 2152
    }
}

2153
impl<A:ToJson> ToJson for Option<A> {
B
Ben Striegel 已提交
2154 2155
    fn to_json(&self) -> Json {
        match *self {
A
Adolfo Ochagavía 已提交
2156 2157
            None => Null,
            Some(ref value) => value.to_json()
2158 2159 2160 2161
        }
    }
}

2162
impl fmt::Show for Json {
2163
    /// Encodes a json value into a string
2164
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
A
Alex Crichton 已提交
2165
        self.to_writer(f).map_err(|_| fmt::WriteError)
2166
    }
2167 2168
}

A
Adolfo Ochagavía 已提交
2169 2170 2171 2172 2173 2174
impl std::from_str::FromStr for Json {
    fn from_str(s: &str) -> Option<Json> {
        from_str(s).ok()
    }
}

2175 2176
#[cfg(test)]
mod tests {
2177 2178
    extern crate test;
    use self::test::Bencher;
A
Alex Crichton 已提交
2179 2180
    use {Encodable, Decodable};
    use super::{Encoder, Decoder, Error, Boolean, Number, List, String, Null,
S
Sean McArthur 已提交
2181
                PrettyEncoder, Object, Json, from_str, ParseError, ExpectedError,
2182 2183 2184 2185 2186 2187 2188
                MissingFieldError, UnknownVariantError, DecodeResult, DecoderError,
                JsonEvent, Parser, StackElement,
                ObjectStart, ObjectEnd, ListStart, ListEnd, BooleanValue, NumberValue, StringValue,
                NullValue, SyntaxError, Key, Index, Stack,
                InvalidSyntax, InvalidNumber, EOFWhileParsingObject, EOFWhileParsingList,
                EOFWhileParsingValue, EOFWhileParsingString, KeyMustBeAString, ExpectedColon,
                TrailingCharacters};
A
Adolfo Ochagavía 已提交
2189
    use std::{f32, f64, io};
2190
    use std::collections::TreeMap;
2191

2192
    #[deriving(PartialEq, Encodable, Decodable, Show)]
2193 2194
    enum Animal {
        Dog,
2195
        Frog(String, int)
2196 2197
    }

2198
    #[deriving(PartialEq, Encodable, Decodable, Show)]
2199 2200 2201
    struct Inner {
        a: (),
        b: uint,
2202
        c: Vec<String>,
2203 2204
    }

2205
    #[deriving(PartialEq, Encodable, Decodable, Show)]
2206
    struct Outer {
K
Kevin Ballard 已提交
2207
        inner: Vec<Inner>,
2208 2209
    }

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

D
Daniel Micay 已提交
2213
        for item in items.iter() {
2214
            match *item {
2215
                (ref key, ref value) => { d.insert((*key).clone(), (*value).clone()); },
2216
            }
2217 2218
        };

L
Luqman Aden 已提交
2219
        Object(d)
2220 2221
    }

A
Adolfo Ochagavía 已提交
2222 2223 2224 2225 2226 2227
    #[test]
    fn test_from_str_trait() {
        let s = "null";
        assert!(::std::from_str::from_str::<Json>(s).unwrap() == from_str(s).unwrap());
    }

2228 2229
    #[test]
    fn test_write_null() {
2230 2231
        assert_eq!(Null.to_str().into_string(), "null".to_string());
        assert_eq!(Null.to_pretty_str().into_string(), "null".to_string());
2232 2233
    }

2234

2235
    #[test]
2236
    fn test_write_number() {
2237 2238
        assert_eq!(Number(3.0).to_str().into_string(), "3".to_string());
        assert_eq!(Number(3.0).to_pretty_str().into_string(), "3".to_string());
2239

2240 2241
        assert_eq!(Number(3.1).to_str().into_string(), "3.1".to_string());
        assert_eq!(Number(3.1).to_pretty_str().into_string(), "3.1".to_string());
2242

2243 2244
        assert_eq!(Number(-1.5).to_str().into_string(), "-1.5".to_string());
        assert_eq!(Number(-1.5).to_pretty_str().into_string(), "-1.5".to_string());
2245

2246 2247
        assert_eq!(Number(0.5).to_str().into_string(), "0.5".to_string());
        assert_eq!(Number(0.5).to_pretty_str().into_string(), "0.5".to_string());
M
mrec 已提交
2248 2249 2250 2251 2252 2253 2254 2255 2256

        assert_eq!(Number(f64::NAN).to_str().into_string(), "null".to_string());
        assert_eq!(Number(f64::NAN).to_pretty_str().into_string(), "null".to_string());

        assert_eq!(Number(f64::INFINITY).to_str().into_string(), "null".to_string());
        assert_eq!(Number(f64::INFINITY).to_pretty_str().into_string(), "null".to_string());

        assert_eq!(Number(f64::NEG_INFINITY).to_str().into_string(), "null".to_string());
        assert_eq!(Number(f64::NEG_INFINITY).to_pretty_str().into_string(), "null".to_string());
2257 2258 2259 2260
    }

    #[test]
    fn test_write_str() {
2261 2262
        assert_eq!(String("".to_string()).to_str().into_string(), "\"\"".to_string());
        assert_eq!(String("".to_string()).to_pretty_str().into_string(), "\"\"".to_string());
2263

2264 2265
        assert_eq!(String("foo".to_string()).to_str().into_string(), "\"foo\"".to_string());
        assert_eq!(String("foo".to_string()).to_pretty_str().into_string(), "\"foo\"".to_string());
2266 2267 2268 2269
    }

    #[test]
    fn test_write_bool() {
2270 2271
        assert_eq!(Boolean(true).to_str().into_string(), "true".to_string());
        assert_eq!(Boolean(true).to_pretty_str().into_string(), "true".to_string());
2272

2273 2274
        assert_eq!(Boolean(false).to_str().into_string(), "false".to_string());
        assert_eq!(Boolean(false).to_pretty_str().into_string(), "false".to_string());
2275 2276 2277 2278
    }

    #[test]
    fn test_write_list() {
2279 2280
        assert_eq!(List(vec![]).to_str().into_string(), "[]".to_string());
        assert_eq!(List(vec![]).to_pretty_str().into_string(), "[]".to_string());
2281

2282
        assert_eq!(List(vec![Boolean(true)]).to_str().into_string(), "[true]".to_string());
2283
        assert_eq!(
2284
            List(vec![Boolean(true)]).to_pretty_str().into_string(),
2285
            "\
2286 2287
            [\n  \
                true\n\
2288
            ]".to_string()
2289
        );
2290

K
Kevin Ballard 已提交
2291
        let long_test_list = List(vec![
2292 2293
            Boolean(false),
            Null,
2294
            List(vec![String("foo\nbar".to_string()), Number(3.5)])]);
2295

2296 2297
        assert_eq!(long_test_list.to_str().into_string(),
            "[false,null,[\"foo\\nbar\",3.5]]".to_string());
2298
        assert_eq!(
2299
            long_test_list.to_pretty_str().into_string(),
2300
            "\
2301 2302 2303 2304 2305 2306 2307
            [\n  \
                false,\n  \
                null,\n  \
                [\n    \
                    \"foo\\nbar\",\n    \
                    3.5\n  \
                ]\n\
2308
            ]".to_string()
2309 2310 2311
        );
    }

2312
    #[test]
2313
    fn test_write_object() {
2314 2315
        assert_eq!(mk_object([]).to_str().into_string(), "{}".to_string());
        assert_eq!(mk_object([]).to_pretty_str().into_string(), "{}".to_string());
2316

2317
        assert_eq!(
2318
            mk_object([
2319 2320 2321
                ("a".to_string(), Boolean(true))
            ]).to_str().into_string(),
            "{\"a\":true}".to_string()
2322
        );
2323
        assert_eq!(
2324
            mk_object([("a".to_string(), Boolean(true))]).to_pretty_str(),
2325
            "\
2326 2327
            {\n  \
                \"a\": true\n\
2328
            }".to_string()
2329 2330
        );

2331
        let complex_obj = mk_object([
2332 2333 2334
                ("b".to_string(), List(vec![
                    mk_object([("c".to_string(), String("\x0c\r".to_string()))]),
                    mk_object([("d".to_string(), String("".to_string()))])
2335
                ]))
2336 2337 2338
            ]);

        assert_eq!(
2339
            complex_obj.to_str().into_string(),
2340
            "{\
2341 2342 2343 2344
                \"b\":[\
                    {\"c\":\"\\f\\r\"},\
                    {\"d\":\"\"}\
                ]\
2345
            }".to_string()
2346 2347
        );
        assert_eq!(
2348
            complex_obj.to_pretty_str().into_string(),
2349
            "\
2350 2351 2352 2353 2354 2355 2356 2357 2358
            {\n  \
                \"b\": [\n    \
                    {\n      \
                        \"c\": \"\\f\\r\"\n    \
                    },\n    \
                    {\n      \
                        \"d\": \"\"\n    \
                    }\n  \
                ]\n\
2359
            }".to_string()
2360
        );
2361

E
Erick Tryzelaar 已提交
2362
        let a = mk_object([
2363 2364 2365 2366
            ("a".to_string(), Boolean(true)),
            ("b".to_string(), List(vec![
                mk_object([("c".to_string(), String("\x0c\r".to_string()))]),
                mk_object([("d".to_string(), String("".to_string()))])
2367
            ]))
G
Graydon Hoare 已提交
2368
        ]);
2369

2370 2371
        // We can't compare the strings directly because the object fields be
        // printed in a different order.
2372
        assert_eq!(a.clone(), from_str(a.to_str().as_slice()).unwrap());
2373 2374
        assert_eq!(a.clone(),
                   from_str(a.to_pretty_str().as_slice()).unwrap());
2375 2376
    }

2377
    fn with_str_writer(f: |&mut io::Writer|) -> String {
A
Alex Crichton 已提交
2378
        use std::io::MemWriter;
A
Alex Crichton 已提交
2379 2380
        use std::str;

2381 2382
        let mut m = MemWriter::new();
        f(&mut m as &mut io::Writer);
2383
        str::from_utf8(m.unwrap().as_slice()).unwrap().to_string()
A
Alex Crichton 已提交
2384 2385
    }

2386
    #[test]
2387
    fn test_write_enum() {
2388
        let animal = Dog;
2389
        assert_eq!(
A
Adolfo Ochagavía 已提交
2390 2391
            with_str_writer(|writer| {
                let mut encoder = Encoder::new(writer);
S
Sean McArthur 已提交
2392
                animal.encode(&mut encoder).unwrap();
2393
            }),
2394
            "\"Dog\"".to_string()
2395 2396
        );
        assert_eq!(
A
Adolfo Ochagavía 已提交
2397 2398
            with_str_writer(|writer| {
                let mut encoder = PrettyEncoder::new(writer);
S
Sean McArthur 已提交
2399
                animal.encode(&mut encoder).unwrap();
2400
            }),
2401
            "\"Dog\"".to_string()
2402
        );
2403

2404
        let animal = Frog("Henry".to_string(), 349);
2405
        assert_eq!(
A
Adolfo Ochagavía 已提交
2406 2407
            with_str_writer(|writer| {
                let mut encoder = Encoder::new(writer);
S
Sean McArthur 已提交
2408
                animal.encode(&mut encoder).unwrap();
2409
            }),
2410
            "{\"variant\":\"Frog\",\"fields\":[\"Henry\",349]}".to_string()
2411 2412
        );
        assert_eq!(
A
Adolfo Ochagavía 已提交
2413 2414
            with_str_writer(|writer| {
                let mut encoder = PrettyEncoder::new(writer);
S
Sean McArthur 已提交
2415
                animal.encode(&mut encoder).unwrap();
2416
            }),
2417
            "\
2418 2419
            [\n  \
                \"Frog\",\n  \
2420 2421
                \"Henry\",\n  \
                349\n\
2422
            ]".to_string()
2423
        );
2424 2425 2426
    }

    #[test]
2427
    fn test_write_some() {
2428
        let value = Some("jodhpurs".to_string());
A
Adolfo Ochagavía 已提交
2429 2430
        let s = with_str_writer(|writer| {
            let mut encoder = Encoder::new(writer);
S
Sean McArthur 已提交
2431
            value.encode(&mut encoder).unwrap();
2432
        });
2433
        assert_eq!(s, "\"jodhpurs\"".to_string());
2434

2435
        let value = Some("jodhpurs".to_string());
A
Adolfo Ochagavía 已提交
2436 2437
        let s = with_str_writer(|writer| {
            let mut encoder = PrettyEncoder::new(writer);
S
Sean McArthur 已提交
2438
            value.encode(&mut encoder).unwrap();
2439
        });
2440
        assert_eq!(s, "\"jodhpurs\"".to_string());
2441 2442
    }

2443
    #[test]
2444
    fn test_write_none() {
2445
        let value: Option<String> = None;
A
Adolfo Ochagavía 已提交
2446 2447
        let s = with_str_writer(|writer| {
            let mut encoder = Encoder::new(writer);
S
Sean McArthur 已提交
2448
            value.encode(&mut encoder).unwrap();
2449
        });
2450
        assert_eq!(s, "null".to_string());
J
John Clements 已提交
2451

A
Adolfo Ochagavía 已提交
2452 2453
        let s = with_str_writer(|writer| {
            let mut encoder = Encoder::new(writer);
S
Sean McArthur 已提交
2454
            value.encode(&mut encoder).unwrap();
2455
        });
2456
        assert_eq!(s, "null".to_string());
2457 2458
    }

2459
    #[test]
2460
    fn test_trailing_characters() {
2461 2462 2463 2464 2465 2466
        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)));
2467 2468 2469 2470
    }

    #[test]
    fn test_read_identifiers() {
2471 2472 2473 2474 2475 2476
        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)));
2477

E
Erick Tryzelaar 已提交
2478 2479 2480 2481 2482 2483
        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)));
2484 2485
    }

2486 2487
    #[test]
    fn test_decode_identifiers() {
2488
        let v: () = super::decode("null").unwrap();
2489 2490
        assert_eq!(v, ());

2491
        let v: bool = super::decode("true").unwrap();
2492 2493
        assert_eq!(v, true);

2494
        let v: bool = super::decode("false").unwrap();
2495 2496 2497
        assert_eq!(v, false);
    }

2498
    #[test]
2499
    fn test_read_number() {
2500 2501
        assert_eq!(from_str("+"),   Err(SyntaxError(InvalidSyntax, 1, 1)));
        assert_eq!(from_str("."),   Err(SyntaxError(InvalidSyntax, 1, 1)));
M
mrec 已提交
2502
        assert_eq!(from_str("NaN"), Err(SyntaxError(InvalidSyntax, 1, 1)));
2503 2504 2505 2506 2507
        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)));
2508

D
Daniel Micay 已提交
2509 2510 2511 2512 2513 2514 2515 2516
        assert_eq!(from_str("3"), Ok(Number(3.0)));
        assert_eq!(from_str("3.1"), Ok(Number(3.1)));
        assert_eq!(from_str("-1.2"), Ok(Number(-1.2)));
        assert_eq!(from_str("0.4"), Ok(Number(0.4)));
        assert_eq!(from_str("0.4e5"), Ok(Number(0.4e5)));
        assert_eq!(from_str("0.4e+15"), Ok(Number(0.4e15)));
        assert_eq!(from_str("0.4e-01"), Ok(Number(0.4e-01)));
        assert_eq!(from_str(" 3 "), Ok(Number(3.0)));
2517 2518
    }

2519 2520
    #[test]
    fn test_decode_numbers() {
2521
        let v: f64 = super::decode("3").unwrap();
D
Daniel Micay 已提交
2522
        assert_eq!(v, 3.0);
2523

2524
        let v: f64 = super::decode("3.1").unwrap();
D
Daniel Micay 已提交
2525
        assert_eq!(v, 3.1);
2526

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

2530
        let v: f64 = super::decode("0.4").unwrap();
D
Daniel Micay 已提交
2531
        assert_eq!(v, 0.4);
2532

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

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

2539
        let v: f64 = super::decode("0.4e-01").unwrap();
D
Daniel Micay 已提交
2540
        assert_eq!(v, 0.4e-01);
2541 2542
    }

G
Gary Linscott 已提交
2543
    #[test]
2544
    fn test_read_str() {
2545 2546 2547
        assert_eq!(from_str("\""),    Err(SyntaxError(EOFWhileParsingString, 1, 2)));
        assert_eq!(from_str("\"lol"), Err(SyntaxError(EOFWhileParsingString, 1, 5)));

2548 2549 2550 2551 2552 2553 2554 2555 2556 2557
        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())));
2558 2559
    }

2560
    #[test]
2561
    fn test_decode_str() {
2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572
        let s = [("\"\"", ""),
                 ("\"foo\"", "foo"),
                 ("\"\\\"\"", "\""),
                 ("\"\\b\"", "\x08"),
                 ("\"\\n\"", "\n"),
                 ("\"\\r\"", "\r"),
                 ("\"\\t\"", "\t"),
                 ("\"\\u12ab\"", "\u12ab"),
                 ("\"\\uAB12\"", "\uAB12")];

        for &(i, o) in s.iter() {
2573
            let v: String = super::decode(i).unwrap();
2574 2575
            assert_eq!(v.as_slice(), o);
        }
2576 2577
    }

2578
    #[test]
2579
    fn test_read_list() {
2580 2581 2582 2583 2584
        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)));
2585

K
Kevin Ballard 已提交
2586 2587 2588 2589 2590
        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 已提交
2591
        assert_eq!(from_str("[3, 1]"),
K
Kevin Ballard 已提交
2592
                     Ok(List(vec![Number(3.0), Number(1.0)])));
E
Erick Tryzelaar 已提交
2593
        assert_eq!(from_str("\n[3, 2]\n"),
K
Kevin Ballard 已提交
2594
                     Ok(List(vec![Number(3.0), Number(2.0)])));
E
Erick Tryzelaar 已提交
2595
        assert_eq!(from_str("[2, [4, 1]]"),
K
Kevin Ballard 已提交
2596
               Ok(List(vec![Number(2.0), List(vec![Number(4.0), Number(1.0)])])));
2597 2598
    }

2599 2600
    #[test]
    fn test_decode_list() {
2601
        let v: Vec<()> = super::decode("[]").unwrap();
K
Kevin Ballard 已提交
2602
        assert_eq!(v, vec![]);
2603

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

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

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

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

2617
    #[test]
2618
    fn test_read_object() {
2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630
        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)));
2631

E
Erick Tryzelaar 已提交
2632 2633
        assert_eq!(from_str("{}").unwrap(), mk_object([]));
        assert_eq!(from_str("{\"a\": 3}").unwrap(),
2634
                  mk_object([("a".to_string(), Number(3.0))]));
2635

E
Erick Tryzelaar 已提交
2636 2637
        assert_eq!(from_str(
                      "{ \"a\": null, \"b\" : true }").unwrap(),
E
Erick Tryzelaar 已提交
2638
                  mk_object([
2639 2640
                      ("a".to_string(), Null),
                      ("b".to_string(), Boolean(true))]));
E
Erick Tryzelaar 已提交
2641
        assert_eq!(from_str("\n{ \"a\": null, \"b\" : true }\n").unwrap(),
E
Erick Tryzelaar 已提交
2642
                  mk_object([
2643 2644
                      ("a".to_string(), Null),
                      ("b".to_string(), Boolean(true))]));
E
Erick Tryzelaar 已提交
2645 2646
        assert_eq!(from_str(
                      "{\"a\" : 1.0 ,\"b\": [ true ]}").unwrap(),
E
Erick Tryzelaar 已提交
2647
                  mk_object([
2648 2649
                      ("a".to_string(), Number(1.0)),
                      ("b".to_string(), List(vec![Boolean(true)]))
2650
                  ]));
E
Erick Tryzelaar 已提交
2651
        assert_eq!(from_str(
2652 2653 2654 2655 2656 2657 2658 2659
                      "{\
                          \"a\": 1.0, \
                          \"b\": [\
                              true,\
                              \"foo\\nbar\", \
                              { \"c\": {\"d\": null} } \
                          ]\
                      }").unwrap(),
E
Erick Tryzelaar 已提交
2660
                  mk_object([
2661 2662
                      ("a".to_string(), Number(1.0)),
                      ("b".to_string(), List(vec![
B
Ben Striegel 已提交
2663
                          Boolean(true),
2664
                          String("foo\nbar".to_string()),
E
Erick Tryzelaar 已提交
2665
                          mk_object([
2666
                              ("c".to_string(), mk_object([("d".to_string(), Null)]))
2667 2668
                          ])
                      ]))
2669
                  ]));
2670 2671
    }

2672
    #[test]
2673
    fn test_decode_struct() {
2674
        let s = "{
2675 2676 2677
            \"inner\": [
                { \"a\": null, \"b\": 2, \"c\": [\"abc\", \"xyz\"] }
            ]
2678
        }";
2679 2680

        let v: Outer = super::decode(s).unwrap();
2681 2682 2683
        assert_eq!(
            v,
            Outer {
K
Kevin Ballard 已提交
2684
                inner: vec![
2685
                    Inner { a: (), b: 2, c: vec!["abc".to_string(), "xyz".to_string()] }
2686 2687 2688 2689 2690
                ]
            }
        );
    }

M
mrec 已提交
2691 2692 2693 2694 2695 2696 2697
    #[deriving(Decodable)]
    struct FloatStruct {
        f: f64,
        a: Vec<f64>
    }
    #[test]
    fn test_decode_struct_with_nan() {
2698 2699 2700 2701 2702
        let s = "{\"f\":null,\"a\":[null,123]}";
        let obj: FloatStruct = super::decode(s).unwrap();
        assert!(obj.f.is_nan());
        assert!(obj.a.get(0).is_nan());
        assert_eq!(obj.a.get(1), &123f64);
M
mrec 已提交
2703 2704
    }

2705 2706
    #[test]
    fn test_decode_option() {
2707
        let value: Option<String> = super::decode("null").unwrap();
2708 2709
        assert_eq!(value, None);

2710
        let value: Option<String> = super::decode("\"jodhpurs\"").unwrap();
2711
        assert_eq!(value, Some("jodhpurs".to_string()));
2712 2713
    }

2714
    #[test]
2715
    fn test_decode_enum() {
2716
        let value: Animal = super::decode("\"Dog\"").unwrap();
2717 2718
        assert_eq!(value, Dog);

2719
        let s = "{\"variant\":\"Frog\",\"fields\":[\"Henry\",349]}";
2720
        let value: Animal = super::decode(s).unwrap();
2721
        assert_eq!(value, Frog("Henry".to_string(), 349));
2722 2723
    }

2724
    #[test]
2725
    fn test_decode_map() {
2726
        let s = "{\"a\": \"Dog\", \"b\": {\"variant\":\"Frog\",\
2727
                  \"fields\":[\"Henry\", 349]}}";
2728
        let mut map: TreeMap<String, Animal> = super::decode(s).unwrap();
2729

2730 2731
        assert_eq!(map.pop(&"a".to_string()), Some(Dog));
        assert_eq!(map.pop(&"b".to_string()), Some(Frog("Henry".to_string(), 349)));
2732 2733
    }

2734
    #[test]
2735
    fn test_multiline_errors() {
E
Erick Tryzelaar 已提交
2736
        assert_eq!(from_str("{\n  \"foo\":\n \"bar\""),
2737
            Err(SyntaxError(EOFWhileParsingObject, 3u, 8u)));
2738
    }
2739 2740

    #[deriving(Decodable)]
M
mrec 已提交
2741
    #[allow(dead_code)]
2742 2743 2744
    struct DecodeStruct {
        x: f64,
        y: bool,
2745
        z: String,
K
Kevin Ballard 已提交
2746
        w: Vec<DecodeStruct>
2747 2748 2749 2750
    }
    #[deriving(Decodable)]
    enum DecodeEnum {
        A(f64),
2751
        B(String)
2752
    }
2753 2754
    fn check_err<T: Decodable<Decoder, DecoderError>>(to_parse: &'static str,
                                                      expected: DecoderError) {
S
Sean McArthur 已提交
2755
        let res: DecodeResult<T> = match from_str(to_parse) {
2756
            Err(e) => Err(ParseError(e)),
S
Sean McArthur 已提交
2757 2758
            Ok(json) => Decodable::decode(&mut Decoder::new(json))
        };
2759
        match res {
S
Sean McArthur 已提交
2760 2761
            Ok(_) => fail!("`{}` parsed & decoded ok, expecting error `{}`",
                              to_parse, expected),
2762
            Err(ParseError(e)) => fail!("`{}` is not valid json: {}",
S
Sean McArthur 已提交
2763
                                           to_parse, e),
2764
            Err(e) => {
S
Sean McArthur 已提交
2765
                assert_eq!(e, expected);
2766 2767 2768 2769 2770
            }
        }
    }
    #[test]
    fn test_decode_errors_struct() {
2771
        check_err::<DecodeStruct>("[]", ExpectedError("Object".to_string(), "[]".to_string()));
2772
        check_err::<DecodeStruct>("{\"x\": true, \"y\": true, \"z\": \"\", \"w\": []}",
2773
                                  ExpectedError("Number".to_string(), "true".to_string()));
2774
        check_err::<DecodeStruct>("{\"x\": 1, \"y\": [], \"z\": \"\", \"w\": []}",
2775
                                  ExpectedError("Boolean".to_string(), "[]".to_string()));
2776
        check_err::<DecodeStruct>("{\"x\": 1, \"y\": true, \"z\": {}, \"w\": []}",
2777
                                  ExpectedError("String".to_string(), "{}".to_string()));
2778
        check_err::<DecodeStruct>("{\"x\": 1, \"y\": true, \"z\": \"\", \"w\": null}",
2779
                                  ExpectedError("List".to_string(), "null".to_string()));
2780
        check_err::<DecodeStruct>("{\"x\": 1, \"y\": true, \"z\": \"\"}",
2781
                                  MissingFieldError("w".to_string()));
2782 2783 2784 2785
    }
    #[test]
    fn test_decode_errors_enum() {
        check_err::<DecodeEnum>("{}",
2786
                                MissingFieldError("variant".to_string()));
2787
        check_err::<DecodeEnum>("{\"variant\": 1}",
2788
                                ExpectedError("String".to_string(), "1".to_string()));
2789
        check_err::<DecodeEnum>("{\"variant\": \"A\"}",
2790
                                MissingFieldError("fields".to_string()));
2791
        check_err::<DecodeEnum>("{\"variant\": \"A\", \"fields\": null}",
2792
                                ExpectedError("List".to_string(), "null".to_string()));
2793
        check_err::<DecodeEnum>("{\"variant\": \"C\", \"fields\": []}",
2794
                                UnknownVariantError("C".to_string()));
2795
    }
2796 2797 2798 2799

    #[test]
    fn test_find(){
        let json_value = from_str("{\"dog\" : \"cat\"}").unwrap();
2800
        let found_str = json_value.find(&"dog".to_string());
2801
        assert!(found_str.is_some() && found_str.unwrap().as_string().unwrap() == "cat");
2802 2803 2804 2805 2806
    }

    #[test]
    fn test_find_path(){
        let json_value = from_str("{\"dog\":{\"cat\": {\"mouse\" : \"cheese\"}}}").unwrap();
2807 2808
        let found_str = json_value.find_path(&[&"dog".to_string(),
                                             &"cat".to_string(), &"mouse".to_string()]);
2809
        assert!(found_str.is_some() && found_str.unwrap().as_string().unwrap() == "cheese");
2810 2811 2812 2813 2814
    }

    #[test]
    fn test_search(){
        let json_value = from_str("{\"dog\":{\"cat\": {\"mouse\" : \"cheese\"}}}").unwrap();
2815
        let found_str = json_value.search(&"mouse".to_string()).and_then(|j| j.as_string());
2816
        assert!(found_str.is_some());
2817
        assert!(found_str.unwrap() == "cheese");
2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847
    }

    #[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]
2848
    fn test_is_string(){
2849
        let json_value = from_str("\"dog\"").unwrap();
2850
        assert!(json_value.is_string());
2851 2852 2853
    }

    #[test]
2854
    fn test_as_string(){
2855
        let json_value = from_str("\"dog\"").unwrap();
2856
        let json_str = json_value.as_string();
2857
        let expected_str = "dog";
2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901
        assert_eq!(json_str, Some(expected_str));
    }

    #[test]
    fn test_is_number(){
        let json_value = from_str("12").unwrap();
        assert!(json_value.is_number());
    }

    #[test]
    fn test_as_number(){
        let json_value = from_str("12").unwrap();
        let json_num = json_value.as_number();
        let expected_num = 12f64;
        assert!(json_num.is_some() && json_num.unwrap() == expected_num);
    }

    #[test]
    fn test_is_boolean(){
        let json_value = from_str("false").unwrap();
        assert!(json_value.is_boolean());
    }

    #[test]
    fn test_as_boolean(){
        let json_value = from_str("false").unwrap();
        let json_bool = json_value.as_boolean();
        let expected_bool = false;
        assert!(json_bool.is_some() && json_bool.unwrap() == expected_bool);
    }

    #[test]
    fn test_is_null(){
        let json_value = from_str("null").unwrap();
        assert!(json_value.is_null());
    }

    #[test]
    fn test_as_null(){
        let json_value = from_str("null").unwrap();
        let json_null = json_value.as_null();
        let expected_null = ();
        assert!(json_null.is_some() && json_null.unwrap() == expected_null);
    }
2902 2903 2904 2905 2906 2907

    #[test]
    fn test_encode_hashmap_with_numeric_key() {
        use std::str::from_utf8;
        use std::io::Writer;
        use std::io::MemWriter;
2908
        use std::collections::HashMap;
2909 2910 2911 2912 2913
        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 已提交
2914
            hm.encode(&mut encoder).unwrap();
2915 2916
        }
        let bytes = mem_buf.unwrap();
S
Steven Fackler 已提交
2917
        let json_str = from_utf8(bytes.as_slice()).unwrap();
2918
        match from_str(json_str) {
2919
            Err(_) => fail!("Unable to parse json_str: {}", json_str),
2920 2921 2922 2923 2924 2925 2926 2927
            _ => {} // it parsed and we are good to go
        }
    }
    #[test]
    fn test_prettyencode_hashmap_with_numeric_key() {
        use std::str::from_utf8;
        use std::io::Writer;
        use std::io::MemWriter;
2928
        use std::collections::HashMap;
2929 2930 2931 2932 2933
        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);
2934
            hm.encode(&mut encoder).unwrap()
2935 2936
        }
        let bytes = mem_buf.unwrap();
S
Steven Fackler 已提交
2937
        let json_str = from_utf8(bytes.as_slice()).unwrap();
2938
        match from_str(json_str) {
2939
            Err(_) => fail!("Unable to parse json_str: {}", json_str),
2940 2941 2942 2943 2944
            _ => {} // it parsed and we are good to go
        }
    }
    #[test]
    fn test_hashmap_with_numeric_key_can_handle_double_quote_delimited_key() {
2945
        use std::collections::HashMap;
2946 2947 2948
        use Decodable;
        let json_str = "{\"1\":true}";
        let json_obj = match from_str(json_str) {
2949
            Err(_) => fail!("Unable to parse json_str: {}", json_str),
2950 2951 2952
            Ok(o) => o
        };
        let mut decoder = Decoder::new(json_obj);
S
Sean McArthur 已提交
2953
        let _hm: HashMap<uint, bool> = Decodable::decode(&mut decoder).unwrap();
2954
    }
2955

2956 2957
    fn assert_stream_equal(src: &str,
                           expected: Vec<(JsonEvent, Vec<StackElement>)>) {
2958 2959 2960 2961 2962 2963 2964
        let mut parser = Parser::new(src.chars());
        let mut i = 0;
        loop {
            let evt = match parser.next() {
                Some(e) => e,
                None => { break; }
            };
2965
            let (ref expected_evt, ref expected_stack) = *expected.get(i);
2966 2967 2968 2969 2970 2971 2972 2973
            if !parser.stack().is_equal_to(expected_stack.as_slice()) {
                fail!("Parser stack is not equal to {}", expected_stack);
            }
            assert_eq!(&evt, expected_evt);
            i+=1;
        }
    }
    #[test]
2974
    #[ignore(cfg(target_word_size = "32"))] // FIXME(#14064)
2975 2976 2977
    fn test_streaming_parser() {
        assert_stream_equal(
            r#"{ "foo":"bar", "array" : [0, 1, 2,3 ,4,5], "idents":[null,true,false]}"#,
2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994
            vec![
                (ObjectStart,             vec![]),
                  (StringValue("bar".to_string()),   vec![Key("foo")]),
                  (ListStart,             vec![Key("array")]),
                    (NumberValue(0.0),    vec![Key("array"), Index(0)]),
                    (NumberValue(1.0),    vec![Key("array"), Index(1)]),
                    (NumberValue(2.0),    vec![Key("array"), Index(2)]),
                    (NumberValue(3.0),    vec![Key("array"), Index(3)]),
                    (NumberValue(4.0),    vec![Key("array"), Index(4)]),
                    (NumberValue(5.0),    vec![Key("array"), Index(5)]),
                  (ListEnd,               vec![Key("array")]),
                  (ListStart,             vec![Key("idents")]),
                    (NullValue,           vec![Key("idents"), Index(0)]),
                    (BooleanValue(true),  vec![Key("idents"), Index(1)]),
                    (BooleanValue(false), vec![Key("idents"), Index(2)]),
                  (ListEnd,               vec![Key("idents")]),
                (ObjectEnd,               vec![]),
2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008
            ]
        );
    }
    fn last_event(src: &str) -> JsonEvent {
        let mut parser = Parser::new(src.chars());
        let mut evt = NullValue;
        loop {
            evt = match parser.next() {
                Some(e) => e,
                None => return evt,
            }
        }
    }
    #[test]
3009
    #[ignore(cfg(target_word_size = "32"))] // FIXME(#14064)
3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024
    fn test_read_object_streaming() {
        assert_eq!(last_event("{ "),      Error(SyntaxError(EOFWhileParsingObject, 1, 3)));
        assert_eq!(last_event("{1"),      Error(SyntaxError(KeyMustBeAString,      1, 2)));
        assert_eq!(last_event("{ \"a\""), Error(SyntaxError(EOFWhileParsingObject, 1, 6)));
        assert_eq!(last_event("{\"a\""),  Error(SyntaxError(EOFWhileParsingObject, 1, 5)));
        assert_eq!(last_event("{\"a\" "), Error(SyntaxError(EOFWhileParsingObject, 1, 6)));

        assert_eq!(last_event("{\"a\" 1"),   Error(SyntaxError(ExpectedColon,         1, 6)));
        assert_eq!(last_event("{\"a\":"),    Error(SyntaxError(EOFWhileParsingValue,  1, 6)));
        assert_eq!(last_event("{\"a\":1"),   Error(SyntaxError(EOFWhileParsingObject, 1, 7)));
        assert_eq!(last_event("{\"a\":1 1"), Error(SyntaxError(InvalidSyntax,         1, 8)));
        assert_eq!(last_event("{\"a\":1,"),  Error(SyntaxError(EOFWhileParsingObject, 1, 8)));

        assert_stream_equal(
            "{}",
3025
            vec![(ObjectStart, vec![]), (ObjectEnd, vec![])]
3026 3027 3028
        );
        assert_stream_equal(
            "{\"a\": 3}",
3029 3030 3031 3032
            vec![
                (ObjectStart,        vec![]),
                  (NumberValue(3.0), vec![Key("a")]),
                (ObjectEnd,          vec![]),
3033 3034 3035 3036
            ]
        );
        assert_stream_equal(
            "{ \"a\": null, \"b\" : true }",
3037 3038 3039 3040 3041
            vec![
                (ObjectStart,           vec![]),
                  (NullValue,           vec![Key("a")]),
                  (BooleanValue(true),  vec![Key("b")]),
                (ObjectEnd,             vec![]),
3042 3043 3044 3045
            ]
        );
        assert_stream_equal(
            "{\"a\" : 1.0 ,\"b\": [ true ]}",
3046 3047 3048 3049 3050 3051 3052
            vec![
                (ObjectStart,           vec![]),
                  (NumberValue(1.0),    vec![Key("a")]),
                  (ListStart,           vec![Key("b")]),
                    (BooleanValue(true),vec![Key("b"), Index(0)]),
                  (ListEnd,             vec![Key("b")]),
                (ObjectEnd,             vec![]),
3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063
            ]
        );
        assert_stream_equal(
            r#"{
                "a": 1.0,
                "b": [
                    true,
                    "foo\nbar",
                    { "c": {"d": null} }
                ]
            }"#,
3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076
            vec![
                (ObjectStart,                   vec![]),
                  (NumberValue(1.0),            vec![Key("a")]),
                  (ListStart,                   vec![Key("b")]),
                    (BooleanValue(true),        vec![Key("b"), Index(0)]),
                    (StringValue("foo\nbar".to_string()),  vec![Key("b"), Index(1)]),
                    (ObjectStart,               vec![Key("b"), Index(2)]),
                      (ObjectStart,             vec![Key("b"), Index(2), Key("c")]),
                        (NullValue,             vec![Key("b"), Index(2), Key("c"), Key("d")]),
                      (ObjectEnd,               vec![Key("b"), Index(2), Key("c")]),
                    (ObjectEnd,                 vec![Key("b"), Index(2)]),
                  (ListEnd,                     vec![Key("b")]),
                (ObjectEnd,                     vec![]),
3077 3078 3079 3080
            ]
        );
    }
    #[test]
3081
    #[ignore(cfg(target_word_size = "32"))] // FIXME(#14064)
3082 3083 3084
    fn test_read_list_streaming() {
        assert_stream_equal(
            "[]",
3085 3086 3087
            vec![
                (ListStart, vec![]),
                (ListEnd,   vec![]),
3088 3089 3090 3091
            ]
        );
        assert_stream_equal(
            "[ ]",
3092 3093 3094
            vec![
                (ListStart, vec![]),
                (ListEnd,   vec![]),
3095 3096 3097 3098
            ]
        );
        assert_stream_equal(
            "[true]",
3099 3100 3101 3102
            vec![
                (ListStart,              vec![]),
                    (BooleanValue(true), vec![Index(0)]),
                (ListEnd,                vec![]),
3103 3104 3105 3106
            ]
        );
        assert_stream_equal(
            "[ false ]",
3107 3108 3109 3110
            vec![
                (ListStart,               vec![]),
                    (BooleanValue(false), vec![Index(0)]),
                (ListEnd,                 vec![]),
3111 3112 3113 3114
            ]
        );
        assert_stream_equal(
            "[null]",
3115 3116 3117 3118
            vec![
                (ListStart,     vec![]),
                    (NullValue, vec![Index(0)]),
                (ListEnd,       vec![]),
3119 3120 3121 3122
            ]
        );
        assert_stream_equal(
            "[3, 1]",
3123 3124 3125 3126 3127
            vec![
                (ListStart,     vec![]),
                    (NumberValue(3.0), vec![Index(0)]),
                    (NumberValue(1.0), vec![Index(1)]),
                (ListEnd,       vec![]),
3128 3129 3130 3131
            ]
        );
        assert_stream_equal(
            "\n[3, 2]\n",
3132 3133 3134 3135 3136
            vec![
                (ListStart,     vec![]),
                    (NumberValue(3.0), vec![Index(0)]),
                    (NumberValue(2.0), vec![Index(1)]),
                (ListEnd,       vec![]),
3137 3138 3139 3140
            ]
        );
        assert_stream_equal(
            "[2, [4, 1]]",
3141 3142 3143 3144 3145 3146 3147 3148
            vec![
                (ListStart,                 vec![]),
                    (NumberValue(2.0),      vec![Index(0)]),
                    (ListStart,             vec![Index(1)]),
                        (NumberValue(4.0),  vec![Index(1), Index(0)]),
                        (NumberValue(1.0),  vec![Index(1), Index(1)]),
                    (ListEnd,               vec![Index(1)]),
                (ListEnd,                   vec![]),
3149 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 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201
            ]
        );

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

        assert_eq!(from_str("["),     Err(SyntaxError(EOFWhileParsingValue, 1, 2)));
        assert_eq!(from_str("[1"),    Err(SyntaxError(EOFWhileParsingList,  1, 3)));
        assert_eq!(from_str("[1,"),   Err(SyntaxError(EOFWhileParsingValue, 1, 4)));
        assert_eq!(from_str("[1,]"),  Err(SyntaxError(InvalidSyntax,        1, 4)));
        assert_eq!(from_str("[6 7]"), Err(SyntaxError(InvalidSyntax,        1, 4)));

    }
    #[test]
    fn test_trailing_characters_streaming() {
        assert_eq!(last_event("nulla"),  Error(SyntaxError(TrailingCharacters, 1, 5)));
        assert_eq!(last_event("truea"),  Error(SyntaxError(TrailingCharacters, 1, 5)));
        assert_eq!(last_event("falsea"), Error(SyntaxError(TrailingCharacters, 1, 6)));
        assert_eq!(last_event("1a"),     Error(SyntaxError(TrailingCharacters, 1, 2)));
        assert_eq!(last_event("[]a"),    Error(SyntaxError(TrailingCharacters, 1, 3)));
        assert_eq!(last_event("{}a"),    Error(SyntaxError(TrailingCharacters, 1, 3)));
    }
    #[test]
    fn test_read_identifiers_streaming() {
        assert_eq!(Parser::new("null".chars()).next(), Some(NullValue));
        assert_eq!(Parser::new("true".chars()).next(), Some(BooleanValue(true)));
        assert_eq!(Parser::new("false".chars()).next(), Some(BooleanValue(false)));

        assert_eq!(last_event("n"),    Error(SyntaxError(InvalidSyntax, 1, 2)));
        assert_eq!(last_event("nul"),  Error(SyntaxError(InvalidSyntax, 1, 4)));
        assert_eq!(last_event("t"),    Error(SyntaxError(InvalidSyntax, 1, 2)));
        assert_eq!(last_event("truz"), Error(SyntaxError(InvalidSyntax, 1, 4)));
        assert_eq!(last_event("f"),    Error(SyntaxError(InvalidSyntax, 1, 2)));
        assert_eq!(last_event("faz"),  Error(SyntaxError(InvalidSyntax, 1, 3)));
    }

    #[test]
    fn test_stack() {
        let mut stack = Stack::new();

        assert!(stack.is_empty());
        assert!(stack.len() == 0);
        assert!(!stack.last_is_index());

        stack.push_index(0);
        stack.bump_index();

        assert!(stack.len() == 1);
        assert!(stack.is_equal_to([Index(1)]));
        assert!(stack.starts_with([Index(1)]));
        assert!(stack.ends_with([Index(1)]));
        assert!(stack.last_is_index());
        assert!(stack.get(0) == Index(1));

3202
        stack.push_key("foo".to_string());
3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213

        assert!(stack.len() == 2);
        assert!(stack.is_equal_to([Index(1), Key("foo")]));
        assert!(stack.starts_with([Index(1), Key("foo")]));
        assert!(stack.starts_with([Index(1)]));
        assert!(stack.ends_with([Index(1), Key("foo")]));
        assert!(stack.ends_with([Key("foo")]));
        assert!(!stack.last_is_index());
        assert!(stack.get(0) == Index(1));
        assert!(stack.get(1) == Key("foo"));

3214
        stack.push_key("bar".to_string());
3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241

        assert!(stack.len() == 3);
        assert!(stack.is_equal_to([Index(1), Key("foo"), Key("bar")]));
        assert!(stack.starts_with([Index(1)]));
        assert!(stack.starts_with([Index(1), Key("foo")]));
        assert!(stack.starts_with([Index(1), Key("foo"), Key("bar")]));
        assert!(stack.ends_with([Key("bar")]));
        assert!(stack.ends_with([Key("foo"), Key("bar")]));
        assert!(stack.ends_with([Index(1), Key("foo"), Key("bar")]));
        assert!(!stack.last_is_index());
        assert!(stack.get(0) == Index(1));
        assert!(stack.get(1) == Key("foo"));
        assert!(stack.get(2) == Key("bar"));

        stack.pop();

        assert!(stack.len() == 2);
        assert!(stack.is_equal_to([Index(1), Key("foo")]));
        assert!(stack.starts_with([Index(1), Key("foo")]));
        assert!(stack.starts_with([Index(1)]));
        assert!(stack.ends_with([Index(1), Key("foo")]));
        assert!(stack.ends_with([Key("foo")]));
        assert!(!stack.last_is_index());
        assert!(stack.get(0) == Index(1));
        assert!(stack.get(1) == Key("foo"));
    }

3242 3243
    #[test]
    fn test_to_json() {
3244
        use std::collections::{HashMap,TreeMap};
3245 3246 3247 3248 3249 3250 3251 3252
        use super::ToJson;

        let list2 = List(vec!(Number(1.0_f64), Number(2.0_f64)));
        let list3 = List(vec!(Number(1.0f64), Number(2.0f64), Number(3.0f64)));
        let object = {
            let mut tree_map = TreeMap::new();
            tree_map.insert("a".to_string(), Number(1.0_f64));
            tree_map.insert("b".to_string(), Number(2.0_f64));
A
Adolfo Ochagavía 已提交
3253
            Object(tree_map)
3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270
        };

        assert_eq!(list2.to_json(), list2);
        assert_eq!(object.to_json(), object);
        assert_eq!(3_i.to_json(), Number(3.0_f64));
        assert_eq!(4_i8.to_json(), Number(4.0_f64));
        assert_eq!(5_i16.to_json(), Number(5.0_f64));
        assert_eq!(6_i32.to_json(), Number(6.0_f64));
        assert_eq!(7_i64.to_json(), Number(7.0_f64));
        assert_eq!(8_u.to_json(), Number(8.0_f64));
        assert_eq!(9_u8.to_json(), Number(9.0_f64));
        assert_eq!(10_u16.to_json(), Number(10.0_f64));
        assert_eq!(11_u32.to_json(), Number(11.0_f64));
        assert_eq!(12_u64.to_json(), Number(12.0_f64));
        assert_eq!(13.0_f32.to_json(), Number(13.0_f64));
        assert_eq!(14.0_f64.to_json(), Number(14.0_f64));
        assert_eq!(().to_json(), Null);
M
mrec 已提交
3271 3272
        assert_eq!(f32::INFINITY.to_json(), Null);
        assert_eq!(f64::NAN.to_json(), Null);
3273 3274 3275
        assert_eq!(true.to_json(), Boolean(true));
        assert_eq!(false.to_json(), Boolean(false));
        assert_eq!("abc".to_string().to_json(), String("abc".to_string()));
3276 3277 3278 3279 3280 3281
        assert_eq!((1i, 2i).to_json(), list2);
        assert_eq!((1i, 2i, 3i).to_json(), list3);
        assert_eq!([1i, 2].to_json(), list2);
        assert_eq!((&[1i, 2, 3]).to_json(), list3);
        assert_eq!((vec![1i, 2]).to_json(), list2);
        assert_eq!(vec!(1i, 2i, 3i).to_json(), list3);
3282
        let mut tree_map = TreeMap::new();
3283
        tree_map.insert("a".to_string(), 1i);
3284 3285 3286
        tree_map.insert("b".to_string(), 2);
        assert_eq!(tree_map.to_json(), object);
        let mut hash_map = HashMap::new();
3287
        hash_map.insert("a".to_string(), 1i);
3288 3289
        hash_map.insert("b".to_string(), 2);
        assert_eq!(hash_map.to_json(), object);
3290
        assert_eq!(Some(15i).to_json(), Number(15f64));
3291 3292 3293
        assert_eq!(None::<int>.to_json(), Null);
    }

3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328
    #[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} }
                ]
            }"#);
        });
    }

3329
    fn big_json() -> String {
3330
        let mut src = "[\n".to_string();
3331
        for _ in range(0i, 500) {
3332 3333
            src.push_str(r#"{ "a": true, "b": null, "c":3.1415, "d": "Hello world", "e": \
                            [1,2,3]},"#);
3334
        }
3335
        src.push_str("{}]");
3336 3337 3338 3339 3340 3341 3342
        return src;
    }

    #[bench]
    fn bench_streaming_large(b: &mut Bencher) {
        let src = big_json();
        b.iter( || {
3343
            let mut parser = Parser::new(src.as_slice().chars());
3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354
            loop {
                match parser.next() {
                    None => return,
                    _ => {}
                }
            }
        });
    }
    #[bench]
    fn bench_large(b: &mut Bencher) {
        let src = big_json();
3355
        b.iter( || { let _ = from_str(src.as_slice()); });
3356
    }
3357
}