json.rs 114.6 KB
Newer Older
1
// Copyright 2012-2013 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

230
use std::char;
231
use std::collections::{HashMap, TreeMap};
D
Daniel Micay 已提交
232
use std::f64;
233
use std::fmt;
A
Alex Crichton 已提交
234
use std::io::MemWriter;
235
use std::io;
N
Nick Cameron 已提交
236
use std::mem::{swap,transmute};
D
Daniel Micay 已提交
237
use std::num;
238
use std::str::ScalarValue;
239
use std::str;
240
use std::string::String;
241
use std::vec::Vec;
242

A
Alex Crichton 已提交
243
use Encodable;
E
Elly Jones 已提交
244

245
/// Represents a json value
246
#[deriving(Clone, PartialEq)]
247
pub enum Json {
D
Daniel Micay 已提交
248
    Number(f64),
249
    String(String),
B
Ben Striegel 已提交
250
    Boolean(bool),
251
    List(List),
252
    Object(Box<Object>),
B
Ben Striegel 已提交
253
    Null,
E
Elly Jones 已提交
254 255
}

K
Kevin Ballard 已提交
256
pub type List = Vec<Json>;
257
pub type Object = TreeMap<String, Json>;
258

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

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

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

290
#[deriving(Clone, PartialEq, Show)]
291 292
pub enum DecoderError {
    ParseError(ParserError),
293 294 295
    ExpectedError(String, String),
    MissingFieldError(String),
    UnknownVariantError(String),
296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328
}

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

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)
329
}
330

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

334 335
fn escape_str(s: &str) -> String {
    let mut escaped = String::from_str("\"");
336
    for c in s.chars() {
337
        match c {
338 339 340 341 342 343 344 345
            '"' => 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 已提交
346
        }
347
    };
348
    escaped.push_char('"');
349
    escaped
E
Elly Jones 已提交
350 351
}

352
fn spaces(n: uint) -> String {
353
    String::from_char(n, ' ')
354 355
}

356
/// A structure for implementing serialization to JSON.
E
Erik Price 已提交
357
pub struct Encoder<'a> {
358
    wr: &'a mut io::Writer,
359 360
}

E
Erik Price 已提交
361
impl<'a> Encoder<'a> {
362 363
    /// Creates a new JSON encoder whose output will be written to the writer
    /// specified.
364
    pub fn new<'a>(wr: &'a mut io::Writer) -> Encoder<'a> {
S
Sean McArthur 已提交
365
        Encoder { wr: wr }
366
    }
M
musitdev 已提交
367 368

    /// Encode the specified struct into a json [u8]
S
Steven Fackler 已提交
369
    pub fn buffer_encode<T:Encodable<Encoder<'a>, io::IoError>>(to_encode_object: &T) -> Vec<u8>  {
M
musitdev 已提交
370 371
       //Serialize the object in a string using a writer
        let mut m = MemWriter::new();
N
Nick Cameron 已提交
372 373
        // FIXME(14302) remove the transmute and unsafe block.
        unsafe {
M
musitdev 已提交
374
            let mut encoder = Encoder::new(&mut m as &mut io::Writer);
S
Sean McArthur 已提交
375
            // MemWriter never Errs
N
Nick Cameron 已提交
376
            let _ = to_encode_object.encode(transmute(&mut encoder));
M
musitdev 已提交
377
        }
378
        m.unwrap()
M
musitdev 已提交
379 380 381
    }

    /// Encode the specified struct into a json str
382 383 384
    pub fn str_encode<T:Encodable<Encoder<'a>,
                        io::IoError>>(
                      to_encode_object: &T)
385
                      -> String {
S
Steven Fackler 已提交
386
        let buff = Encoder::buffer_encode(to_encode_object);
387
        str::from_utf8(buff.as_slice()).unwrap().to_string()
M
musitdev 已提交
388
    }
389 390
}

S
Sean McArthur 已提交
391 392
impl<'a> ::Encoder<io::IoError> for Encoder<'a> {
    fn emit_nil(&mut self) -> EncodeResult { write!(self.wr, "null") }
393

S
Sean McArthur 已提交
394 395 396 397 398
    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) }
399

S
Sean McArthur 已提交
400 401 402 403 404
    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) }
405

S
Sean McArthur 已提交
406
    fn emit_bool(&mut self, v: bool) -> EncodeResult {
407
        if v {
S
Sean McArthur 已提交
408
            write!(self.wr, "true")
409
        } else {
S
Sean McArthur 已提交
410
            write!(self.wr, "false")
411 412 413
        }
    }

S
Sean McArthur 已提交
414 415
    fn emit_f64(&mut self, v: f64) -> EncodeResult {
        write!(self.wr, "{}", f64::to_str_digits(v, 6u))
A
Alex Crichton 已提交
416
    }
S
Sean McArthur 已提交
417
    fn emit_f32(&mut self, v: f32) -> EncodeResult { self.emit_f64(v as f64) }
418

419 420 421
    fn emit_char(&mut self, v: char) -> EncodeResult {
        self.emit_str(str::from_char(v).as_slice())
    }
S
Sean McArthur 已提交
422 423
    fn emit_str(&mut self, v: &str) -> EncodeResult {
        write!(self.wr, "{}", escape_str(v))
A
Alex Crichton 已提交
424
    }
425

S
Sean McArthur 已提交
426 427 428
    fn emit_enum(&mut self,
                 _name: &str,
                 f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult { f(self) }
429

430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447
    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 {
            write!(self.wr, "{}", escape_str(name))
        } else {
            try!(write!(self.wr, "{{\"variant\":"));
            try!(write!(self.wr, "{}", escape_str(name)));
            try!(write!(self.wr, ",\"fields\":["));
            try!(f(self));
            write!(self.wr, "]}}")
        }
    }
448

S
Sean McArthur 已提交
449 450 451
    fn emit_enum_variant_arg(&mut self,
                             idx: uint,
                             f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
452
        if idx != 0 {
A
Alex Crichton 已提交
453
            try!(write!(self.wr, ","));
454
        }
S
Sean McArthur 已提交
455
        f(self)
456 457 458 459 460 461
    }

    fn emit_enum_struct_variant(&mut self,
                                name: &str,
                                id: uint,
                                cnt: uint,
S
Sean McArthur 已提交
462
                                f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
463 464 465 466 467 468
        self.emit_enum_variant(name, id, cnt, f)
    }

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

473 474 475 476 477 478 479 480
    fn emit_struct(&mut self,
                   _: &str,
                   _: uint,
                   f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
        try!(write!(self.wr, "{{"));
        try!(f(self));
        write!(self.wr, "}}")
    }
481 482 483 484

    fn emit_struct_field(&mut self,
                         name: &str,
                         idx: uint,
S
Sean McArthur 已提交
485 486
                         f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
        if idx != 0 { try!(write!(self.wr, ",")); }
A
Alex Crichton 已提交
487
        try!(write!(self.wr, "{}:", escape_str(name)));
S
Sean McArthur 已提交
488
        f(self)
489 490
    }

S
Sean McArthur 已提交
491
    fn emit_tuple(&mut self, len: uint, f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
492 493
        self.emit_seq(len, f)
    }
S
Sean McArthur 已提交
494 495 496
    fn emit_tuple_arg(&mut self,
                      idx: uint,
                      f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
497 498 499 500 501 502
        self.emit_seq_elt(idx, f)
    }

    fn emit_tuple_struct(&mut self,
                         _name: &str,
                         len: uint,
S
Sean McArthur 已提交
503
                         f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
504 505
        self.emit_seq(len, f)
    }
S
Sean McArthur 已提交
506 507 508
    fn emit_tuple_struct_arg(&mut self,
                             idx: uint,
                             f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
509 510 511
        self.emit_seq_elt(idx, f)
    }

S
Sean McArthur 已提交
512 513 514 515 516 517 518
    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)
    }
519

S
Sean McArthur 已提交
520
    fn emit_seq(&mut self, _len: uint, f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
A
Alex Crichton 已提交
521
        try!(write!(self.wr, "["));
S
Sean McArthur 已提交
522 523
        try!(f(self));
        write!(self.wr, "]")
524 525
    }

S
Sean McArthur 已提交
526
    fn emit_seq_elt(&mut self, idx: uint, f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
527
        if idx != 0 {
A
Alex Crichton 已提交
528
            try!(write!(self.wr, ","));
529 530 531 532
        }
        f(self)
    }

533 534 535 536 537
    fn emit_map(&mut self, _len: uint, f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
        try!(write!(self.wr, "{{"));
        try!(f(self));
        write!(self.wr, "}}")
    }
538

S
Sean McArthur 已提交
539 540 541
    fn emit_map_elt_key(&mut self,
                        idx: uint,
                        f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
542
        use std::str::from_utf8;
A
Alex Crichton 已提交
543
        if idx != 0 { try!(write!(self.wr, ",")) }
544 545 546
        // 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 已提交
547 548 549 550 551
        // FIXME(14302) remove the transmute and unsafe block.
        unsafe {
            let mut check_encoder = Encoder::new(&mut buf);
            try!(f(transmute(&mut check_encoder)));
        }
552
        let buf = buf.unwrap();
S
Steven Fackler 已提交
553
        let out = from_utf8(buf.as_slice()).unwrap();
554 555 556
        let needs_wrapping = out.char_at(0) != '"' &&
            out.char_at_reverse(out.len()) != '"';
        if needs_wrapping { try!(write!(self.wr, "\"")); }
S
Sean McArthur 已提交
557
        try!(f(self));
558
        if needs_wrapping { try!(write!(self.wr, "\"")); }
S
Sean McArthur 已提交
559
        Ok(())
560 561
    }

S
Sean McArthur 已提交
562 563 564
    fn emit_map_elt_val(&mut self,
                        _idx: uint,
                        f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
A
Alex Crichton 已提交
565
        try!(write!(self.wr, ":"));
566 567 568 569
        f(self)
    }
}

570 571
/// Another encoder for JSON, but prints out human-readable JSON instead of
/// compact data
E
Erik Price 已提交
572
pub struct PrettyEncoder<'a> {
573 574
    wr: &'a mut io::Writer,
    indent: uint,
575 576
}

E
Erik Price 已提交
577
impl<'a> PrettyEncoder<'a> {
578
    /// Creates a new encoder whose output will be written to the specified writer
579
    pub fn new<'a>(wr: &'a mut io::Writer) -> PrettyEncoder<'a> {
580 581 582 583
        PrettyEncoder {
            wr: wr,
            indent: 0,
        }
584
    }
585
}
586

S
Sean McArthur 已提交
587 588
impl<'a> ::Encoder<io::IoError> for PrettyEncoder<'a> {
    fn emit_nil(&mut self) -> EncodeResult { write!(self.wr, "null") }
589

S
Sean McArthur 已提交
590 591 592 593 594
    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) }
595

S
Sean McArthur 已提交
596 597 598 599 600
    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) }
601

S
Sean McArthur 已提交
602
    fn emit_bool(&mut self, v: bool) -> EncodeResult {
603
        if v {
S
Sean McArthur 已提交
604
            write!(self.wr, "true")
605
        } else {
S
Sean McArthur 已提交
606
            write!(self.wr, "false")
607 608 609
        }
    }

S
Sean McArthur 已提交
610 611
    fn emit_f64(&mut self, v: f64) -> EncodeResult {
        write!(self.wr, "{}", f64::to_str_digits(v, 6u))
A
Alex Crichton 已提交
612
    }
613 614 615
    fn emit_f32(&mut self, v: f32) -> EncodeResult {
        self.emit_f64(v as f64)
    }
616

617 618 619
    fn emit_char(&mut self, v: char) -> EncodeResult {
        self.emit_str(str::from_char(v).as_slice())
    }
S
Sean McArthur 已提交
620 621
    fn emit_str(&mut self, v: &str) -> EncodeResult {
        write!(self.wr, "{}", escape_str(v))
A
Alex Crichton 已提交
622
    }
623

S
Sean McArthur 已提交
624 625 626
    fn emit_enum(&mut self,
                 _name: &str,
                 f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
627 628 629 630 631 632 633
        f(self)
    }

    fn emit_enum_variant(&mut self,
                         name: &str,
                         _: uint,
                         cnt: uint,
S
Sean McArthur 已提交
634
                         f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
635
        if cnt == 0 {
S
Sean McArthur 已提交
636
            write!(self.wr, "{}", escape_str(name))
637 638
        } else {
            self.indent += 2;
A
Alex Crichton 已提交
639
            try!(write!(self.wr, "[\n{}{},\n", spaces(self.indent),
A
Alex Crichton 已提交
640
                          escape_str(name)));
S
Sean McArthur 已提交
641
            try!(f(self));
642
            self.indent -= 2;
S
Sean McArthur 已提交
643
            write!(self.wr, "\n{}]", spaces(self.indent))
644 645 646 647 648
        }
    }

    fn emit_enum_variant_arg(&mut self,
                             idx: uint,
S
Sean McArthur 已提交
649
                             f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
650
        if idx != 0 {
A
Alex Crichton 已提交
651
            try!(write!(self.wr, ",\n"));
652
        }
A
Alex Crichton 已提交
653
        try!(write!(self.wr, "{}", spaces(self.indent)));
654 655 656 657 658 659 660
        f(self)
    }

    fn emit_enum_struct_variant(&mut self,
                                name: &str,
                                id: uint,
                                cnt: uint,
S
Sean McArthur 已提交
661
                                f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
662 663 664 665 666 667
        self.emit_enum_variant(name, id, cnt, f)
    }

    fn emit_enum_struct_variant_field(&mut self,
                                      _: &str,
                                      idx: uint,
S
Sean McArthur 已提交
668
                                      f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
669 670 671 672
        self.emit_enum_variant_arg(idx, f)
    }


673 674 675 676 677 678 679 680 681 682 683 684 685 686
    fn emit_struct(&mut self,
                   _: &str,
                   len: uint,
                   f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
        if len == 0 {
            write!(self.wr, "{{}}")
        } else {
            try!(write!(self.wr, "{{"));
            self.indent += 2;
            try!(f(self));
            self.indent -= 2;
            write!(self.wr, "\n{}}}", spaces(self.indent))
        }
    }
687 688 689 690

    fn emit_struct_field(&mut self,
                         name: &str,
                         idx: uint,
S
Sean McArthur 已提交
691
                         f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
692
        if idx == 0 {
A
Alex Crichton 已提交
693
            try!(write!(self.wr, "\n"));
694
        } else {
A
Alex Crichton 已提交
695
            try!(write!(self.wr, ",\n"));
696
        }
A
Alex Crichton 已提交
697
        try!(write!(self.wr, "{}{}: ", spaces(self.indent), escape_str(name)));
S
Sean McArthur 已提交
698
        f(self)
699 700
    }

S
Sean McArthur 已提交
701 702 703
    fn emit_tuple(&mut self,
                  len: uint,
                  f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
704 705
        self.emit_seq(len, f)
    }
S
Sean McArthur 已提交
706 707 708
    fn emit_tuple_arg(&mut self,
                      idx: uint,
                      f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
709 710 711 712 713 714
        self.emit_seq_elt(idx, f)
    }

    fn emit_tuple_struct(&mut self,
                         _: &str,
                         len: uint,
S
Sean McArthur 已提交
715
                         f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
716 717 718 719
        self.emit_seq(len, f)
    }
    fn emit_tuple_struct_arg(&mut self,
                             idx: uint,
S
Sean McArthur 已提交
720
                             f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
721 722 723
        self.emit_seq_elt(idx, f)
    }

S
Sean McArthur 已提交
724 725 726 727 728 729 730
    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)
    }
731

S
Sean McArthur 已提交
732 733 734
    fn emit_seq(&mut self,
                len: uint,
                f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
735
        if len == 0 {
S
Sean McArthur 已提交
736
            write!(self.wr, "[]")
737
        } else {
A
Alex Crichton 已提交
738
            try!(write!(self.wr, "["));
739
            self.indent += 2;
S
Sean McArthur 已提交
740
            try!(f(self));
741
            self.indent -= 2;
S
Sean McArthur 已提交
742
            write!(self.wr, "\n{}]", spaces(self.indent))
743 744 745
        }
    }

S
Sean McArthur 已提交
746 747 748
    fn emit_seq_elt(&mut self,
                    idx: uint,
                    f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
749
        if idx == 0 {
A
Alex Crichton 已提交
750
            try!(write!(self.wr, "\n"));
751
        } else {
A
Alex Crichton 已提交
752
            try!(write!(self.wr, ",\n"));
753
        }
A
Alex Crichton 已提交
754
        try!(write!(self.wr, "{}", spaces(self.indent)));
755 756 757
        f(self)
    }

758 759 760 761 762 763 764 765 766 767 768 769 770
    fn emit_map(&mut self,
                len: uint,
                f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
        if len == 0 {
            write!(self.wr, "{{}}")
        } else {
            try!(write!(self.wr, "{{"));
            self.indent += 2;
            try!(f(self));
            self.indent -= 2;
            write!(self.wr, "\n{}}}", spaces(self.indent))
        }
    }
771

S
Sean McArthur 已提交
772 773 774
    fn emit_map_elt_key(&mut self,
                        idx: uint,
                        f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
775
        use std::str::from_utf8;
776
        if idx == 0 {
A
Alex Crichton 已提交
777
            try!(write!(self.wr, "\n"));
778
        } else {
A
Alex Crichton 已提交
779
            try!(write!(self.wr, ",\n"));
780
        }
A
Alex Crichton 已提交
781
        try!(write!(self.wr, "{}", spaces(self.indent)));
782 783 784
        // 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 已提交
785 786 787 788 789
        // FIXME(14302) remove the transmute and unsafe block.
        unsafe {
            let mut check_encoder = PrettyEncoder::new(&mut buf);
            try!(f(transmute(&mut check_encoder)));
        }
790
        let buf = buf.unwrap();
S
Steven Fackler 已提交
791
        let out = from_utf8(buf.as_slice()).unwrap();
792 793 794
        let needs_wrapping = out.char_at(0) != '"' &&
            out.char_at_reverse(out.len()) != '"';
        if needs_wrapping { try!(write!(self.wr, "\"")); }
S
Sean McArthur 已提交
795
        try!(f(self));
796
        if needs_wrapping { try!(write!(self.wr, "\"")); }
S
Sean McArthur 已提交
797
        Ok(())
798 799
    }

S
Sean McArthur 已提交
800 801 802
    fn emit_map_elt_val(&mut self,
                        _idx: uint,
                        f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
A
Alex Crichton 已提交
803
        try!(write!(self.wr, ": "));
S
Sean McArthur 已提交
804
        f(self)
805 806 807
    }
}

808 809
impl<E: ::Encoder<S>, S> Encodable<E, S> for Json {
    fn encode(&self, e: &mut E) -> Result<(), S> {
810 811 812 813 814 815 816 817 818 819 820
        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(),
        }
    }
}

821
impl Json {
J
Jorge Aparicio 已提交
822
    /// Encodes a json value into an io::writer.  Uses a single line.
S
Sean McArthur 已提交
823
    pub fn to_writer(&self, wr: &mut io::Writer) -> EncodeResult {
824
        let mut encoder = Encoder::new(wr);
S
Sean McArthur 已提交
825
        self.encode(&mut encoder)
826
    }
827

J
Jorge Aparicio 已提交
828
    /// Encodes a json value into an io::writer.
829
    /// Pretty-prints in a more readable format.
S
Sean McArthur 已提交
830
    pub fn to_pretty_writer(&self, wr: &mut io::Writer) -> EncodeResult {
831
        let mut encoder = PrettyEncoder::new(wr);
S
Sean McArthur 已提交
832
        self.encode(&mut encoder)
833
    }
834

835
    /// Encodes a json value into a string
836
    pub fn to_pretty_str(&self) -> String {
837
        let mut s = MemWriter::new();
A
Alex Crichton 已提交
838
        self.to_pretty_writer(&mut s as &mut io::Writer).unwrap();
839
        str::from_utf8(s.unwrap().as_slice()).unwrap().to_string()
840
    }
841 842 843

     /// If the Json value is an Object, returns the value associated with the provided key.
    /// Otherwise, returns None.
844
    pub fn find<'a>(&'a self, key: &String) -> Option<&'a Json>{
845 846 847 848 849 850 851
        match self {
            &Object(ref map) => map.find(key),
            _ => None
        }
    }

    /// Attempts to get a nested Json Object for each key in `keys`.
852
    /// If any key is found not to exist, find_path will return None.
853
    /// Otherwise, it will return the Json value associated with the final key.
854
    pub fn find_path<'a>(&'a self, keys: &[&String]) -> Option<&'a Json>{
855 856 857 858 859 860 861 862
        let mut target = self;
        for key in keys.iter() {
            match target.find(*key) {
                Some(t) => { target = t; },
                None => return None
            }
        }
        Some(target)
863 864 865 866 867
    }

    /// 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.
868
    pub fn search<'a>(&'a self, key: &String) -> Option<&'a Json> {
869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890
        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 {
891
        self.as_object().is_some()
892 893 894 895 896 897 898 899 900 901 902 903 904
    }

    /// 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 {
            &Object(ref map) => Some(&**map),
            _ => None
        }
    }

    /// Returns true if the Json value is a List. Returns false otherwise.
    pub fn is_list<'a>(&'a self) -> bool {
905
        self.as_list().is_some()
906 907 908 909 910 911 912 913 914 915 916 917
    }

    /// 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.
918 919
    pub fn is_string<'a>(&'a self) -> bool {
        self.as_string().is_some()
920 921 922 923
    }

    /// If the Json value is a String, returns the associated str.
    /// Returns None otherwise.
924
    pub fn as_string<'a>(&'a self) -> Option<&'a str> {
925 926 927 928 929 930 931 932
        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 {
933
        self.as_number().is_some()
934 935 936 937 938 939 940 941 942 943 944 945 946
    }

    /// 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 {
947
        self.as_boolean().is_some()
948 949 950 951 952 953 954 955 956 957 958 959 960
    }

    /// 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 {
961
        self.as_null().is_some()
962 963 964 965 966 967 968 969 970 971
    }

    /// 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 已提交
972 973
}

974
/// The output of the streaming parser.
975
#[deriving(PartialEq, Clone, Show)]
976 977 978 979 980 981 982
pub enum JsonEvent {
    ObjectStart,
    ObjectEnd,
    ListStart,
    ListEnd,
    BooleanValue(bool),
    NumberValue(f64),
983
    StringValue(String),
984 985 986 987
    NullValue,
    Error(ParserError),
}

988
#[deriving(PartialEq, Show)]
989 990 991 992 993 994 995 996 997
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 已提交
998
    // Initial state.
999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016
    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
1017
#[deriving(PartialEq, Clone, Show)]
1018 1019 1020 1021 1022 1023 1024
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.
1025
#[deriving(PartialEq, Clone, Show)]
1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 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
enum InternalStackElement {
    InternalIndex(u32),
    InternalKey(u16, u16), // start, size
}

impl Stack {
    pub fn new() -> Stack {
        Stack {
            stack: Vec::new(),
            str_buffer: Vec::new(),
        }
    }

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

    /// Returns true if the stack is empty, equivalent to self.len() == 0.
    pub fn is_empty(&self) -> bool { self.stack.len() == 0 }

    /// 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> {
        return 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())
          }
        }
    }

    /// 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.
1101
    fn push_key(&mut self, key: String) {
1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149
        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;
                unsafe {
                    self.str_buffer.set_len(new_size);
                }
            }
            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() {
          InternalIndex(i) => { i + 1 }
          _ => { fail!(); }
        };
        *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 已提交
1150
pub struct Parser<T> {
1151 1152 1153 1154
    rdr: T,
    ch: Option<char>,
    line: uint,
    col: uint,
1155 1156 1157
    // We maintain a stack representing where we are in the logical structure
    // of the JSON stream.
    stack: Stack,
J
Joseph Crail 已提交
1158
    // A state machine is kept to make it possible to interrupt and resume parsing.
1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180
    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());
    }
1181 1182
}

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

1198 1199 1200 1201
    /// 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;
1202
    }
1203

1204 1205
    fn eof(&self) -> bool { self.ch.is_none() }
    fn ch_or_null(&self) -> char { self.ch.unwrap_or('\x00') }
1206
    fn bump(&mut self) {
1207
        self.ch = self.rdr.next();
E
Elly Jones 已提交
1208

1209
        if self.ch_is('\n') {
1210 1211
            self.line += 1u;
            self.col = 1u;
G
Gary Linscott 已提交
1212 1213
        } else {
            self.col += 1u;
E
Elly Jones 已提交
1214
        }
1215 1216
    }

1217
    fn next_char(&mut self) -> Option<char> {
1218 1219 1220
        self.bump();
        self.ch
    }
1221 1222 1223
    fn ch_is(&self, c: char) -> bool {
        self.ch == Some(c)
    }
1224

1225 1226
    fn error<T>(&self, reason: ErrorCode) -> Result<T, ParserError> {
        Err(SyntaxError(reason, self.line, self.col))
1227 1228
    }

1229
    fn parse_whitespace(&mut self) {
1230 1231 1232 1233
        while self.ch_is(' ') ||
              self.ch_is('\n') ||
              self.ch_is('\t') ||
              self.ch_is('\r') { self.bump(); }
1234 1235
    }

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

1239
        if self.ch_is('-') {
1240
            self.bump();
D
Daniel Micay 已提交
1241
            neg = -1.0;
E
Elly Jones 已提交
1242
        }
1243

1244
        let mut res = match self.parse_integer() {
1245 1246
          Ok(res) => res,
          Err(e) => return Err(e)
1247 1248
        };

1249
        if self.ch_is('.') {
1250
            match self.parse_decimal(res) {
1251 1252
              Ok(r) => res = r,
              Err(e) => return Err(e)
1253
            }
E
Elly Jones 已提交
1254
        }
1255

1256
        if self.ch_is('e') || self.ch_is('E') {
1257
            match self.parse_exponent(res) {
1258 1259
              Ok(r) => res = r,
              Err(e) => return Err(e)
1260
            }
E
Elly Jones 已提交
1261
        }
1262

1263
        Ok(neg * res)
E
Elly Jones 已提交
1264 1265
    }

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

1269 1270 1271
        match self.ch_or_null() {
            '0' => {
                self.bump();
1272

1273 1274
                // There can be only one leading '0'.
                match self.ch_or_null() {
1275
                    '0' .. '9' => return self.error(InvalidNumber),
1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288
                    _ => ()
                }
            },
            '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,
                    }
1289 1290
                }
            }
1291
            _ => return self.error(InvalidNumber),
E
Elly Jones 已提交
1292
        }
1293
        Ok(res)
E
Elly Jones 已提交
1294 1295
    }

1296
    fn parse_decimal(&mut self, res: f64) -> Result<f64, ParserError> {
1297 1298 1299
        self.bump();

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

1305
        let mut res = res;
D
Daniel Micay 已提交
1306
        let mut dec = 1.0;
1307
        while !self.eof() {
1308 1309 1310 1311 1312 1313 1314
            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 已提交
1315 1316
            }
        }
1317

1318
        Ok(res)
E
Elly Jones 已提交
1319 1320
    }

1321
    fn parse_exponent(&mut self, mut res: f64) -> Result<f64, ParserError> {
1322 1323
        self.bump();

1324 1325
        let mut exp = 0u;
        let mut neg_exp = false;
1326

1327 1328 1329 1330 1331
        if self.ch_is('+') {
            self.bump();
        } else if self.ch_is('-') {
            self.bump();
            neg_exp = true;
1332 1333 1334
        }

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

1345 1346 1347
                    self.bump();
                }
                _ => break
1348 1349 1350
            }
        }

1351
        let exp: f64 = num::pow(10u as f64, exp);
1352 1353 1354 1355 1356 1357
        if neg_exp {
            res /= exp;
        } else {
            res *= exp;
        }

1358
        Ok(res)
E
Elly Jones 已提交
1359 1360
    }

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

            i += 1u;
        }

        // Error out if we didn't parse 4 digits.
        if i != 4u {
1382
            return self.error(InvalidEscape);
1383 1384 1385 1386 1387
        }

        Ok(n)
    }

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

G
Gary Linscott 已提交
1392
        loop {
1393
            self.bump();
G
Gary Linscott 已提交
1394
            if self.eof() {
1395
                return self.error(EOFWhileParsingString);
G
Gary Linscott 已提交
1396
            }
1397

H
Huon Wilson 已提交
1398
            if escape {
1399 1400 1401 1402 1403 1404 1405 1406 1407
                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'),
1408
                    'u' => match try!(self.decode_hex_escape()) {
1409
                        0xDC00 .. 0xDFFF => return self.error(LoneLeadingSurrogateInHexEscape),
1410 1411 1412 1413 1414 1415 1416 1417

                        // Non-BMP characters are encoded as a sequence of
                        // two hex escapes, representing UTF-16 surrogates.
                        n1 @ 0xD800 .. 0xDBFF => {
                            let c1 = self.next_char();
                            let c2 = self.next_char();
                            match (c1, c2) {
                                (Some('\\'), Some('u')) => (),
1418
                                _ => return self.error(UnexpectedEndOfHexEscape),
1419
                            }
1420

1421 1422 1423
                            let buf = [n1, try!(self.decode_hex_escape())];
                            match str::utf16_items(buf.as_slice()).next() {
                                Some(ScalarValue(c)) => res.push_char(c),
1424
                                _ => return self.error(LoneLeadingSurrogateInHexEscape),
1425
                            }
1426 1427
                        }

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

1451 1452 1453 1454
    // 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 已提交
1455
    // stream int the form of a stack that can be queried by the user using the
1456 1457 1458 1459 1460 1461 1462 1463 1464 1465
    // 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();
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 1504 1505 1506 1507 1508
            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;
    }
1509

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

1531
        let val = self.parse_value();
1532

1533 1534 1535 1536 1537 1538 1539 1540
        self.state = match val {
            Error(_) => { ParseFinished }
            ListStart => { ParseList(true) }
            ObjectStart => { ParseObject(true) }
            _ => { ParseListComma }
        };
        return val;
    }
1541

1542 1543 1544 1545 1546 1547 1548 1549 1550 1551
    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;
1552
            } else {
1553 1554 1555 1556 1557
                self.state = if self.stack.last_is_index() {
                    ParseListComma
                } else {
                    ParseObjectComma
                }
1558
            }
1559 1560 1561 1562 1563 1564 1565
            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 已提交
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 1600 1601 1602 1603 1604
    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);
1605 1606 1607
        self.bump();
        self.parse_whitespace();

1608
        let val = self.parse_value();
1609

1610 1611 1612 1613 1614 1615 1616 1617 1618 1619
        self.state = match val {
            Error(_) => { ParseFinished }
            ListStart => { ParseList(true) }
            ObjectStart => { ParseObject(true) }
            _ => { ParseObjectComma }
        };
        return val;
    }

    fn parse_object_end(&mut self) -> JsonEvent {
1620
        if self.ch_is('}') {
1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635
            if self.stack.is_empty() {
                self.state = ParseBeforeFinish;
            } else {
                self.state = if self.stack.last_is_index() {
                    ParseListComma
                } else {
                    ParseObjectComma
                }
            }
            self.bump();
            return ObjectEnd;
        } else if self.eof() {
            return self.error_event(EOFWhileParsingObject);
        } else {
            return self.error_event(InvalidSyntax);
1636
        }
1637
    }
1638

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

1665 1666 1667 1668 1669 1670 1671 1672
    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))
        }
    }
1673

1674 1675 1676 1677 1678
    fn error_event(&mut self, reason: ErrorCode) -> JsonEvent {
        self.state = ParseFinished;
        Error(SyntaxError(reason, self.line, self.col))
    }
}
1679

1680 1681 1682 1683 1684
/// A Builder consumes a json::Parser to create a generic Json structure.
pub struct Builder<T> {
    parser: Parser<T>,
    token: Option<JsonEvent>,
}
1685

1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717
impl<T: Iterator<char>> Builder<T> {
    /// Create a JSON Builder.
    pub fn new(src: T) -> Builder<T> {
        Builder {
            parser: Parser::new(src),
            token: None,
        }
    }

    // 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()); }
        }
        return result;
    }

    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)) => {
1718
                let mut temp = String::new();
1719 1720
                swap(s, &mut temp);
                Ok(String(temp))
1721
            }
1722 1723 1724 1725 1726 1727 1728 1729
            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) }
        }
    }
1730

1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741
    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) }
1742
            }
1743
            self.bump();
1744
        }
1745
    }
1746

1747 1748 1749
    fn build_object(&mut self) -> Result<Json, BuilderError> {
        self.bump();

1750
        let mut values = box TreeMap::new();
1751 1752 1753 1754 1755 1756 1757 1758 1759

        while self.token != None {
            match self.token {
                Some(ObjectEnd) => { return Ok(Object(values)); }
                Some(Error(e)) => { return Err(e); }
                None => { break; }
                _ => {}
            }
            let key = match self.parser.stack().top() {
1760
                Some(Key(k)) => { k.to_string() }
1761 1762 1763 1764 1765 1766 1767 1768 1769
                _ => { 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 已提交
1770 1771 1772
    }
}

1773

A
Alex Crichton 已提交
1774
/// Decodes a json value from an `&mut io::Reader`
1775
pub fn from_reader(rdr: &mut io::Reader) -> Result<Json, BuilderError> {
A
Alex Crichton 已提交
1776 1777
    let contents = match rdr.read_to_end() {
        Ok(c) => c,
1778
        Err(e) => return Err(io_error_to_error(e))
A
Alex Crichton 已提交
1779
    };
S
Steven Fackler 已提交
1780
    let s = match str::from_utf8(contents.as_slice()) {
1781
        Some(s) => s.to_string(),
1782
        None => return Err(SyntaxError(NotUtf8, 0, 0))
A
Alex Crichton 已提交
1783
    };
1784
    let mut builder = Builder::new(s.as_slice().chars());
1785
    builder.build()
E
Elly Jones 已提交
1786 1787
}

1788
/// Decodes a json value from a string
1789 1790 1791
pub fn from_str(s: &str) -> Result<Json, BuilderError> {
    let mut builder = Builder::new(s.chars());
    return builder.build();
1792 1793
}

1794
/// A structure to decode JSON to values in rust.
1795
pub struct Decoder {
1796
    stack: Vec<Json>,
1797 1798
}

1799 1800
impl Decoder {
    /// Creates a new decoder instance for decoding the specified JSON value.
1801
    pub fn new(json: Json) -> Decoder {
1802
        Decoder {
1803
            stack: vec!(json),
1804
        }
1805
    }
1806 1807
}

1808
impl Decoder {
S
Sean McArthur 已提交
1809 1810
    fn pop(&mut self) -> Json {
        self.stack.pop().unwrap()
1811 1812 1813
    }
}

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

1833
impl ::Decoder<DecoderError> for Decoder {
S
Sean McArthur 已提交
1834 1835 1836 1837
    fn read_nil(&mut self) -> DecodeResult<()> {
        debug!("read_nil");
        try!(expect!(self.pop(), Null));
        Ok(())
1838 1839
    }

S
Sean McArthur 已提交
1840 1841 1842 1843 1844
    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) }
1845

S
Sean McArthur 已提交
1846 1847 1848 1849 1850
    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) }
1851

S
Sean McArthur 已提交
1852
    fn read_bool(&mut self) -> DecodeResult<bool> {
1853
        debug!("read_bool");
S
Sean McArthur 已提交
1854
        Ok(try!(expect!(self.pop(), Boolean)))
1855 1856
    }

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

S
Sean McArthur 已提交
1874
    fn read_f32(&mut self) -> DecodeResult<f32> { Ok(try!(self.read_f64()) as f32) }
1875

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

1890
    fn read_str(&mut self) -> DecodeResult<String> {
1891
        debug!("read_str");
S
Sean McArthur 已提交
1892
        Ok(try!(expect!(self.pop(), String)))
1893 1894
    }

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

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

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

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


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

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

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

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

S
Sean McArthur 已提交
2005
    fn read_tuple<T>(&mut self, f: |&mut Decoder, uint| -> DecodeResult<T>) -> DecodeResult<T> {
2006
        debug!("read_tuple()");
2007 2008 2009
        self.read_seq(f)
    }

S
Sean McArthur 已提交
2010 2011 2012
    fn read_tuple_arg<T>(&mut self,
                         idx: uint,
                         f: |&mut Decoder| -> DecodeResult<T>) -> DecodeResult<T> {
2013
        debug!("read_tuple_arg(idx={})", idx);
2014 2015 2016 2017 2018
        self.read_seq_elt(idx, f)
    }

    fn read_tuple_struct<T>(&mut self,
                            name: &str,
S
Sean McArthur 已提交
2019 2020
                            f: |&mut Decoder, uint| -> DecodeResult<T>)
                            -> DecodeResult<T> {
2021
        debug!("read_tuple_struct(name={})", name);
2022 2023 2024 2025 2026
        self.read_tuple(f)
    }

    fn read_tuple_struct_arg<T>(&mut self,
                                idx: uint,
S
Sean McArthur 已提交
2027 2028
                                f: |&mut Decoder| -> DecodeResult<T>)
                                -> DecodeResult<T> {
2029
        debug!("read_tuple_struct_arg(idx={})", idx);
2030 2031 2032
        self.read_tuple_arg(idx, f)
    }

S
Sean McArthur 已提交
2033 2034
    fn read_option<T>(&mut self, f: |&mut Decoder, bool| -> DecodeResult<T>) -> DecodeResult<T> {
        match self.pop() {
2035 2036 2037 2038 2039
            Null => f(self, false),
            value => { self.stack.push(value); f(self, true) }
        }
    }

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

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

S
Sean McArthur 已提交
2057
    fn read_map<T>(&mut self, f: |&mut Decoder, uint| -> DecodeResult<T>) -> DecodeResult<T> {
2058
        debug!("read_map()");
S
Sean McArthur 已提交
2059 2060 2061 2062 2063 2064
        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));
        }
2065 2066 2067
        f(self, len)
    }

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

S
Sean McArthur 已提交
2074 2075
    fn read_map_elt_val<T>(&mut self, idx: uint, f: |&mut Decoder| -> DecodeResult<T>)
                           -> DecodeResult<T> {
2076
        debug!("read_map_elt_val(idx={})", idx);
2077 2078 2079 2080
        f(self)
    }
}

2081
/// Test if two json values are less than one another
2082
impl PartialOrd for Json {
2083
    fn lt(&self, other: &Json) -> bool {
H
Huon Wilson 已提交
2084
        match *self {
2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108
            Number(f0) => {
                match *other {
                    Number(f1) => f0 < f1,
                    String(_) | Boolean(_) | List(_) | Object(_) |
                    Null => true
                }
            }

            String(ref s0) => {
                match *other {
                    Number(_) => false,
                    String(ref s1) => s0 < s1,
                    Boolean(_) | List(_) | Object(_) | Null => true
                }
            }

            Boolean(b0) => {
                match *other {
                    Number(_) | String(_) => false,
                    Boolean(b1) => b0 < b1,
                    List(_) | Object(_) | Null => true
                }
            }

2109
            List(ref l0) => {
2110 2111
                match *other {
                    Number(_) | String(_) | Boolean(_) => false,
2112
                    List(ref l1) => (*l0) < (*l1),
2113 2114 2115 2116 2117 2118 2119
                    Object(_) | Null => true
                }
            }

            Object(ref d0) => {
                match *other {
                    Number(_) | String(_) | Boolean(_) | List(_) => false,
2120
                    Object(ref d1) => d0 < d1,
2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134
                    Null => true
                }
            }

            Null => {
                match *other {
                    Number(_) | String(_) | Boolean(_) | List(_) |
                    Object(_) =>
                        false,
                    Null => true
                }
            }
        }
    }
2135
}
2136

2137
/// A trait for converting values to JSON
2138
pub trait ToJson {
2139 2140 2141
    /// Converts the value of `self` to an instance of JSON
    fn to_json(&self) -> Json;
}
2142

2143
impl ToJson for Json {
2144
    fn to_json(&self) -> Json { (*self).clone() }
2145 2146
}

2147
impl ToJson for int {
D
Daniel Micay 已提交
2148
    fn to_json(&self) -> Json { Number(*self as f64) }
2149 2150
}

2151
impl ToJson for i8 {
D
Daniel Micay 已提交
2152
    fn to_json(&self) -> Json { Number(*self as f64) }
2153 2154
}

2155
impl ToJson for i16 {
D
Daniel Micay 已提交
2156
    fn to_json(&self) -> Json { Number(*self as f64) }
2157 2158
}

2159
impl ToJson for i32 {
D
Daniel Micay 已提交
2160
    fn to_json(&self) -> Json { Number(*self as f64) }
2161 2162
}

2163
impl ToJson for i64 {
D
Daniel Micay 已提交
2164
    fn to_json(&self) -> Json { Number(*self as f64) }
2165 2166
}

2167
impl ToJson for uint {
D
Daniel Micay 已提交
2168
    fn to_json(&self) -> Json { Number(*self as f64) }
2169 2170
}

2171
impl ToJson for u8 {
D
Daniel Micay 已提交
2172
    fn to_json(&self) -> Json { Number(*self as f64) }
2173 2174
}

2175
impl ToJson for u16 {
D
Daniel Micay 已提交
2176
    fn to_json(&self) -> Json { Number(*self as f64) }
2177 2178
}

2179
impl ToJson for u32 {
D
Daniel Micay 已提交
2180
    fn to_json(&self) -> Json { Number(*self as f64) }
2181 2182
}

2183
impl ToJson for u64 {
D
Daniel Micay 已提交
2184
    fn to_json(&self) -> Json { Number(*self as f64) }
2185 2186
}

2187
impl ToJson for f32 {
D
Daniel Micay 已提交
2188
    fn to_json(&self) -> Json { Number(*self as f64) }
2189 2190
}

2191
impl ToJson for f64 {
D
Daniel Micay 已提交
2192
    fn to_json(&self) -> Json { Number(*self) }
2193 2194
}

2195
impl ToJson for () {
B
Ben Striegel 已提交
2196
    fn to_json(&self) -> Json { Null }
2197 2198
}

2199
impl ToJson for bool {
B
Ben Striegel 已提交
2200
    fn to_json(&self) -> Json { Boolean(*self) }
2201 2202
}

2203
impl ToJson for String {
2204
    fn to_json(&self) -> Json { String((*self).clone()) }
2205 2206
}

2207
impl<A:ToJson,B:ToJson> ToJson for (A, B) {
B
Ben Striegel 已提交
2208 2209
    fn to_json(&self) -> Json {
        match *self {
2210
          (ref a, ref b) => {
K
Kevin Ballard 已提交
2211
            List(vec![a.to_json(), b.to_json()])
2212 2213
          }
        }
2214 2215 2216
    }
}

2217
impl<A:ToJson,B:ToJson,C:ToJson> ToJson for (A, B, C) {
B
Ben Striegel 已提交
2218 2219
    fn to_json(&self) -> Json {
        match *self {
2220
          (ref a, ref b, ref c) => {
K
Kevin Ballard 已提交
2221
            List(vec![a.to_json(), b.to_json(), c.to_json()])
2222 2223
          }
        }
2224 2225 2226
    }
}

2227 2228 2229 2230
impl<'a, A:ToJson> ToJson for &'a [A] {
    fn to_json(&self) -> Json { List(self.iter().map(|elt| elt.to_json()).collect()) }
}

2231 2232 2233 2234
impl<A:ToJson> ToJson for Vec<A> {
    fn to_json(&self) -> Json { List(self.iter().map(|elt| elt.to_json()).collect()) }
}

2235
impl<A:ToJson> ToJson for TreeMap<String, A> {
B
Ben Striegel 已提交
2236
    fn to_json(&self) -> Json {
2237
        let mut d = TreeMap::new();
D
Daniel Micay 已提交
2238
        for (key, value) in self.iter() {
2239
            d.insert((*key).clone(), value.to_json());
2240
        }
2241
        Object(box d)
2242 2243 2244
    }
}

2245
impl<A:ToJson> ToJson for HashMap<String, A> {
G
Graydon Hoare 已提交
2246
    fn to_json(&self) -> Json {
2247
        let mut d = TreeMap::new();
D
Daniel Micay 已提交
2248
        for (key, value) in self.iter() {
2249
            d.insert((*key).clone(), value.to_json());
G
Graydon Hoare 已提交
2250
        }
2251
        Object(box d)
G
Graydon Hoare 已提交
2252 2253 2254
    }
}

2255
impl<A:ToJson> ToJson for Option<A> {
B
Ben Striegel 已提交
2256 2257
    fn to_json(&self) -> Json {
        match *self {
B
Ben Striegel 已提交
2258
          None => Null,
2259
          Some(ref value) => value.to_json()
2260 2261 2262 2263
        }
    }
}

2264
impl fmt::Show for Json {
2265
    /// Encodes a json value into a string
2266
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
A
Alex Crichton 已提交
2267
        self.to_writer(f).map_err(|_| fmt::WriteError)
2268
    }
2269 2270
}

2271 2272
#[cfg(test)]
mod tests {
2273 2274
    extern crate test;
    use self::test::Bencher;
A
Alex Crichton 已提交
2275 2276
    use {Encodable, Decodable};
    use super::{Encoder, Decoder, Error, Boolean, Number, List, String, Null,
S
Sean McArthur 已提交
2277
                PrettyEncoder, Object, Json, from_str, ParseError, ExpectedError,
2278 2279 2280 2281 2282 2283 2284
                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
Alex Crichton 已提交
2285
    use std::io;
2286
    use std::collections::TreeMap;
2287

2288
    #[deriving(PartialEq, Encodable, Decodable, Show)]
2289 2290
    enum Animal {
        Dog,
2291
        Frog(String, int)
2292 2293
    }

2294
    #[deriving(PartialEq, Encodable, Decodable, Show)]
2295 2296 2297
    struct Inner {
        a: (),
        b: uint,
2298
        c: Vec<String>,
2299 2300
    }

2301
    #[deriving(PartialEq, Encodable, Decodable, Show)]
2302
    struct Outer {
K
Kevin Ballard 已提交
2303
        inner: Vec<Inner>,
2304 2305
    }

2306
    fn mk_object(items: &[(String, Json)]) -> Json {
2307
        let mut d = box TreeMap::new();
2308

D
Daniel Micay 已提交
2309
        for item in items.iter() {
2310
            match *item {
2311
                (ref key, ref value) => { d.insert((*key).clone(), (*value).clone()); },
2312
            }
2313 2314
        };

L
Luqman Aden 已提交
2315
        Object(d)
2316 2317 2318 2319
    }

    #[test]
    fn test_write_null() {
2320 2321
        assert_eq!(Null.to_str().into_string(), "null".to_string());
        assert_eq!(Null.to_pretty_str().into_string(), "null".to_string());
2322 2323
    }

2324

2325
    #[test]
2326
    fn test_write_number() {
2327 2328
        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());
2329

2330 2331
        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());
2332

2333 2334
        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());
2335

2336 2337
        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());
2338 2339 2340 2341
    }

    #[test]
    fn test_write_str() {
2342 2343
        assert_eq!(String("".to_string()).to_str().into_string(), "\"\"".to_string());
        assert_eq!(String("".to_string()).to_pretty_str().into_string(), "\"\"".to_string());
2344

2345 2346
        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());
2347 2348 2349 2350
    }

    #[test]
    fn test_write_bool() {
2351 2352
        assert_eq!(Boolean(true).to_str().into_string(), "true".to_string());
        assert_eq!(Boolean(true).to_pretty_str().into_string(), "true".to_string());
2353

2354 2355
        assert_eq!(Boolean(false).to_str().into_string(), "false".to_string());
        assert_eq!(Boolean(false).to_pretty_str().into_string(), "false".to_string());
2356 2357 2358 2359
    }

    #[test]
    fn test_write_list() {
2360 2361
        assert_eq!(List(vec![]).to_str().into_string(), "[]".to_string());
        assert_eq!(List(vec![]).to_pretty_str().into_string(), "[]".to_string());
2362

2363
        assert_eq!(List(vec![Boolean(true)]).to_str().into_string(), "[true]".to_string());
2364
        assert_eq!(
2365
            List(vec![Boolean(true)]).to_pretty_str().into_string(),
2366
            "\
2367 2368
            [\n  \
                true\n\
2369
            ]".to_string()
2370
        );
2371

K
Kevin Ballard 已提交
2372
        let long_test_list = List(vec![
2373 2374
            Boolean(false),
            Null,
2375
            List(vec![String("foo\nbar".to_string()), Number(3.5)])]);
2376

2377 2378
        assert_eq!(long_test_list.to_str().into_string(),
            "[false,null,[\"foo\\nbar\",3.5]]".to_string());
2379
        assert_eq!(
2380
            long_test_list.to_pretty_str().into_string(),
2381
            "\
2382 2383 2384 2385 2386 2387 2388
            [\n  \
                false,\n  \
                null,\n  \
                [\n    \
                    \"foo\\nbar\",\n    \
                    3.5\n  \
                ]\n\
2389
            ]".to_string()
2390 2391 2392
        );
    }

2393
    #[test]
2394
    fn test_write_object() {
2395 2396
        assert_eq!(mk_object([]).to_str().into_string(), "{}".to_string());
        assert_eq!(mk_object([]).to_pretty_str().into_string(), "{}".to_string());
2397

2398
        assert_eq!(
2399
            mk_object([
2400 2401 2402
                ("a".to_string(), Boolean(true))
            ]).to_str().into_string(),
            "{\"a\":true}".to_string()
2403
        );
2404
        assert_eq!(
2405
            mk_object([("a".to_string(), Boolean(true))]).to_pretty_str(),
2406
            "\
2407 2408
            {\n  \
                \"a\": true\n\
2409
            }".to_string()
2410 2411
        );

2412
        let complex_obj = mk_object([
2413 2414 2415
                ("b".to_string(), List(vec![
                    mk_object([("c".to_string(), String("\x0c\r".to_string()))]),
                    mk_object([("d".to_string(), String("".to_string()))])
2416
                ]))
2417 2418 2419
            ]);

        assert_eq!(
2420
            complex_obj.to_str().into_string(),
2421
            "{\
2422 2423 2424 2425
                \"b\":[\
                    {\"c\":\"\\f\\r\"},\
                    {\"d\":\"\"}\
                ]\
2426
            }".to_string()
2427 2428
        );
        assert_eq!(
2429
            complex_obj.to_pretty_str().into_string(),
2430
            "\
2431 2432 2433 2434 2435 2436 2437 2438 2439
            {\n  \
                \"b\": [\n    \
                    {\n      \
                        \"c\": \"\\f\\r\"\n    \
                    },\n    \
                    {\n      \
                        \"d\": \"\"\n    \
                    }\n  \
                ]\n\
2440
            }".to_string()
2441
        );
2442

E
Erick Tryzelaar 已提交
2443
        let a = mk_object([
2444 2445 2446 2447
            ("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()))])
2448
            ]))
G
Graydon Hoare 已提交
2449
        ]);
2450

2451 2452
        // We can't compare the strings directly because the object fields be
        // printed in a different order.
2453
        assert_eq!(a.clone(), from_str(a.to_str().as_slice()).unwrap());
2454 2455
        assert_eq!(a.clone(),
                   from_str(a.to_pretty_str().as_slice()).unwrap());
2456 2457
    }

2458
    fn with_str_writer(f: |&mut io::Writer|) -> String {
A
Alex Crichton 已提交
2459
        use std::io::MemWriter;
A
Alex Crichton 已提交
2460 2461
        use std::str;

2462 2463
        let mut m = MemWriter::new();
        f(&mut m as &mut io::Writer);
2464
        str::from_utf8(m.unwrap().as_slice()).unwrap().to_string()
A
Alex Crichton 已提交
2465 2466
    }

2467
    #[test]
2468
    fn test_write_enum() {
2469
        let animal = Dog;
2470
        assert_eq!(
2471
            with_str_writer(|wr| {
2472
                let mut encoder = Encoder::new(wr);
S
Sean McArthur 已提交
2473
                animal.encode(&mut encoder).unwrap();
2474
            }),
2475
            "\"Dog\"".to_string()
2476 2477
        );
        assert_eq!(
2478
            with_str_writer(|wr| {
2479
                let mut encoder = PrettyEncoder::new(wr);
S
Sean McArthur 已提交
2480
                animal.encode(&mut encoder).unwrap();
2481
            }),
2482
            "\"Dog\"".to_string()
2483
        );
2484

2485
        let animal = Frog("Henry".to_string(), 349);
2486
        assert_eq!(
2487
            with_str_writer(|wr| {
2488
                let mut encoder = Encoder::new(wr);
S
Sean McArthur 已提交
2489
                animal.encode(&mut encoder).unwrap();
2490
            }),
2491
            "{\"variant\":\"Frog\",\"fields\":[\"Henry\",349]}".to_string()
2492 2493
        );
        assert_eq!(
2494
            with_str_writer(|wr| {
2495
                let mut encoder = PrettyEncoder::new(wr);
S
Sean McArthur 已提交
2496
                animal.encode(&mut encoder).unwrap();
2497
            }),
2498
            "\
2499 2500
            [\n  \
                \"Frog\",\n  \
2501 2502
                \"Henry\",\n  \
                349\n\
2503
            ]".to_string()
2504
        );
2505 2506 2507
    }

    #[test]
2508
    fn test_write_some() {
2509
        let value = Some("jodhpurs".to_string());
2510
        let s = with_str_writer(|wr| {
2511
            let mut encoder = Encoder::new(wr);
S
Sean McArthur 已提交
2512
            value.encode(&mut encoder).unwrap();
2513
        });
2514
        assert_eq!(s, "\"jodhpurs\"".to_string());
2515

2516
        let value = Some("jodhpurs".to_string());
2517
        let s = with_str_writer(|wr| {
2518
            let mut encoder = PrettyEncoder::new(wr);
S
Sean McArthur 已提交
2519
            value.encode(&mut encoder).unwrap();
2520
        });
2521
        assert_eq!(s, "\"jodhpurs\"".to_string());
2522 2523
    }

2524
    #[test]
2525
    fn test_write_none() {
2526
        let value: Option<String> = None;
2527
        let s = with_str_writer(|wr| {
2528
            let mut encoder = Encoder::new(wr);
S
Sean McArthur 已提交
2529
            value.encode(&mut encoder).unwrap();
2530
        });
2531
        assert_eq!(s, "null".to_string());
J
John Clements 已提交
2532

2533
        let s = with_str_writer(|wr| {
2534
            let mut encoder = Encoder::new(wr);
S
Sean McArthur 已提交
2535
            value.encode(&mut encoder).unwrap();
2536
        });
2537
        assert_eq!(s, "null".to_string());
2538 2539
    }

2540
    #[test]
2541
    fn test_trailing_characters() {
2542 2543 2544 2545 2546 2547
        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)));
2548 2549 2550 2551
    }

    #[test]
    fn test_read_identifiers() {
2552 2553 2554 2555 2556 2557
        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)));
2558

E
Erick Tryzelaar 已提交
2559 2560 2561 2562 2563 2564
        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)));
2565 2566
    }

2567 2568
    #[test]
    fn test_decode_identifiers() {
2569
        let mut decoder = Decoder::new(from_str("null").unwrap());
S
Sean McArthur 已提交
2570
        let v: () = Decodable::decode(&mut decoder).unwrap();
2571 2572
        assert_eq!(v, ());

2573
        let mut decoder = Decoder::new(from_str("true").unwrap());
S
Sean McArthur 已提交
2574
        let v: bool = Decodable::decode(&mut decoder).unwrap();
2575 2576
        assert_eq!(v, true);

2577
        let mut decoder = Decoder::new(from_str("false").unwrap());
S
Sean McArthur 已提交
2578
        let v: bool = Decodable::decode(&mut decoder).unwrap();
2579 2580 2581
        assert_eq!(v, false);
    }

2582
    #[test]
2583
    fn test_read_number() {
2584 2585 2586 2587 2588 2589 2590
        assert_eq!(from_str("+"),   Err(SyntaxError(InvalidSyntax, 1, 1)));
        assert_eq!(from_str("."),   Err(SyntaxError(InvalidSyntax, 1, 1)));
        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)));
2591

D
Daniel Micay 已提交
2592 2593 2594 2595 2596 2597 2598 2599
        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)));
2600 2601
    }

2602 2603
    #[test]
    fn test_decode_numbers() {
2604
        let mut decoder = Decoder::new(from_str("3").unwrap());
S
Sean McArthur 已提交
2605
        let v: f64 = Decodable::decode(&mut decoder).unwrap();
D
Daniel Micay 已提交
2606
        assert_eq!(v, 3.0);
2607

2608
        let mut decoder = Decoder::new(from_str("3.1").unwrap());
S
Sean McArthur 已提交
2609
        let v: f64 = Decodable::decode(&mut decoder).unwrap();
D
Daniel Micay 已提交
2610
        assert_eq!(v, 3.1);
2611

2612
        let mut decoder = Decoder::new(from_str("-1.2").unwrap());
S
Sean McArthur 已提交
2613
        let v: f64 = Decodable::decode(&mut decoder).unwrap();
D
Daniel Micay 已提交
2614
        assert_eq!(v, -1.2);
2615

2616
        let mut decoder = Decoder::new(from_str("0.4").unwrap());
S
Sean McArthur 已提交
2617
        let v: f64 = Decodable::decode(&mut decoder).unwrap();
D
Daniel Micay 已提交
2618
        assert_eq!(v, 0.4);
2619

2620
        let mut decoder = Decoder::new(from_str("0.4e5").unwrap());
S
Sean McArthur 已提交
2621
        let v: f64 = Decodable::decode(&mut decoder).unwrap();
D
Daniel Micay 已提交
2622
        assert_eq!(v, 0.4e5);
2623

2624
        let mut decoder = Decoder::new(from_str("0.4e15").unwrap());
S
Sean McArthur 已提交
2625
        let v: f64 = Decodable::decode(&mut decoder).unwrap();
D
Daniel Micay 已提交
2626
        assert_eq!(v, 0.4e15);
2627

2628
        let mut decoder = Decoder::new(from_str("0.4e-01").unwrap());
S
Sean McArthur 已提交
2629
        let v: f64 = Decodable::decode(&mut decoder).unwrap();
D
Daniel Micay 已提交
2630
        assert_eq!(v, 0.4e-01);
2631 2632
    }

G
Gary Linscott 已提交
2633
    #[test]
2634
    fn test_read_str() {
2635 2636 2637
        assert_eq!(from_str("\""),    Err(SyntaxError(EOFWhileParsingString, 1, 2)));
        assert_eq!(from_str("\"lol"), Err(SyntaxError(EOFWhileParsingString, 1, 5)));

2638 2639 2640 2641 2642 2643 2644 2645 2646 2647
        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())));
2648 2649
    }

2650
    #[test]
2651
    fn test_decode_str() {
2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663
        let s = [("\"\"", ""),
                 ("\"foo\"", "foo"),
                 ("\"\\\"\"", "\""),
                 ("\"\\b\"", "\x08"),
                 ("\"\\n\"", "\n"),
                 ("\"\\r\"", "\r"),
                 ("\"\\t\"", "\t"),
                 ("\"\\u12ab\"", "\u12ab"),
                 ("\"\\uAB12\"", "\uAB12")];

        for &(i, o) in s.iter() {
            let mut decoder = Decoder::new(from_str(i).unwrap());
2664
            let v: String = Decodable::decode(&mut decoder).unwrap();
2665 2666 2667
            assert_eq!(v.as_slice(), o);

            let mut decoder = Decoder::new(from_str(i).unwrap());
2668
            let v: String = Decodable::decode(&mut decoder).unwrap();
2669
            assert_eq!(v, o.to_string());
2670
        }
2671 2672
    }

2673
    #[test]
2674
    fn test_read_list() {
2675 2676 2677 2678 2679
        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)));
2680

K
Kevin Ballard 已提交
2681 2682 2683 2684 2685
        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 已提交
2686
        assert_eq!(from_str("[3, 1]"),
K
Kevin Ballard 已提交
2687
                     Ok(List(vec![Number(3.0), Number(1.0)])));
E
Erick Tryzelaar 已提交
2688
        assert_eq!(from_str("\n[3, 2]\n"),
K
Kevin Ballard 已提交
2689
                     Ok(List(vec![Number(3.0), Number(2.0)])));
E
Erick Tryzelaar 已提交
2690
        assert_eq!(from_str("[2, [4, 1]]"),
K
Kevin Ballard 已提交
2691
               Ok(List(vec![Number(2.0), List(vec![Number(4.0), Number(1.0)])])));
2692 2693
    }

2694 2695
    #[test]
    fn test_decode_list() {
2696
        let mut decoder = Decoder::new(from_str("[]").unwrap());
K
Kevin Ballard 已提交
2697 2698
        let v: Vec<()> = Decodable::decode(&mut decoder).unwrap();
        assert_eq!(v, vec![]);
2699

2700
        let mut decoder = Decoder::new(from_str("[null]").unwrap());
K
Kevin Ballard 已提交
2701 2702
        let v: Vec<()> = Decodable::decode(&mut decoder).unwrap();
        assert_eq!(v, vec![()]);
2703

2704
        let mut decoder = Decoder::new(from_str("[true]").unwrap());
K
Kevin Ballard 已提交
2705 2706
        let v: Vec<bool> = Decodable::decode(&mut decoder).unwrap();
        assert_eq!(v, vec![true]);
2707

2708
        let mut decoder = Decoder::new(from_str("[true]").unwrap());
K
Kevin Ballard 已提交
2709 2710
        let v: Vec<bool> = Decodable::decode(&mut decoder).unwrap();
        assert_eq!(v, vec![true]);
2711

2712
        let mut decoder = Decoder::new(from_str("[3, 1]").unwrap());
K
Kevin Ballard 已提交
2713 2714
        let v: Vec<int> = Decodable::decode(&mut decoder).unwrap();
        assert_eq!(v, vec![3, 1]);
2715

2716
        let mut decoder = Decoder::new(from_str("[[3], [1, 2]]").unwrap());
K
Kevin Ballard 已提交
2717 2718
        let v: Vec<Vec<uint>> = Decodable::decode(&mut decoder).unwrap();
        assert_eq!(v, vec![vec![3], vec![1, 2]]);
2719 2720
    }

2721
    #[test]
2722
    fn test_read_object() {
2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734
        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)));
2735

E
Erick Tryzelaar 已提交
2736 2737
        assert_eq!(from_str("{}").unwrap(), mk_object([]));
        assert_eq!(from_str("{\"a\": 3}").unwrap(),
2738
                  mk_object([("a".to_string(), Number(3.0))]));
2739

E
Erick Tryzelaar 已提交
2740 2741
        assert_eq!(from_str(
                      "{ \"a\": null, \"b\" : true }").unwrap(),
E
Erick Tryzelaar 已提交
2742
                  mk_object([
2743 2744
                      ("a".to_string(), Null),
                      ("b".to_string(), Boolean(true))]));
E
Erick Tryzelaar 已提交
2745
        assert_eq!(from_str("\n{ \"a\": null, \"b\" : true }\n").unwrap(),
E
Erick Tryzelaar 已提交
2746
                  mk_object([
2747 2748
                      ("a".to_string(), Null),
                      ("b".to_string(), Boolean(true))]));
E
Erick Tryzelaar 已提交
2749 2750
        assert_eq!(from_str(
                      "{\"a\" : 1.0 ,\"b\": [ true ]}").unwrap(),
E
Erick Tryzelaar 已提交
2751
                  mk_object([
2752 2753
                      ("a".to_string(), Number(1.0)),
                      ("b".to_string(), List(vec![Boolean(true)]))
2754
                  ]));
E
Erick Tryzelaar 已提交
2755
        assert_eq!(from_str(
2756 2757 2758 2759 2760 2761 2762 2763
                      "{\
                          \"a\": 1.0, \
                          \"b\": [\
                              true,\
                              \"foo\\nbar\", \
                              { \"c\": {\"d\": null} } \
                          ]\
                      }").unwrap(),
E
Erick Tryzelaar 已提交
2764
                  mk_object([
2765 2766
                      ("a".to_string(), Number(1.0)),
                      ("b".to_string(), List(vec![
B
Ben Striegel 已提交
2767
                          Boolean(true),
2768
                          String("foo\nbar".to_string()),
E
Erick Tryzelaar 已提交
2769
                          mk_object([
2770
                              ("c".to_string(), mk_object([("d".to_string(), Null)]))
2771 2772
                          ])
                      ]))
2773
                  ]));
2774 2775
    }

2776
    #[test]
2777
    fn test_decode_struct() {
2778
        let s = "{
2779 2780 2781
            \"inner\": [
                { \"a\": null, \"b\": 2, \"c\": [\"abc\", \"xyz\"] }
            ]
2782
        }";
2783
        let mut decoder = Decoder::new(from_str(s).unwrap());
S
Sean McArthur 已提交
2784
        let v: Outer = Decodable::decode(&mut decoder).unwrap();
2785 2786 2787
        assert_eq!(
            v,
            Outer {
K
Kevin Ballard 已提交
2788
                inner: vec![
2789
                    Inner { a: (), b: 2, c: vec!["abc".to_string(), "xyz".to_string()] }
2790 2791 2792 2793 2794 2795 2796
                ]
            }
        );
    }

    #[test]
    fn test_decode_option() {
2797
        let mut decoder = Decoder::new(from_str("null").unwrap());
2798
        let value: Option<String> = Decodable::decode(&mut decoder).unwrap();
2799 2800
        assert_eq!(value, None);

2801
        let mut decoder = Decoder::new(from_str("\"jodhpurs\"").unwrap());
2802
        let value: Option<String> = Decodable::decode(&mut decoder).unwrap();
2803
        assert_eq!(value, Some("jodhpurs".to_string()));
2804 2805
    }

2806
    #[test]
2807
    fn test_decode_enum() {
2808
        let mut decoder = Decoder::new(from_str("\"Dog\"").unwrap());
S
Sean McArthur 已提交
2809
        let value: Animal = Decodable::decode(&mut decoder).unwrap();
2810 2811
        assert_eq!(value, Dog);

2812
        let s = "{\"variant\":\"Frog\",\"fields\":[\"Henry\",349]}";
2813
        let mut decoder = Decoder::new(from_str(s).unwrap());
S
Sean McArthur 已提交
2814
        let value: Animal = Decodable::decode(&mut decoder).unwrap();
2815
        assert_eq!(value, Frog("Henry".to_string(), 349));
2816 2817
    }

2818
    #[test]
2819
    fn test_decode_map() {
2820
        let s = "{\"a\": \"Dog\", \"b\": {\"variant\":\"Frog\",\
2821
                  \"fields\":[\"Henry\", 349]}}";
2822
        let mut decoder = Decoder::new(from_str(s).unwrap());
2823
        let mut map: TreeMap<String, Animal> = Decodable::decode(&mut decoder).unwrap();
2824

2825 2826
        assert_eq!(map.pop(&"a".to_string()), Some(Dog));
        assert_eq!(map.pop(&"b".to_string()), Some(Frog("Henry".to_string(), 349)));
2827 2828
    }

2829
    #[test]
2830
    fn test_multiline_errors() {
E
Erick Tryzelaar 已提交
2831
        assert_eq!(from_str("{\n  \"foo\":\n \"bar\""),
2832
            Err(SyntaxError(EOFWhileParsingObject, 3u, 8u)));
2833
    }
2834 2835 2836 2837 2838

    #[deriving(Decodable)]
    struct DecodeStruct {
        x: f64,
        y: bool,
2839
        z: String,
K
Kevin Ballard 已提交
2840
        w: Vec<DecodeStruct>
2841 2842 2843 2844
    }
    #[deriving(Decodable)]
    enum DecodeEnum {
        A(f64),
2845
        B(String)
2846
    }
2847 2848
    fn check_err<T: Decodable<Decoder, DecoderError>>(to_parse: &'static str,
                                                      expected: DecoderError) {
S
Sean McArthur 已提交
2849
        let res: DecodeResult<T> = match from_str(to_parse) {
2850
            Err(e) => Err(ParseError(e)),
S
Sean McArthur 已提交
2851 2852
            Ok(json) => Decodable::decode(&mut Decoder::new(json))
        };
2853
        match res {
S
Sean McArthur 已提交
2854 2855
            Ok(_) => fail!("`{}` parsed & decoded ok, expecting error `{}`",
                              to_parse, expected),
2856
            Err(ParseError(e)) => fail!("`{}` is not valid json: {}",
S
Sean McArthur 已提交
2857
                                           to_parse, e),
2858
            Err(e) => {
S
Sean McArthur 已提交
2859
                assert_eq!(e, expected);
2860 2861 2862 2863 2864
            }
        }
    }
    #[test]
    fn test_decode_errors_struct() {
2865
        check_err::<DecodeStruct>("[]", ExpectedError("Object".to_string(), "[]".to_string()));
2866
        check_err::<DecodeStruct>("{\"x\": true, \"y\": true, \"z\": \"\", \"w\": []}",
2867
                                  ExpectedError("Number".to_string(), "true".to_string()));
2868
        check_err::<DecodeStruct>("{\"x\": 1, \"y\": [], \"z\": \"\", \"w\": []}",
2869
                                  ExpectedError("Boolean".to_string(), "[]".to_string()));
2870
        check_err::<DecodeStruct>("{\"x\": 1, \"y\": true, \"z\": {}, \"w\": []}",
2871
                                  ExpectedError("String".to_string(), "{}".to_string()));
2872
        check_err::<DecodeStruct>("{\"x\": 1, \"y\": true, \"z\": \"\", \"w\": null}",
2873
                                  ExpectedError("List".to_string(), "null".to_string()));
2874
        check_err::<DecodeStruct>("{\"x\": 1, \"y\": true, \"z\": \"\"}",
2875
                                  MissingFieldError("w".to_string()));
2876 2877 2878 2879
    }
    #[test]
    fn test_decode_errors_enum() {
        check_err::<DecodeEnum>("{}",
2880
                                MissingFieldError("variant".to_string()));
2881
        check_err::<DecodeEnum>("{\"variant\": 1}",
2882
                                ExpectedError("String".to_string(), "1".to_string()));
2883
        check_err::<DecodeEnum>("{\"variant\": \"A\"}",
2884
                                MissingFieldError("fields".to_string()));
2885
        check_err::<DecodeEnum>("{\"variant\": \"A\", \"fields\": null}",
2886
                                ExpectedError("List".to_string(), "null".to_string()));
2887
        check_err::<DecodeEnum>("{\"variant\": \"C\", \"fields\": []}",
2888
                                UnknownVariantError("C".to_string()));
2889
    }
2890 2891 2892 2893

    #[test]
    fn test_find(){
        let json_value = from_str("{\"dog\" : \"cat\"}").unwrap();
2894
        let found_str = json_value.find(&"dog".to_string());
2895
        assert!(found_str.is_some() && found_str.unwrap().as_string().unwrap() == "cat");
2896 2897 2898 2899 2900
    }

    #[test]
    fn test_find_path(){
        let json_value = from_str("{\"dog\":{\"cat\": {\"mouse\" : \"cheese\"}}}").unwrap();
2901 2902
        let found_str = json_value.find_path(&[&"dog".to_string(),
                                             &"cat".to_string(), &"mouse".to_string()]);
2903
        assert!(found_str.is_some() && found_str.unwrap().as_string().unwrap() == "cheese");
2904 2905 2906 2907 2908
    }

    #[test]
    fn test_search(){
        let json_value = from_str("{\"dog\":{\"cat\": {\"mouse\" : \"cheese\"}}}").unwrap();
2909
        let found_str = json_value.search(&"mouse".to_string()).and_then(|j| j.as_string());
2910
        assert!(found_str.is_some());
2911
        assert!(found_str.unwrap() == "cheese");
2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941
    }

    #[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]
2942
    fn test_is_string(){
2943
        let json_value = from_str("\"dog\"").unwrap();
2944
        assert!(json_value.is_string());
2945 2946 2947
    }

    #[test]
2948
    fn test_as_string(){
2949
        let json_value = from_str("\"dog\"").unwrap();
2950
        let json_str = json_value.as_string();
2951
        let expected_str = "dog";
2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995
        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);
    }
2996 2997 2998 2999 3000 3001

    #[test]
    fn test_encode_hashmap_with_numeric_key() {
        use std::str::from_utf8;
        use std::io::Writer;
        use std::io::MemWriter;
3002
        use std::collections::HashMap;
3003 3004 3005 3006 3007
        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 已提交
3008
            hm.encode(&mut encoder).unwrap();
3009 3010
        }
        let bytes = mem_buf.unwrap();
S
Steven Fackler 已提交
3011
        let json_str = from_utf8(bytes.as_slice()).unwrap();
3012
        match from_str(json_str) {
3013
            Err(_) => fail!("Unable to parse json_str: {}", json_str),
3014 3015 3016 3017 3018 3019 3020 3021
            _ => {} // 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;
3022
        use std::collections::HashMap;
3023 3024 3025 3026 3027
        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);
3028
            hm.encode(&mut encoder).unwrap()
3029 3030
        }
        let bytes = mem_buf.unwrap();
S
Steven Fackler 已提交
3031
        let json_str = from_utf8(bytes.as_slice()).unwrap();
3032
        match from_str(json_str) {
3033
            Err(_) => fail!("Unable to parse json_str: {}", json_str),
3034 3035 3036 3037 3038
            _ => {} // it parsed and we are good to go
        }
    }
    #[test]
    fn test_hashmap_with_numeric_key_can_handle_double_quote_delimited_key() {
3039
        use std::collections::HashMap;
3040 3041 3042
        use Decodable;
        let json_str = "{\"1\":true}";
        let json_obj = match from_str(json_str) {
3043
            Err(_) => fail!("Unable to parse json_str: {}", json_str),
3044 3045 3046
            Ok(o) => o
        };
        let mut decoder = Decoder::new(json_obj);
S
Sean McArthur 已提交
3047
        let _hm: HashMap<uint, bool> = Decodable::decode(&mut decoder).unwrap();
3048
    }
3049

3050 3051
    fn assert_stream_equal(src: &str,
                           expected: Vec<(JsonEvent, Vec<StackElement>)>) {
3052 3053 3054 3055 3056 3057 3058
        let mut parser = Parser::new(src.chars());
        let mut i = 0;
        loop {
            let evt = match parser.next() {
                Some(e) => e,
                None => { break; }
            };
3059
            let (ref expected_evt, ref expected_stack) = *expected.get(i);
3060 3061 3062 3063 3064 3065 3066 3067
            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]
3068
    #[ignore(cfg(target_word_size = "32"))] // FIXME(#14064)
3069 3070 3071
    fn test_streaming_parser() {
        assert_stream_equal(
            r#"{ "foo":"bar", "array" : [0, 1, 2,3 ,4,5], "idents":[null,true,false]}"#,
3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088
            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![]),
3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102
            ]
        );
    }
    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]
3103
    #[ignore(cfg(target_word_size = "32"))] // FIXME(#14064)
3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118
    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(
            "{}",
3119
            vec![(ObjectStart, vec![]), (ObjectEnd, vec![])]
3120 3121 3122
        );
        assert_stream_equal(
            "{\"a\": 3}",
3123 3124 3125 3126
            vec![
                (ObjectStart,        vec![]),
                  (NumberValue(3.0), vec![Key("a")]),
                (ObjectEnd,          vec![]),
3127 3128 3129 3130
            ]
        );
        assert_stream_equal(
            "{ \"a\": null, \"b\" : true }",
3131 3132 3133 3134 3135
            vec![
                (ObjectStart,           vec![]),
                  (NullValue,           vec![Key("a")]),
                  (BooleanValue(true),  vec![Key("b")]),
                (ObjectEnd,             vec![]),
3136 3137 3138 3139
            ]
        );
        assert_stream_equal(
            "{\"a\" : 1.0 ,\"b\": [ true ]}",
3140 3141 3142 3143 3144 3145 3146
            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![]),
3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157
            ]
        );
        assert_stream_equal(
            r#"{
                "a": 1.0,
                "b": [
                    true,
                    "foo\nbar",
                    { "c": {"d": null} }
                ]
            }"#,
3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170
            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![]),
3171 3172 3173 3174
            ]
        );
    }
    #[test]
3175
    #[ignore(cfg(target_word_size = "32"))] // FIXME(#14064)
3176 3177 3178
    fn test_read_list_streaming() {
        assert_stream_equal(
            "[]",
3179 3180 3181
            vec![
                (ListStart, vec![]),
                (ListEnd,   vec![]),
3182 3183 3184 3185
            ]
        );
        assert_stream_equal(
            "[ ]",
3186 3187 3188
            vec![
                (ListStart, vec![]),
                (ListEnd,   vec![]),
3189 3190 3191 3192
            ]
        );
        assert_stream_equal(
            "[true]",
3193 3194 3195 3196
            vec![
                (ListStart,              vec![]),
                    (BooleanValue(true), vec![Index(0)]),
                (ListEnd,                vec![]),
3197 3198 3199 3200
            ]
        );
        assert_stream_equal(
            "[ false ]",
3201 3202 3203 3204
            vec![
                (ListStart,               vec![]),
                    (BooleanValue(false), vec![Index(0)]),
                (ListEnd,                 vec![]),
3205 3206 3207 3208
            ]
        );
        assert_stream_equal(
            "[null]",
3209 3210 3211 3212
            vec![
                (ListStart,     vec![]),
                    (NullValue, vec![Index(0)]),
                (ListEnd,       vec![]),
3213 3214 3215 3216
            ]
        );
        assert_stream_equal(
            "[3, 1]",
3217 3218 3219 3220 3221
            vec![
                (ListStart,     vec![]),
                    (NumberValue(3.0), vec![Index(0)]),
                    (NumberValue(1.0), vec![Index(1)]),
                (ListEnd,       vec![]),
3222 3223 3224 3225
            ]
        );
        assert_stream_equal(
            "\n[3, 2]\n",
3226 3227 3228 3229 3230
            vec![
                (ListStart,     vec![]),
                    (NumberValue(3.0), vec![Index(0)]),
                    (NumberValue(2.0), vec![Index(1)]),
                (ListEnd,       vec![]),
3231 3232 3233 3234
            ]
        );
        assert_stream_equal(
            "[2, [4, 1]]",
3235 3236 3237 3238 3239 3240 3241 3242
            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![]),
3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295
            ]
        );

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

3296
        stack.push_key("foo".to_string());
3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307

        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"));

3308
        stack.push_key("bar".to_string());
3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335

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

3336 3337
    #[test]
    fn test_to_json() {
3338
        use std::collections::{HashMap,TreeMap};
3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371
        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));
            Object(box tree_map)
        };

        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);
        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()));
        assert_eq!((1, 2).to_json(), list2);
        assert_eq!((1, 2, 3).to_json(), list3);
        assert_eq!([1, 2].to_json(), list2);
        assert_eq!((&[1, 2, 3]).to_json(), list3);
3372
        assert_eq!((vec![1, 2]).to_json(), list2);
3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385
        assert_eq!(vec!(1, 2, 3).to_json(), list3);
        let mut tree_map = TreeMap::new();
        tree_map.insert("a".to_string(), 1);
        tree_map.insert("b".to_string(), 2);
        assert_eq!(tree_map.to_json(), object);
        let mut hash_map = HashMap::new();
        hash_map.insert("a".to_string(), 1);
        hash_map.insert("b".to_string(), 2);
        assert_eq!(hash_map.to_json(), object);
        assert_eq!(Some(15).to_json(), Number(15 as f64));
        assert_eq!(None::<int>.to_json(), Null);
    }

3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420
    #[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} }
                ]
            }"#);
        });
    }

3421
    fn big_json() -> String {
3422
        let mut src = "[\n".to_string();
3423
        for _ in range(0, 500) {
3424 3425
            src.push_str(r#"{ "a": true, "b": null, "c":3.1415, "d": "Hello world", "e": \
                            [1,2,3]},"#);
3426
        }
3427
        src.push_str("{}]");
3428 3429 3430 3431 3432 3433 3434
        return src;
    }

    #[bench]
    fn bench_streaming_large(b: &mut Bencher) {
        let src = big_json();
        b.iter( || {
3435
            let mut parser = Parser::new(src.as_slice().chars());
3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446
            loop {
                match parser.next() {
                    None => return,
                    _ => {}
                }
            }
        });
    }
    #[bench]
    fn bench_large(b: &mut Bencher) {
        let src = big_json();
3447
        b.iter( || { let _ = from_str(src.as_slice()); });
3448
    }
3449
}