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

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

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

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

# What is JSON?

JSON (JavaScript Object Notation) is a way to write data in Javascript.
A
Adolfo Ochagavía 已提交
23 24 25 26 27 28 29 30 31 32 33 34
Like XML, it allows to encode structured data in a text format that can be easily read by humans.
Its simple syntax and native compatibility with JavaScript have made it a widely used format.

Data types that can be encoded are JavaScript types (see the `Json` enum for more details):

* `Boolean`: equivalent to rust's `bool`
* `Number`: equivalent to rust's `f64`
* `String`: equivalent to rust's `String`
* `Array`: equivalent to rust's `Vec<T>`, but also allowing objects of different types in the same
array
* `Object`: equivalent to rust's `Treemap<String, json::Json>`
* `Null`
M
musitdev 已提交
35 36 37 38 39

An object is a series of string keys mapping to values, in `"key": value` format.
Arrays are enclosed in square brackets ([ ... ]) and objects in curly brackets ({ ... }).
A simple JSON document encoding a person, his/her age, address and phone numbers could look like:

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

# Rust Type-based Encoding and Decoding

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

A
Adolfo Ochagavía 已提交
66 67 68 69
The JSON API provides an enum `json::Json` and a trait `ToJson` to encode objects.
The `ToJson` trait provides a `to_json` method to convert an object into a `json::Json` value.
A `json::Json` value can be encoded as a string or buffer using the functions described above.
You can also use the `json::Encoder` object, which implements the `Encoder` trait.
M
musitdev 已提交
70 71 72 73 74 75 76 77 78 79 80

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

# 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 已提交
81
extern crate serialize;
A
Adolfo Ochagavía 已提交
82
use serialize::json;
M
musitdev 已提交
83

A
Adolfo Ochagavía 已提交
84 85
#[deriving(Decodable, Encodable)] //generate Decodable, Encodable impl.
pub struct TestStruct1  {
M
musitdev 已提交
86
    data_int: u8,
87
    data_str: String,
K
Kevin Ballard 已提交
88
    data_vector: Vec<u8>,
A
Adolfo Ochagavía 已提交
89
}
M
musitdev 已提交
90 91

fn main() {
A
Adolfo Ochagavía 已提交
92
    let object = TestStruct1
93
         {data_int: 1, data_str:"toto".to_string(), data_vector:vec![2,3,4,5]};
M
musitdev 已提交
94

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

A
Adolfo Ochagavía 已提交
98 99
    // Deserialize using `json::decode`
    let decoded: TestStruct1 = json::decode(encoded.as_slice()).unwrap();
M
musitdev 已提交
100 101 102 103 104
}
```

## Using `ToJson`

A
Adolfo Ochagavía 已提交
105
This example uses the `ToJson` trait to generate the JSON string.
M
musitdev 已提交
106 107

```rust
108
use std::collections::TreeMap;
A
Alex Crichton 已提交
109
use serialize::json::ToJson;
A
Adolfo Ochagavía 已提交
110
use serialize::json;
M
musitdev 已提交
111

A
Adolfo Ochagavía 已提交
112
#[deriving(Decodable)]
M
musitdev 已提交
113 114
pub struct TestStruct1  {
    data_int: u8,
115
    data_str: String,
K
Kevin Ballard 已提交
116
    data_vector: Vec<u8>,
M
musitdev 已提交
117 118 119 120
}

impl ToJson for TestStruct1 {
    fn to_json( &self ) -> json::Json {
A
Adolfo Ochagavía 已提交
121
        let mut d = TreeMap::new();
122 123 124
        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 已提交
125 126 127 128 129
        json::Object(d)
    }
}

fn main() {
A
Adolfo Ochagavía 已提交
130 131
    // Serialize using `ToJson`
    let test2 = TestStruct1 {data_int: 1, data_str:"toto".to_string(), data_vector:vec![2,3,4,5]};
M
musitdev 已提交
132
    let tjson: json::Json = test2.to_json();
A
Adolfo Ochagavía 已提交
133
    let json_str: String = tjson.to_str();
M
musitdev 已提交
134

A
Adolfo Ochagavía 已提交
135 136
    // Deserialize like before
    let decoded: TestStruct1 = json::decode(json_str.as_slice()).unwrap();
M
musitdev 已提交
137 138 139 140
}
```

*/
B
Brian Anderson 已提交
141

A
Adolfo Ochagavía 已提交
142
use std;
143
use std::collections::{HashMap, TreeMap};
A
Adolfo Ochagavía 已提交
144
use std::{char, f64, fmt, io, num, str};
A
Alex Crichton 已提交
145
use std::io::MemWriter;
A
Adolfo Ochagavía 已提交
146
use std::mem::{swap, transmute};
M
mrec 已提交
147
use std::num::{FPNaN, FPInfinite};
148
use std::str::ScalarValue;
149
use std::string::String;
150
use std::vec::Vec;
151

A
Alex Crichton 已提交
152
use Encodable;
E
Elly Jones 已提交
153

154
/// Represents a json value
155
#[deriving(Clone, PartialEq, PartialOrd)]
156
pub enum Json {
D
Daniel Micay 已提交
157
    Number(f64),
158
    String(String),
B
Ben Striegel 已提交
159
    Boolean(bool),
160
    List(List),
A
Adolfo Ochagavía 已提交
161
    Object(Object),
B
Ben Striegel 已提交
162
    Null,
E
Elly Jones 已提交
163 164
}

K
Kevin Ballard 已提交
165
pub type List = Vec<Json>;
166
pub type Object = TreeMap<String, Json>;
167

168
/// The errors that can arise while parsing a JSON stream.
169
#[deriving(Clone, PartialEq)]
170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188
pub enum ErrorCode {
    InvalidSyntax,
    InvalidNumber,
    EOFWhileParsingObject,
    EOFWhileParsingList,
    EOFWhileParsingValue,
    EOFWhileParsingString,
    KeyMustBeAString,
    ExpectedColon,
    TrailingCharacters,
    InvalidEscape,
    InvalidUnicodeCodePoint,
    LoneLeadingSurrogateInHexEscape,
    UnexpectedEndOfHexEscape,
    UnrecognizedHex,
    NotFourDigit,
    NotUtf8,
}

189
#[deriving(Clone, PartialEq, Show)]
190
pub enum ParserError {
S
Sean McArthur 已提交
191
    /// msg, line, col
192 193 194 195 196 197 198
    SyntaxError(ErrorCode, uint, uint),
    IoError(io::IoErrorKind, &'static str),
}

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

199
#[deriving(Clone, PartialEq, Show)]
200 201
pub enum DecoderError {
    ParseError(ParserError),
202 203 204
    ExpectedError(String, String),
    MissingFieldError(String),
    UnknownVariantError(String),
205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228
}

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

229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245
/// Shortcut function to decode a JSON `&str` into an object
pub fn decode<T: ::Decodable<Decoder, DecoderError>>(s: &str) -> DecodeResult<T> {
    let json = match from_str(s) {
        Ok(x) => x,
        Err(e) => return Err(ParseError(e))
    };

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

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

246 247 248 249 250 251 252 253
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)
254
}
255

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

259 260
fn escape_str(s: &str) -> String {
    let mut escaped = String::from_str("\"");
261
    for c in s.chars() {
262
        match c {
263 264 265 266 267 268 269 270
            '"' => 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 已提交
271
        }
272
    };
273
    escaped.push_char('"');
274
    escaped
E
Elly Jones 已提交
275 276
}

M
mrec 已提交
277 278 279 280 281 282 283
fn fmt_number_or_null(v: f64) -> String {
    match v.classify() {
        FPNaN | FPInfinite => String::from_str("null"),
        _ => f64::to_str_digits(v, 6u)
    }
}

284
fn spaces(n: uint) -> String {
285
    String::from_char(n, ' ')
286 287
}

288
/// A structure for implementing serialization to JSON.
E
Erik Price 已提交
289
pub struct Encoder<'a> {
A
Adolfo Ochagavía 已提交
290
    writer: &'a mut io::Writer,
291 292
}

E
Erik Price 已提交
293
impl<'a> Encoder<'a> {
294 295
    /// Creates a new JSON encoder whose output will be written to the writer
    /// specified.
A
Adolfo Ochagavía 已提交
296 297
    pub fn new(writer: &'a mut io::Writer) -> Encoder<'a> {
        Encoder { writer: writer }
298
    }
M
musitdev 已提交
299 300

    /// Encode the specified struct into a json [u8]
A
Adolfo Ochagavía 已提交
301 302
    pub fn buffer_encode<T:Encodable<Encoder<'a>, io::IoError>>(object: &T) -> Vec<u8>  {
        //Serialize the object in a string using a writer
M
musitdev 已提交
303
        let mut m = MemWriter::new();
N
Nick Cameron 已提交
304 305
        // FIXME(14302) remove the transmute and unsafe block.
        unsafe {
M
musitdev 已提交
306
            let mut encoder = Encoder::new(&mut m as &mut io::Writer);
S
Sean McArthur 已提交
307
            // MemWriter never Errs
A
Adolfo Ochagavía 已提交
308
            let _ = object.encode(transmute(&mut encoder));
M
musitdev 已提交
309
        }
310
        m.unwrap()
M
musitdev 已提交
311 312 313
    }

    /// Encode the specified struct into a json str
314 315 316
    ///
    /// Note: this function is deprecated. Consider using `json::encode` instead.
    #[deprecated = "Replaced by `json::encode`"]
A
Adolfo Ochagavía 已提交
317
    pub fn str_encode<T: Encodable<Encoder<'a>, io::IoError>>(object: &T) -> String {
318
        encode(object)
M
musitdev 已提交
319
    }
320 321
}

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

S
Sean McArthur 已提交
325 326 327 328 329
    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) }
330

S
Sean McArthur 已提交
331 332 333 334 335
    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) }
336

S
Sean McArthur 已提交
337
    fn emit_bool(&mut self, v: bool) -> EncodeResult {
338
        if v {
A
Adolfo Ochagavía 已提交
339
            write!(self.writer, "true")
340
        } else {
A
Adolfo Ochagavía 已提交
341
            write!(self.writer, "false")
342 343 344
        }
    }

S
Sean McArthur 已提交
345
    fn emit_f64(&mut self, v: f64) -> EncodeResult {
A
Adolfo Ochagavía 已提交
346
        write!(self.writer, "{}", fmt_number_or_null(v))
A
Alex Crichton 已提交
347
    }
S
Sean McArthur 已提交
348
    fn emit_f32(&mut self, v: f32) -> EncodeResult { self.emit_f64(v as f64) }
349

350 351 352
    fn emit_char(&mut self, v: char) -> EncodeResult {
        self.emit_str(str::from_char(v).as_slice())
    }
S
Sean McArthur 已提交
353
    fn emit_str(&mut self, v: &str) -> EncodeResult {
A
Adolfo Ochagavía 已提交
354
        write!(self.writer, "{}", escape_str(v))
A
Alex Crichton 已提交
355
    }
356

A
Adolfo Ochagavía 已提交
357 358 359
    fn emit_enum(&mut self, _name: &str, f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
        f(self)
    }
360

361 362 363 364 365 366 367 368 369
    fn emit_enum_variant(&mut self,
                         name: &str,
                         _id: uint,
                         cnt: uint,
                         f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
        // enums are encoded as strings or objects
        // Bunny => "Bunny"
        // Kangaroo(34,"William") => {"variant": "Kangaroo", "fields": [34,"William"]}
        if cnt == 0 {
A
Adolfo Ochagavía 已提交
370
            write!(self.writer, "{}", escape_str(name))
371
        } else {
A
Adolfo Ochagavía 已提交
372 373 374
            try!(write!(self.writer, "{{\"variant\":"));
            try!(write!(self.writer, "{}", escape_str(name)));
            try!(write!(self.writer, ",\"fields\":["));
375
            try!(f(self));
A
Adolfo Ochagavía 已提交
376
            write!(self.writer, "]}}")
377 378
        }
    }
379

S
Sean McArthur 已提交
380 381 382
    fn emit_enum_variant_arg(&mut self,
                             idx: uint,
                             f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
383
        if idx != 0 {
A
Adolfo Ochagavía 已提交
384
            try!(write!(self.writer, ","));
385
        }
S
Sean McArthur 已提交
386
        f(self)
387 388 389 390 391 392
    }

    fn emit_enum_struct_variant(&mut self,
                                name: &str,
                                id: uint,
                                cnt: uint,
S
Sean McArthur 已提交
393
                                f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
394 395 396 397 398 399
        self.emit_enum_variant(name, id, cnt, f)
    }

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

404 405 406 407
    fn emit_struct(&mut self,
                   _: &str,
                   _: uint,
                   f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
A
Adolfo Ochagavía 已提交
408
        try!(write!(self.writer, "{{"));
409
        try!(f(self));
A
Adolfo Ochagavía 已提交
410
        write!(self.writer, "}}")
411
    }
412 413 414 415

    fn emit_struct_field(&mut self,
                         name: &str,
                         idx: uint,
S
Sean McArthur 已提交
416
                         f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
A
Adolfo Ochagavía 已提交
417 418
        if idx != 0 { try!(write!(self.writer, ",")); }
        try!(write!(self.writer, "{}:", escape_str(name)));
S
Sean McArthur 已提交
419
        f(self)
420 421
    }

S
Sean McArthur 已提交
422
    fn emit_tuple(&mut self, len: uint, f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
423 424
        self.emit_seq(len, f)
    }
S
Sean McArthur 已提交
425 426 427
    fn emit_tuple_arg(&mut self,
                      idx: uint,
                      f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
428 429 430 431 432 433
        self.emit_seq_elt(idx, f)
    }

    fn emit_tuple_struct(&mut self,
                         _name: &str,
                         len: uint,
S
Sean McArthur 已提交
434
                         f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
435 436
        self.emit_seq(len, f)
    }
S
Sean McArthur 已提交
437 438 439
    fn emit_tuple_struct_arg(&mut self,
                             idx: uint,
                             f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
440 441 442
        self.emit_seq_elt(idx, f)
    }

S
Sean McArthur 已提交
443 444 445 446 447 448 449
    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)
    }
450

S
Sean McArthur 已提交
451
    fn emit_seq(&mut self, _len: uint, f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
A
Adolfo Ochagavía 已提交
452
        try!(write!(self.writer, "["));
S
Sean McArthur 已提交
453
        try!(f(self));
A
Adolfo Ochagavía 已提交
454
        write!(self.writer, "]")
455 456
    }

S
Sean McArthur 已提交
457
    fn emit_seq_elt(&mut self, idx: uint, f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
458
        if idx != 0 {
A
Adolfo Ochagavía 已提交
459
            try!(write!(self.writer, ","));
460 461 462 463
        }
        f(self)
    }

464
    fn emit_map(&mut self, _len: uint, f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
A
Adolfo Ochagavía 已提交
465
        try!(write!(self.writer, "{{"));
466
        try!(f(self));
A
Adolfo Ochagavía 已提交
467
        write!(self.writer, "}}")
468
    }
469

S
Sean McArthur 已提交
470 471 472
    fn emit_map_elt_key(&mut self,
                        idx: uint,
                        f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
A
Adolfo Ochagavía 已提交
473
        if idx != 0 { try!(write!(self.writer, ",")) }
474 475 476
        // 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 已提交
477 478 479 480 481
        // FIXME(14302) remove the transmute and unsafe block.
        unsafe {
            let mut check_encoder = Encoder::new(&mut buf);
            try!(f(transmute(&mut check_encoder)));
        }
A
Adolfo Ochagavía 已提交
482 483 484 485
        let out = str::from_utf8_owned(buf.unwrap()).unwrap();
        let out = out.as_slice();
        let needs_wrapping = out.char_at(0) != '"' && out.char_at_reverse(out.len()) != '"';
        if needs_wrapping { try!(write!(self.writer, "\"")); }
S
Sean McArthur 已提交
486
        try!(f(self));
A
Adolfo Ochagavía 已提交
487
        if needs_wrapping { try!(write!(self.writer, "\"")); }
S
Sean McArthur 已提交
488
        Ok(())
489 490
    }

S
Sean McArthur 已提交
491 492 493
    fn emit_map_elt_val(&mut self,
                        _idx: uint,
                        f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult {
A
Adolfo Ochagavía 已提交
494
        try!(write!(self.writer, ":"));
495 496 497 498
        f(self)
    }
}

499 500
/// Another encoder for JSON, but prints out human-readable JSON instead of
/// compact data
E
Erik Price 已提交
501
pub struct PrettyEncoder<'a> {
A
Adolfo Ochagavía 已提交
502
    writer: &'a mut io::Writer,
503
    indent: uint,
504 505
}

E
Erik Price 已提交
506
impl<'a> PrettyEncoder<'a> {
507
    /// Creates a new encoder whose output will be written to the specified writer
A
Adolfo Ochagavía 已提交
508 509
    pub fn new<'a>(writer: &'a mut io::Writer) -> PrettyEncoder<'a> {
        PrettyEncoder { writer: writer, indent: 0 }
510
    }
511
}
512

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

S
Sean McArthur 已提交
516 517 518 519 520
    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) }
521

S
Sean McArthur 已提交
522 523 524 525 526
    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) }
527

S
Sean McArthur 已提交
528
    fn emit_bool(&mut self, v: bool) -> EncodeResult {
529
        if v {
A
Adolfo Ochagavía 已提交
530
            write!(self.writer, "true")
531
        } else {
A
Adolfo Ochagavía 已提交
532
            write!(self.writer, "false")
533 534 535
        }
    }

S
Sean McArthur 已提交
536
    fn emit_f64(&mut self, v: f64) -> EncodeResult {
A
Adolfo Ochagavía 已提交
537
        write!(self.writer, "{}", fmt_number_or_null(v))
A
Alex Crichton 已提交
538
    }
539 540 541
    fn emit_f32(&mut self, v: f32) -> EncodeResult {
        self.emit_f64(v as f64)
    }
542

543 544 545
    fn emit_char(&mut self, v: char) -> EncodeResult {
        self.emit_str(str::from_char(v).as_slice())
    }
S
Sean McArthur 已提交
546
    fn emit_str(&mut self, v: &str) -> EncodeResult {
A
Adolfo Ochagavía 已提交
547
        write!(self.writer, "{}", escape_str(v))
A
Alex Crichton 已提交
548
    }
549

S
Sean McArthur 已提交
550 551 552
    fn emit_enum(&mut self,
                 _name: &str,
                 f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
553 554 555 556 557 558 559
        f(self)
    }

    fn emit_enum_variant(&mut self,
                         name: &str,
                         _: uint,
                         cnt: uint,
S
Sean McArthur 已提交
560
                         f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
561
        if cnt == 0 {
A
Adolfo Ochagavía 已提交
562
            write!(self.writer, "{}", escape_str(name))
563 564
        } else {
            self.indent += 2;
A
Adolfo Ochagavía 已提交
565
            try!(write!(self.writer, "[\n{}{},\n", spaces(self.indent),
A
Alex Crichton 已提交
566
                          escape_str(name)));
S
Sean McArthur 已提交
567
            try!(f(self));
568
            self.indent -= 2;
A
Adolfo Ochagavía 已提交
569
            write!(self.writer, "\n{}]", spaces(self.indent))
570 571 572 573 574
        }
    }

    fn emit_enum_variant_arg(&mut self,
                             idx: uint,
S
Sean McArthur 已提交
575
                             f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
576
        if idx != 0 {
A
Adolfo Ochagavía 已提交
577
            try!(write!(self.writer, ",\n"));
578
        }
A
Adolfo Ochagavía 已提交
579
        try!(write!(self.writer, "{}", spaces(self.indent)));
580 581 582 583 584 585 586
        f(self)
    }

    fn emit_enum_struct_variant(&mut self,
                                name: &str,
                                id: uint,
                                cnt: uint,
S
Sean McArthur 已提交
587
                                f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
588 589 590 591 592 593
        self.emit_enum_variant(name, id, cnt, f)
    }

    fn emit_enum_struct_variant_field(&mut self,
                                      _: &str,
                                      idx: uint,
S
Sean McArthur 已提交
594
                                      f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
595 596 597 598
        self.emit_enum_variant_arg(idx, f)
    }


599 600 601 602 603
    fn emit_struct(&mut self,
                   _: &str,
                   len: uint,
                   f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
        if len == 0 {
A
Adolfo Ochagavía 已提交
604
            write!(self.writer, "{{}}")
605
        } else {
A
Adolfo Ochagavía 已提交
606
            try!(write!(self.writer, "{{"));
607 608 609
            self.indent += 2;
            try!(f(self));
            self.indent -= 2;
A
Adolfo Ochagavía 已提交
610
            write!(self.writer, "\n{}}}", spaces(self.indent))
611 612
        }
    }
613 614 615 616

    fn emit_struct_field(&mut self,
                         name: &str,
                         idx: uint,
S
Sean McArthur 已提交
617
                         f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
618
        if idx == 0 {
A
Adolfo Ochagavía 已提交
619
            try!(write!(self.writer, "\n"));
620
        } else {
A
Adolfo Ochagavía 已提交
621
            try!(write!(self.writer, ",\n"));
622
        }
A
Adolfo Ochagavía 已提交
623
        try!(write!(self.writer, "{}{}: ", spaces(self.indent), escape_str(name)));
S
Sean McArthur 已提交
624
        f(self)
625 626
    }

S
Sean McArthur 已提交
627 628 629
    fn emit_tuple(&mut self,
                  len: uint,
                  f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
630 631
        self.emit_seq(len, f)
    }
S
Sean McArthur 已提交
632 633 634
    fn emit_tuple_arg(&mut self,
                      idx: uint,
                      f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
635 636 637 638 639 640
        self.emit_seq_elt(idx, f)
    }

    fn emit_tuple_struct(&mut self,
                         _: &str,
                         len: uint,
S
Sean McArthur 已提交
641
                         f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
642 643 644 645
        self.emit_seq(len, f)
    }
    fn emit_tuple_struct_arg(&mut self,
                             idx: uint,
S
Sean McArthur 已提交
646
                             f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
647 648 649
        self.emit_seq_elt(idx, f)
    }

S
Sean McArthur 已提交
650 651 652 653 654 655 656
    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)
    }
657

S
Sean McArthur 已提交
658 659 660
    fn emit_seq(&mut self,
                len: uint,
                f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
661
        if len == 0 {
A
Adolfo Ochagavía 已提交
662
            write!(self.writer, "[]")
663
        } else {
A
Adolfo Ochagavía 已提交
664
            try!(write!(self.writer, "["));
665
            self.indent += 2;
S
Sean McArthur 已提交
666
            try!(f(self));
667
            self.indent -= 2;
A
Adolfo Ochagavía 已提交
668
            write!(self.writer, "\n{}]", spaces(self.indent))
669 670 671
        }
    }

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

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

S
Sean McArthur 已提交
698 699 700
    fn emit_map_elt_key(&mut self,
                        idx: uint,
                        f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
701
        if idx == 0 {
A
Adolfo Ochagavía 已提交
702
            try!(write!(self.writer, "\n"));
703
        } else {
A
Adolfo Ochagavía 已提交
704
            try!(write!(self.writer, ",\n"));
705
        }
A
Adolfo Ochagavía 已提交
706
        try!(write!(self.writer, "{}", spaces(self.indent)));
707 708 709
        // 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 已提交
710 711 712 713 714
        // FIXME(14302) remove the transmute and unsafe block.
        unsafe {
            let mut check_encoder = PrettyEncoder::new(&mut buf);
            try!(f(transmute(&mut check_encoder)));
        }
A
Adolfo Ochagavía 已提交
715 716 717 718
        let out = str::from_utf8_owned(buf.unwrap()).unwrap();
        let out = out.as_slice();
        let needs_wrapping = out.char_at(0) != '"' && out.char_at_reverse(out.len()) != '"';
        if needs_wrapping { try!(write!(self.writer, "\"")); }
S
Sean McArthur 已提交
719
        try!(f(self));
A
Adolfo Ochagavía 已提交
720
        if needs_wrapping { try!(write!(self.writer, "\"")); }
S
Sean McArthur 已提交
721
        Ok(())
722 723
    }

S
Sean McArthur 已提交
724 725 726
    fn emit_map_elt_val(&mut self,
                        _idx: uint,
                        f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult {
A
Adolfo Ochagavía 已提交
727
        try!(write!(self.writer, ": "));
S
Sean McArthur 已提交
728
        f(self)
729 730 731
    }
}

732 733
impl<E: ::Encoder<S>, S> Encodable<E, S> for Json {
    fn encode(&self, e: &mut E) -> Result<(), S> {
734 735 736 737 738 739 740 741 742 743 744
        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(),
        }
    }
}

745
impl Json {
A
Adolfo Ochagavía 已提交
746 747 748
    /// Encodes a json value into an io::writer. Uses a single line.
    pub fn to_writer(&self, writer: &mut io::Writer) -> EncodeResult {
        let mut encoder = Encoder::new(writer);
S
Sean McArthur 已提交
749
        self.encode(&mut encoder)
750
    }
751

J
Jorge Aparicio 已提交
752
    /// Encodes a json value into an io::writer.
753
    /// Pretty-prints in a more readable format.
A
Adolfo Ochagavía 已提交
754 755
    pub fn to_pretty_writer(&self, writer: &mut io::Writer) -> EncodeResult {
        let mut encoder = PrettyEncoder::new(writer);
S
Sean McArthur 已提交
756
        self.encode(&mut encoder)
757
    }
758

759
    /// Encodes a json value into a string
760
    pub fn to_pretty_str(&self) -> String {
761
        let mut s = MemWriter::new();
A
Alex Crichton 已提交
762
        self.to_pretty_writer(&mut s as &mut io::Writer).unwrap();
A
Adolfo Ochagavía 已提交
763
        str::from_utf8_owned(s.unwrap()).unwrap()
764
    }
765 766 767

     /// If the Json value is an Object, returns the value associated with the provided key.
    /// Otherwise, returns None.
768
    pub fn find<'a>(&'a self, key: &String) -> Option<&'a Json>{
769 770 771 772 773 774 775
        match self {
            &Object(ref map) => map.find(key),
            _ => None
        }
    }

    /// Attempts to get a nested Json Object for each key in `keys`.
776
    /// If any key is found not to exist, find_path will return None.
777
    /// Otherwise, it will return the Json value associated with the final key.
778
    pub fn find_path<'a>(&'a self, keys: &[&String]) -> Option<&'a Json>{
779 780 781 782 783 784 785 786
        let mut target = self;
        for key in keys.iter() {
            match target.find(*key) {
                Some(t) => { target = t; },
                None => return None
            }
        }
        Some(target)
787 788 789 790 791
    }

    /// 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.
792
    pub fn search<'a>(&'a self, key: &String) -> Option<&'a Json> {
793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814
        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 {
815
        self.as_object().is_some()
816 817 818 819 820 821
    }

    /// If the Json value is an Object, returns the associated TreeMap.
    /// Returns None otherwise.
    pub fn as_object<'a>(&'a self) -> Option<&'a Object> {
        match self {
A
Adolfo Ochagavía 已提交
822
            &Object(ref map) => Some(map),
823 824 825 826 827 828
            _ => None
        }
    }

    /// Returns true if the Json value is a List. Returns false otherwise.
    pub fn is_list<'a>(&'a self) -> bool {
829
        self.as_list().is_some()
830 831 832 833 834 835 836 837 838 839 840 841
    }

    /// 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.
842 843
    pub fn is_string<'a>(&'a self) -> bool {
        self.as_string().is_some()
844 845 846 847
    }

    /// If the Json value is a String, returns the associated str.
    /// Returns None otherwise.
848
    pub fn as_string<'a>(&'a self) -> Option<&'a str> {
849 850 851 852 853 854 855 856
        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 {
857
        self.as_number().is_some()
858 859 860 861 862 863 864 865 866 867 868 869 870
    }

    /// 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 {
871
        self.as_boolean().is_some()
872 873 874 875 876 877 878 879 880 881 882 883 884
    }

    /// 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 {
885
        self.as_null().is_some()
886 887 888 889 890 891 892 893 894 895
    }

    /// 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 已提交
896 897
}

898
/// The output of the streaming parser.
899
#[deriving(PartialEq, Clone, Show)]
900 901 902 903 904 905 906
pub enum JsonEvent {
    ObjectStart,
    ObjectEnd,
    ListStart,
    ListEnd,
    BooleanValue(bool),
    NumberValue(f64),
907
    StringValue(String),
908 909 910 911
    NullValue,
    Error(ParserError),
}

912
#[deriving(PartialEq, Show)]
913 914 915 916 917 918 919 920 921
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 已提交
922
    // Initial state.
923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940
    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
941
#[deriving(PartialEq, Clone, Show)]
942 943 944 945 946 947 948
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.
949
#[deriving(PartialEq, Clone, Show)]
950 951 952 953 954 955 956
enum InternalStackElement {
    InternalIndex(u32),
    InternalKey(u16, u16), // start, size
}

impl Stack {
    pub fn new() -> Stack {
A
Adolfo Ochagavía 已提交
957
        Stack { stack: Vec::new(), str_buffer: Vec::new() }
958 959 960 961 962
    }

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

A
Adolfo Ochagavía 已提交
963 964
    /// Returns true if the stack is empty.
    pub fn is_empty(&self) -> bool { self.stack.is_empty() }
965 966 967 968 969

    /// Provides access to the StackElement at a given index.
    /// lower indices are at the bottom of the stack while higher indices are
    /// at the top.
    pub fn get<'l>(&'l self, idx: uint) -> StackElement<'l> {
A
Adolfo Ochagavía 已提交
970 971 972
        match *self.stack.get(idx) {
            InternalIndex(i) => { Index(i) }
            InternalKey(start, size) => {
A
Adolfo Ochagavía 已提交
973 974
                Key(str::from_utf8(
                    self.str_buffer.slice(start as uint, start as uint + size as uint)).unwrap())
A
Adolfo Ochagavía 已提交
975
            }
976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022
        }
    }

    /// 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.
1023
    fn push_key(&mut self, key: String) {
1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040
        self.stack.push(InternalKey(self.str_buffer.len() as u16, key.len() as u16));
        for c in key.as_bytes().iter() {
            self.str_buffer.push(*c);
        }
    }

    // Used by Parser to insert Index elements at the top of the stack.
    fn push_index(&mut self, index: u32) {
        self.stack.push(InternalIndex(index));
    }

    // Used by Parser to remove the top-most element of the stack.
    fn pop(&mut self) {
        assert!(!self.is_empty());
        match *self.stack.last().unwrap() {
            InternalKey(_, sz) => {
                let new_size = self.str_buffer.len() - sz as uint;
A
Adolfo Ochagavía 已提交
1041
                self.str_buffer.truncate(new_size);
1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060
            }
            InternalIndex(_) => {}
        }
        self.stack.pop();
    }

    // Used by Parser to test whether the top-most element is an index.
    fn last_is_index(&self) -> bool {
        if self.is_empty() { return false; }
        return match *self.stack.last().unwrap() {
            InternalIndex(_) => true,
            _ => false,
        }
    }

    // Used by Parser to increment the index of the top-most element.
    fn bump_index(&mut self) {
        let len = self.stack.len();
        let idx = match *self.stack.last().unwrap() {
A
Adolfo Ochagavía 已提交
1061 1062
            InternalIndex(i) => { i + 1 }
            _ => { fail!(); }
1063 1064 1065 1066 1067 1068 1069
        };
        *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 已提交
1070
pub struct Parser<T> {
1071 1072 1073 1074
    rdr: T,
    ch: Option<char>,
    line: uint,
    col: uint,
1075 1076 1077
    // We maintain a stack representing where we are in the logical structure
    // of the JSON stream.
    stack: Stack,
J
Joseph Crail 已提交
1078
    // A state machine is kept to make it possible to interrupt and resume parsing.
1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100
    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());
    }
1101 1102
}

1103
impl<T: Iterator<char>> Parser<T> {
1104
    /// Creates the JSON parser.
1105
    pub fn new(rdr: T) -> Parser<T> {
1106 1107
        let mut p = Parser {
            rdr: rdr,
1108
            ch: Some('\x00'),
1109 1110
            line: 1,
            col: 0,
1111 1112
            stack: Stack::new(),
            state: ParseStart,
1113 1114
        };
        p.bump();
1115
        return p;
1116
    }
E
Elly Jones 已提交
1117

1118 1119 1120 1121
    /// 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;
1122
    }
1123

1124 1125
    fn eof(&self) -> bool { self.ch.is_none() }
    fn ch_or_null(&self) -> char { self.ch.unwrap_or('\x00') }
1126
    fn bump(&mut self) {
1127
        self.ch = self.rdr.next();
E
Elly Jones 已提交
1128

1129
        if self.ch_is('\n') {
1130 1131
            self.line += 1u;
            self.col = 1u;
G
Gary Linscott 已提交
1132 1133
        } else {
            self.col += 1u;
E
Elly Jones 已提交
1134
        }
1135 1136
    }

1137
    fn next_char(&mut self) -> Option<char> {
1138 1139 1140
        self.bump();
        self.ch
    }
1141 1142 1143
    fn ch_is(&self, c: char) -> bool {
        self.ch == Some(c)
    }
1144

1145 1146
    fn error<T>(&self, reason: ErrorCode) -> Result<T, ParserError> {
        Err(SyntaxError(reason, self.line, self.col))
1147 1148
    }

1149
    fn parse_whitespace(&mut self) {
1150 1151 1152 1153
        while self.ch_is(' ') ||
              self.ch_is('\n') ||
              self.ch_is('\t') ||
              self.ch_is('\r') { self.bump(); }
1154 1155
    }

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

1159
        if self.ch_is('-') {
1160
            self.bump();
D
Daniel Micay 已提交
1161
            neg = -1.0;
E
Elly Jones 已提交
1162
        }
1163

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

1166
        if self.ch_is('.') {
A
Adolfo Ochagavía 已提交
1167
            res = try!(self.parse_decimal(res));
E
Elly Jones 已提交
1168
        }
1169

1170
        if self.ch_is('e') || self.ch_is('E') {
A
Adolfo Ochagavía 已提交
1171
            res = try!(self.parse_exponent(res));
E
Elly Jones 已提交
1172
        }
1173

1174
        Ok(neg * res)
E
Elly Jones 已提交
1175 1176
    }

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

1180 1181 1182
        match self.ch_or_null() {
            '0' => {
                self.bump();
1183

M
mrec 已提交
1184
                // A leading '0' must be the only digit before the decimal point.
1185
                match self.ch_or_null() {
1186
                    '0' .. '9' => return self.error(InvalidNumber),
1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199
                    _ => ()
                }
            },
            '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,
                    }
1200 1201
                }
            }
1202
            _ => return self.error(InvalidNumber),
E
Elly Jones 已提交
1203
        }
1204
        Ok(res)
E
Elly Jones 已提交
1205 1206
    }

A
Adolfo Ochagavía 已提交
1207
    fn parse_decimal(&mut self, mut res: f64) -> Result<f64, ParserError> {
1208 1209 1210
        self.bump();

        // Make sure a digit follows the decimal place.
1211 1212
        match self.ch_or_null() {
            '0' .. '9' => (),
1213
             _ => return self.error(InvalidNumber)
1214 1215
        }

D
Daniel Micay 已提交
1216
        let mut dec = 1.0;
1217
        while !self.eof() {
1218 1219 1220 1221 1222 1223 1224
            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 已提交
1225 1226
            }
        }
1227

1228
        Ok(res)
E
Elly Jones 已提交
1229 1230
    }

1231
    fn parse_exponent(&mut self, mut res: f64) -> Result<f64, ParserError> {
1232 1233
        self.bump();

1234 1235
        let mut exp = 0u;
        let mut neg_exp = false;
1236

1237 1238 1239 1240 1241
        if self.ch_is('+') {
            self.bump();
        } else if self.ch_is('-') {
            self.bump();
            neg_exp = true;
1242 1243 1244
        }

        // Make sure a digit follows the exponent place.
1245 1246
        match self.ch_or_null() {
            '0' .. '9' => (),
1247
            _ => return self.error(InvalidNumber)
1248 1249
        }
        while !self.eof() {
1250 1251 1252 1253
            match self.ch_or_null() {
                c @ '0' .. '9' => {
                    exp *= 10;
                    exp += (c as uint) - ('0' as uint);
1254

1255 1256 1257
                    self.bump();
                }
                _ => break
1258 1259 1260
            }
        }

A
Adolfo Ochagavía 已提交
1261
        let exp = num::pow(10_f64, exp);
1262 1263 1264 1265 1266 1267
        if neg_exp {
            res /= exp;
        } else {
            res *= exp;
        }

1268
        Ok(res)
E
Elly Jones 已提交
1269 1270
    }

1271
    fn decode_hex_escape(&mut self) -> Result<u16, ParserError> {
1272 1273
        let mut i = 0u;
        let mut n = 0u16;
A
Adolfo Ochagavía 已提交
1274
        while i < 4 && !self.eof() {
1275 1276
            self.bump();
            n = match self.ch_or_null() {
A
Adolfo Ochagavía 已提交
1277 1278 1279 1280 1281 1282 1283
                c @ '0' .. '9' => n * 16 + ((c as u16) - ('0' as u16)),
                'a' | 'A' => n * 16 + 10,
                'b' | 'B' => n * 16 + 11,
                'c' | 'C' => n * 16 + 12,
                'd' | 'D' => n * 16 + 13,
                'e' | 'E' => n * 16 + 14,
                'f' | 'F' => n * 16 + 15,
1284
                _ => return self.error(InvalidEscape)
1285 1286 1287 1288 1289 1290
            };

            i += 1u;
        }

        // Error out if we didn't parse 4 digits.
A
Adolfo Ochagavía 已提交
1291
        if i != 4 {
1292
            return self.error(InvalidEscape);
1293 1294 1295 1296 1297
        }

        Ok(n)
    }

1298
    fn parse_str(&mut self) -> Result<String, ParserError> {
1299
        let mut escape = false;
1300
        let mut res = String::new();
1301

G
Gary Linscott 已提交
1302
        loop {
1303
            self.bump();
G
Gary Linscott 已提交
1304
            if self.eof() {
1305
                return self.error(EOFWhileParsingString);
G
Gary Linscott 已提交
1306
            }
1307

H
Huon Wilson 已提交
1308
            if escape {
1309 1310 1311 1312 1313 1314 1315 1316 1317
                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'),
1318
                    'u' => match try!(self.decode_hex_escape()) {
1319
                        0xDC00 .. 0xDFFF => return self.error(LoneLeadingSurrogateInHexEscape),
1320 1321 1322 1323

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

1329 1330 1331
                            let buf = [n1, try!(self.decode_hex_escape())];
                            match str::utf16_items(buf.as_slice()).next() {
                                Some(ScalarValue(c)) => res.push_char(c),
1332
                                _ => return self.error(LoneLeadingSurrogateInHexEscape),
1333
                            }
1334 1335
                        }

1336 1337
                        n => match char::from_u32(n as u32) {
                            Some(c) => res.push_char(c),
1338
                            None => return self.error(InvalidUnicodeCodePoint),
1339 1340
                        },
                    },
1341
                    _ => return self.error(InvalidEscape),
1342 1343
                }
                escape = false;
1344
            } else if self.ch_is('\\') {
1345 1346
                escape = true;
            } else {
1347
                match self.ch {
1348 1349
                    Some('"') => {
                        self.bump();
1350
                        return Ok(res);
1351
                    },
1352 1353
                    Some(c) => res.push_char(c),
                    None => unreachable!()
1354
                }
E
Elly Jones 已提交
1355 1356 1357 1358
            }
        }
    }

1359 1360 1361 1362
    // 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 已提交
1363
    // stream int the form of a stack that can be queried by the user using the
1364 1365 1366 1367 1368 1369 1370 1371 1372 1373
    // 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();
1374

1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416
            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;
    }
1417

1418
    fn parse_list(&mut self, first: bool) -> JsonEvent {
1419
        if self.ch_is(']') {
1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431
            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
                }
            }
1432
            self.bump();
1433 1434 1435 1436
            return ListEnd;
        }
        if first {
            self.stack.push_index(0);
1437 1438
        }

1439
        let val = self.parse_value();
1440

1441 1442 1443 1444 1445 1446 1447 1448
        self.state = match val {
            Error(_) => { ParseFinished }
            ListStart => { ParseList(true) }
            ObjectStart => { ParseObject(true) }
            _ => { ParseListComma }
        };
        return val;
    }
1449

1450 1451 1452 1453 1454 1455 1456 1457 1458 1459
    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;
1460
            } else {
1461 1462 1463 1464 1465
                self.state = if self.stack.last_is_index() {
                    ParseListComma
                } else {
                    ParseObjectComma
                }
1466
            }
1467 1468 1469 1470 1471 1472 1473
            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 已提交
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 1509 1510 1511 1512
    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);
1513 1514 1515
        self.bump();
        self.parse_whitespace();

1516
        let val = self.parse_value();
1517

1518 1519 1520 1521 1522 1523 1524 1525 1526 1527
        self.state = match val {
            Error(_) => { ParseFinished }
            ListStart => { ParseList(true) }
            ObjectStart => { ParseObject(true) }
            _ => { ParseObjectComma }
        };
        return val;
    }

    fn parse_object_end(&mut self) -> JsonEvent {
1528
        if self.ch_is('}') {
1529 1530 1531 1532 1533 1534 1535 1536 1537 1538
            if self.stack.is_empty() {
                self.state = ParseBeforeFinish;
            } else {
                self.state = if self.stack.last_is_index() {
                    ParseListComma
                } else {
                    ParseObjectComma
                }
            }
            self.bump();
A
Adolfo Ochagavía 已提交
1539
            ObjectEnd
1540
        } else if self.eof() {
A
Adolfo Ochagavía 已提交
1541
            self.error_event(EOFWhileParsingObject)
1542
        } else {
A
Adolfo Ochagavía 已提交
1543
            self.error_event(InvalidSyntax)
1544
        }
1545
    }
1546

1547 1548 1549
    fn parse_value(&mut self) -> JsonEvent {
        if self.eof() { return self.error_event(EOFWhileParsingValue); }
        match self.ch_or_null() {
A
Adolfo Ochagavía 已提交
1550 1551 1552 1553
            'n' => { self.parse_ident("ull", NullValue) }
            't' => { self.parse_ident("rue", BooleanValue(true)) }
            'f' => { self.parse_ident("alse", BooleanValue(false)) }
            '0' .. '9' | '-' => match self.parse_number() {
1554 1555 1556
                Ok(f) => NumberValue(f),
                Err(e) => Error(e),
            },
A
Adolfo Ochagavía 已提交
1557
            '"' => match self.parse_str() {
1558 1559 1560 1561 1562
                Ok(s) => StringValue(s),
                Err(e) => Error(e),
            },
            '[' => {
                self.bump();
A
Adolfo Ochagavía 已提交
1563
                ListStart
1564 1565 1566
            }
            '{' => {
                self.bump();
A
Adolfo Ochagavía 已提交
1567
                ObjectStart
1568
            }
A
Adolfo Ochagavía 已提交
1569
            _ => { self.error_event(InvalidSyntax) }
1570 1571
        }
    }
1572

1573 1574 1575 1576 1577 1578 1579 1580
    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))
        }
    }
1581

1582 1583 1584 1585 1586
    fn error_event(&mut self, reason: ErrorCode) -> JsonEvent {
        self.state = ParseFinished;
        Error(SyntaxError(reason, self.line, self.col))
    }
}
1587

1588 1589 1590 1591 1592
/// A Builder consumes a json::Parser to create a generic Json structure.
pub struct Builder<T> {
    parser: Parser<T>,
    token: Option<JsonEvent>,
}
1593

1594 1595 1596
impl<T: Iterator<char>> Builder<T> {
    /// Create a JSON Builder.
    pub fn new(src: T) -> Builder<T> {
A
Adolfo Ochagavía 已提交
1597
        Builder { parser: Parser::new(src), token: None, }
1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609
    }

    // Decode a Json value from a Parser.
    pub fn build(&mut self) -> Result<Json, BuilderError> {
        self.bump();
        let result = self.build_value();
        self.bump();
        match self.token {
            None => {}
            Some(Error(e)) => { return Err(e); }
            ref tok => { fail!("unexpected token {}", tok.clone()); }
        }
A
Adolfo Ochagavía 已提交
1610
        result
1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622
    }

    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)) => {
1623
                let mut temp = String::new();
1624 1625
                swap(s, &mut temp);
                Ok(String(temp))
1626
            }
1627 1628 1629 1630 1631 1632 1633 1634
            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) }
        }
    }
1635

1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646
    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) }
1647
            }
1648
            self.bump();
1649
        }
1650
    }
1651

1652 1653 1654
    fn build_object(&mut self) -> Result<Json, BuilderError> {
        self.bump();

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

A
Adolfo Ochagavía 已提交
1657
        loop {
1658 1659 1660 1661 1662 1663 1664
            match self.token {
                Some(ObjectEnd) => { return Ok(Object(values)); }
                Some(Error(e)) => { return Err(e); }
                None => { break; }
                _ => {}
            }
            let key = match self.parser.stack().top() {
1665
                Some(Key(k)) => { k.to_string() }
1666 1667 1668 1669 1670 1671 1672 1673 1674
                _ => { 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 已提交
1675 1676 1677
    }
}

A
Alex Crichton 已提交
1678
/// Decodes a json value from an `&mut io::Reader`
1679
pub fn from_reader(rdr: &mut io::Reader) -> Result<Json, BuilderError> {
A
Alex Crichton 已提交
1680 1681
    let contents = match rdr.read_to_end() {
        Ok(c) => c,
1682
        Err(e) => return Err(io_error_to_error(e))
A
Alex Crichton 已提交
1683
    };
A
Adolfo Ochagavía 已提交
1684 1685 1686
    let s = match str::from_utf8_owned(contents) {
        Ok(s) => s,
        _ => return Err(SyntaxError(NotUtf8, 0, 0))
A
Alex Crichton 已提交
1687
    };
1688
    let mut builder = Builder::new(s.as_slice().chars());
1689
    builder.build()
E
Elly Jones 已提交
1690 1691
}

1692
/// Decodes a json value from a string
1693 1694
pub fn from_str(s: &str) -> Result<Json, BuilderError> {
    let mut builder = Builder::new(s.chars());
A
Adolfo Ochagavía 已提交
1695
    builder.build()
1696 1697
}

1698
/// A structure to decode JSON to values in rust.
1699
pub struct Decoder {
1700
    stack: Vec<Json>,
1701 1702
}

1703 1704
impl Decoder {
    /// Creates a new decoder instance for decoding the specified JSON value.
1705
    pub fn new(json: Json) -> Decoder {
A
Adolfo Ochagavía 已提交
1706
        Decoder { stack: vec![json] }
1707
    }
1708 1709
}

1710
impl Decoder {
S
Sean McArthur 已提交
1711 1712
    fn pop(&mut self) -> Json {
        self.stack.pop().unwrap()
1713 1714 1715
    }
}

S
Sean McArthur 已提交
1716 1717 1718 1719
macro_rules! expect(
    ($e:expr, Null) => ({
        match $e {
            Null => Ok(()),
1720
            other => Err(ExpectedError("Null".to_string(),
A
Alex Crichton 已提交
1721
                                       format!("{}", other)))
S
Sean McArthur 已提交
1722 1723 1724 1725 1726
        }
    });
    ($e:expr, $t:ident) => ({
        match $e {
            $t(v) => Ok(v),
1727
            other => {
1728
                Err(ExpectedError(stringify!($t).to_string(),
A
Alex Crichton 已提交
1729
                                  format!("{}", other)))
1730
            }
1731
        }
S
Sean McArthur 已提交
1732 1733 1734
    })
)

1735
impl ::Decoder<DecoderError> for Decoder {
S
Sean McArthur 已提交
1736 1737
    fn read_nil(&mut self) -> DecodeResult<()> {
        debug!("read_nil");
A
Adolfo Ochagavía 已提交
1738
        expect!(self.pop(), Null)
1739 1740
    }

S
Sean McArthur 已提交
1741 1742 1743 1744 1745
    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) }
1746

S
Sean McArthur 已提交
1747 1748 1749 1750 1751
    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) }
1752

S
Sean McArthur 已提交
1753
    fn read_bool(&mut self) -> DecodeResult<bool> {
1754
        debug!("read_bool");
A
Adolfo Ochagavía 已提交
1755
        expect!(self.pop(), Boolean)
1756 1757
    }

S
Sean McArthur 已提交
1758
    fn read_f64(&mut self) -> DecodeResult<f64> {
1759
        debug!("read_f64");
S
Sean McArthur 已提交
1760 1761
        match self.pop() {
            Number(f) => Ok(f),
1762 1763
            String(s) => {
                // re: #12967.. a type w/ numeric keys (ie HashMap<uint, V> etc)
A
Adolfo Ochagavía 已提交
1764 1765
                // is going to have a string here, as per JSON spec.
                Ok(std::from_str::from_str(s.as_slice()).unwrap())
1766
            },
M
mrec 已提交
1767
            Null => Ok(f64::NAN),
A
Adolfo Ochagavía 已提交
1768
            value => Err(ExpectedError("Number".to_string(), format!("{}", value)))
1769 1770
        }
    }
1771

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

S
Sean McArthur 已提交
1774 1775
    fn read_char(&mut self) -> DecodeResult<char> {
        let s = try!(self.read_str());
1776
        {
1777
            let mut it = s.as_slice().chars();
1778 1779
            match (it.next(), it.next()) {
                // exactly one character
S
Sean McArthur 已提交
1780
                (Some(c), None) => return Ok(c),
1781 1782 1783
                _ => ()
            }
        }
A
Adolfo Ochagavía 已提交
1784
        Err(ExpectedError("single character string".to_string(), format!("{}", s)))
1785 1786
    }

1787
    fn read_str(&mut self) -> DecodeResult<String> {
1788
        debug!("read_str");
A
Adolfo Ochagavía 已提交
1789
        expect!(self.pop(), String)
1790 1791
    }

S
Sean McArthur 已提交
1792 1793 1794
    fn read_enum<T>(&mut self,
                    name: &str,
                    f: |&mut Decoder| -> DecodeResult<T>) -> DecodeResult<T> {
1795
        debug!("read_enum({})", name);
1796 1797 1798 1799 1800
        f(self)
    }

    fn read_enum_variant<T>(&mut self,
                            names: &[&str],
S
Sean McArthur 已提交
1801 1802
                            f: |&mut Decoder, uint| -> DecodeResult<T>)
                            -> DecodeResult<T> {
1803
        debug!("read_enum_variant(names={})", names);
S
Sean McArthur 已提交
1804
        let name = match self.pop() {
1805
            String(s) => s,
1806
            Object(mut o) => {
1807
                let n = match o.pop(&"variant".to_string()) {
1808
                    Some(String(s)) => s,
1809
                    Some(val) => {
A
Adolfo Ochagavía 已提交
1810
                        return Err(ExpectedError("String".to_string(), format!("{}", val)))
1811 1812
                    }
                    None => {
1813
                        return Err(MissingFieldError("variant".to_string()))
1814
                    }
1815
                };
1816
                match o.pop(&"fields".to_string()) {
1817
                    Some(List(l)) => {
1818
                        for field in l.move_iter().rev() {
A
Adolfo Ochagavía 已提交
1819
                            self.stack.push(field);
1820 1821
                        }
                    },
1822
                    Some(val) => {
A
Adolfo Ochagavía 已提交
1823
                        return Err(ExpectedError("List".to_string(), format!("{}", val)))
1824 1825
                    }
                    None => {
1826
                        return Err(MissingFieldError("fields".to_string()))
1827
                    }
1828
                }
1829
                n
1830
            }
1831
            json => {
A
Adolfo Ochagavía 已提交
1832
                return Err(ExpectedError("String or Object".to_string(), format!("{}", json)))
1833
            }
1834
        };
1835
        let idx = match names.iter()
A
Adolfo Ochagavía 已提交
1836
                             .position(|n| str::eq_slice(*n, name.as_slice())) {
1837
            Some(idx) => idx,
S
Sean McArthur 已提交
1838
            None => return Err(UnknownVariantError(name))
1839 1840 1841 1842
        };
        f(self, idx)
    }

S
Sean McArthur 已提交
1843 1844
    fn read_enum_variant_arg<T>(&mut self, idx: uint, f: |&mut Decoder| -> DecodeResult<T>)
                                -> DecodeResult<T> {
1845
        debug!("read_enum_variant_arg(idx={})", idx);
1846 1847 1848 1849 1850
        f(self)
    }

    fn read_enum_struct_variant<T>(&mut self,
                                   names: &[&str],
S
Sean McArthur 已提交
1851 1852
                                   f: |&mut Decoder, uint| -> DecodeResult<T>)
                                   -> DecodeResult<T> {
1853
        debug!("read_enum_struct_variant(names={})", names);
1854 1855 1856 1857 1858 1859 1860
        self.read_enum_variant(names, f)
    }


    fn read_enum_struct_variant_field<T>(&mut self,
                                         name: &str,
                                         idx: uint,
S
Sean McArthur 已提交
1861 1862
                                         f: |&mut Decoder| -> DecodeResult<T>)
                                         -> DecodeResult<T> {
1863
        debug!("read_enum_struct_variant_field(name={}, idx={})", name, idx);
1864 1865 1866 1867 1868 1869
        self.read_enum_variant_arg(idx, f)
    }

    fn read_struct<T>(&mut self,
                      name: &str,
                      len: uint,
S
Sean McArthur 已提交
1870 1871
                      f: |&mut Decoder| -> DecodeResult<T>)
                      -> DecodeResult<T> {
1872
        debug!("read_struct(name={}, len={})", name, len);
S
Sean McArthur 已提交
1873 1874 1875
        let value = try!(f(self));
        self.pop();
        Ok(value)
1876 1877 1878 1879 1880
    }

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

1886 1887
        let value = match obj.pop(&name.to_string()) {
            None => return Err(MissingFieldError(name.to_string())),
S
Sean McArthur 已提交
1888 1889 1890
            Some(json) => {
                self.stack.push(json);
                try!(f(self))
1891
            }
S
Sean McArthur 已提交
1892 1893 1894
        };
        self.stack.push(Object(obj));
        Ok(value)
1895 1896
    }

S
Sean McArthur 已提交
1897
    fn read_tuple<T>(&mut self, f: |&mut Decoder, uint| -> DecodeResult<T>) -> DecodeResult<T> {
1898
        debug!("read_tuple()");
1899 1900 1901
        self.read_seq(f)
    }

S
Sean McArthur 已提交
1902 1903 1904
    fn read_tuple_arg<T>(&mut self,
                         idx: uint,
                         f: |&mut Decoder| -> DecodeResult<T>) -> DecodeResult<T> {
1905
        debug!("read_tuple_arg(idx={})", idx);
1906 1907 1908 1909 1910
        self.read_seq_elt(idx, f)
    }

    fn read_tuple_struct<T>(&mut self,
                            name: &str,
S
Sean McArthur 已提交
1911 1912
                            f: |&mut Decoder, uint| -> DecodeResult<T>)
                            -> DecodeResult<T> {
1913
        debug!("read_tuple_struct(name={})", name);
1914 1915 1916 1917 1918
        self.read_tuple(f)
    }

    fn read_tuple_struct_arg<T>(&mut self,
                                idx: uint,
S
Sean McArthur 已提交
1919 1920
                                f: |&mut Decoder| -> DecodeResult<T>)
                                -> DecodeResult<T> {
1921
        debug!("read_tuple_struct_arg(idx={})", idx);
1922 1923 1924
        self.read_tuple_arg(idx, f)
    }

S
Sean McArthur 已提交
1925 1926
    fn read_option<T>(&mut self, f: |&mut Decoder, bool| -> DecodeResult<T>) -> DecodeResult<T> {
        match self.pop() {
1927 1928 1929 1930 1931
            Null => f(self, false),
            value => { self.stack.push(value); f(self, true) }
        }
    }

S
Sean McArthur 已提交
1932
    fn read_seq<T>(&mut self, f: |&mut Decoder, uint| -> DecodeResult<T>) -> DecodeResult<T> {
1933
        debug!("read_seq()");
S
Sean McArthur 已提交
1934 1935
        let list = try!(expect!(self.pop(), List));
        let len = list.len();
1936
        for v in list.move_iter().rev() {
S
Sean McArthur 已提交
1937 1938
            self.stack.push(v);
        }
1939 1940 1941
        f(self, len)
    }

S
Sean McArthur 已提交
1942 1943 1944
    fn read_seq_elt<T>(&mut self,
                       idx: uint,
                       f: |&mut Decoder| -> DecodeResult<T>) -> DecodeResult<T> {
1945
        debug!("read_seq_elt(idx={})", idx);
1946 1947 1948
        f(self)
    }

S
Sean McArthur 已提交
1949
    fn read_map<T>(&mut self, f: |&mut Decoder, uint| -> DecodeResult<T>) -> DecodeResult<T> {
1950
        debug!("read_map()");
S
Sean McArthur 已提交
1951 1952 1953 1954 1955 1956
        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));
        }
1957 1958 1959
        f(self, len)
    }

S
Sean McArthur 已提交
1960 1961
    fn read_map_elt_key<T>(&mut self, idx: uint, f: |&mut Decoder| -> DecodeResult<T>)
                           -> DecodeResult<T> {
1962
        debug!("read_map_elt_key(idx={})", idx);
1963 1964 1965
        f(self)
    }

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

1973
/// A trait for converting values to JSON
1974
pub trait ToJson {
1975 1976 1977
    /// Converts the value of `self` to an instance of JSON
    fn to_json(&self) -> Json;
}
1978

A
Adolfo Ochagavía 已提交
1979 1980 1981 1982 1983 1984 1985
macro_rules! to_json_impl(
    ($($t:ty), +) => (
        $(impl ToJson for $t {
            fn to_json(&self) -> Json { Number(*self as f64) }
        })+
    )
)
1986

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

A
Adolfo Ochagavía 已提交
1989 1990
impl ToJson for Json {
    fn to_json(&self) -> Json { self.clone() }
1991 1992
}

1993
impl ToJson for f32 {
M
mrec 已提交
1994
    fn to_json(&self) -> Json { (*self as f64).to_json() }
1995 1996
}

1997
impl ToJson for f64 {
M
mrec 已提交
1998 1999 2000
    fn to_json(&self) -> Json {
        match self.classify() {
            FPNaN | FPInfinite => Null,
A
Adolfo Ochagavía 已提交
2001
            _                  => Number(*self)
M
mrec 已提交
2002 2003
        }
    }
2004 2005
}

2006
impl ToJson for () {
B
Ben Striegel 已提交
2007
    fn to_json(&self) -> Json { Null }
2008 2009
}

2010
impl ToJson for bool {
B
Ben Striegel 已提交
2011
    fn to_json(&self) -> Json { Boolean(*self) }
2012 2013
}

2014
impl ToJson for String {
2015
    fn to_json(&self) -> Json { String((*self).clone()) }
2016 2017
}

2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031
macro_rules! tuple_impl {
    // use variables to indicate the arity of the tuple
    ($($tyvar:ident),* ) => {
        // the trailing commas are for the 1 tuple
        impl<
            $( $tyvar : ToJson ),*
            > ToJson for ( $( $tyvar ),* , ) {

            #[inline]
            #[allow(uppercase_variables)]
            fn to_json(&self) -> Json {
                match *self {
                    ($(ref $tyvar),*,) => List(vec![$($tyvar.to_json()),*])
                }
A
Adolfo Ochagavía 已提交
2032
            }
2033
        }
2034 2035 2036
    }
}

2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048
tuple_impl!{A}
tuple_impl!{A, B}
tuple_impl!{A, B, C}
tuple_impl!{A, B, C, D}
tuple_impl!{A, B, C, D, E}
tuple_impl!{A, B, C, D, E, F}
tuple_impl!{A, B, C, D, E, F, G}
tuple_impl!{A, B, C, D, E, F, G, H}
tuple_impl!{A, B, C, D, E, F, G, H, I}
tuple_impl!{A, B, C, D, E, F, G, H, I, J}
tuple_impl!{A, B, C, D, E, F, G, H, I, J, K}
tuple_impl!{A, B, C, D, E, F, G, H, I, J, K, L}
2049

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

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

A
Adolfo Ochagavía 已提交
2058
impl<A: ToJson> ToJson for TreeMap<String, A> {
B
Ben Striegel 已提交
2059
    fn to_json(&self) -> Json {
2060
        let mut d = TreeMap::new();
D
Daniel Micay 已提交
2061
        for (key, value) in self.iter() {
2062
            d.insert((*key).clone(), value.to_json());
2063
        }
A
Adolfo Ochagavía 已提交
2064
        Object(d)
2065 2066 2067
    }
}

A
Adolfo Ochagavía 已提交
2068
impl<A: ToJson> ToJson for HashMap<String, A> {
G
Graydon Hoare 已提交
2069
    fn to_json(&self) -> Json {
2070
        let mut d = TreeMap::new();
D
Daniel Micay 已提交
2071
        for (key, value) in self.iter() {
2072
            d.insert((*key).clone(), value.to_json());
G
Graydon Hoare 已提交
2073
        }
A
Adolfo Ochagavía 已提交
2074
        Object(d)
G
Graydon Hoare 已提交
2075 2076 2077
    }
}

2078
impl<A:ToJson> ToJson for Option<A> {
B
Ben Striegel 已提交
2079 2080
    fn to_json(&self) -> Json {
        match *self {
A
Adolfo Ochagavía 已提交
2081 2082
            None => Null,
            Some(ref value) => value.to_json()
2083 2084 2085 2086
        }
    }
}

2087
impl fmt::Show for Json {
2088
    /// Encodes a json value into a string
2089
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
A
Alex Crichton 已提交
2090
        self.to_writer(f).map_err(|_| fmt::WriteError)
2091
    }
2092 2093
}

A
Adolfo Ochagavía 已提交
2094 2095 2096 2097 2098 2099
impl std::from_str::FromStr for Json {
    fn from_str(s: &str) -> Option<Json> {
        from_str(s).ok()
    }
}

2100 2101
#[cfg(test)]
mod tests {
2102 2103
    extern crate test;
    use self::test::Bencher;
A
Alex Crichton 已提交
2104 2105
    use {Encodable, Decodable};
    use super::{Encoder, Decoder, Error, Boolean, Number, List, String, Null,
S
Sean McArthur 已提交
2106
                PrettyEncoder, Object, Json, from_str, ParseError, ExpectedError,
2107 2108 2109 2110 2111 2112 2113
                MissingFieldError, UnknownVariantError, DecodeResult, DecoderError,
                JsonEvent, Parser, StackElement,
                ObjectStart, ObjectEnd, ListStart, ListEnd, BooleanValue, NumberValue, StringValue,
                NullValue, SyntaxError, Key, Index, Stack,
                InvalidSyntax, InvalidNumber, EOFWhileParsingObject, EOFWhileParsingList,
                EOFWhileParsingValue, EOFWhileParsingString, KeyMustBeAString, ExpectedColon,
                TrailingCharacters};
A
Adolfo Ochagavía 已提交
2114
    use std::{f32, f64, io};
2115
    use std::collections::TreeMap;
2116

2117
    #[deriving(PartialEq, Encodable, Decodable, Show)]
2118 2119
    enum Animal {
        Dog,
2120
        Frog(String, int)
2121 2122
    }

2123
    #[deriving(PartialEq, Encodable, Decodable, Show)]
2124 2125 2126
    struct Inner {
        a: (),
        b: uint,
2127
        c: Vec<String>,
2128 2129
    }

2130
    #[deriving(PartialEq, Encodable, Decodable, Show)]
2131
    struct Outer {
K
Kevin Ballard 已提交
2132
        inner: Vec<Inner>,
2133 2134
    }

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

D
Daniel Micay 已提交
2138
        for item in items.iter() {
2139
            match *item {
2140
                (ref key, ref value) => { d.insert((*key).clone(), (*value).clone()); },
2141
            }
2142 2143
        };

L
Luqman Aden 已提交
2144
        Object(d)
2145 2146
    }

A
Adolfo Ochagavía 已提交
2147 2148 2149 2150 2151 2152
    #[test]
    fn test_from_str_trait() {
        let s = "null";
        assert!(::std::from_str::from_str::<Json>(s).unwrap() == from_str(s).unwrap());
    }

2153 2154
    #[test]
    fn test_write_null() {
2155 2156
        assert_eq!(Null.to_str().into_string(), "null".to_string());
        assert_eq!(Null.to_pretty_str().into_string(), "null".to_string());
2157 2158
    }

2159

2160
    #[test]
2161
    fn test_write_number() {
2162 2163
        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());
2164

2165 2166
        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());
2167

2168 2169
        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());
2170

2171 2172
        assert_eq!(Number(0.5).to_str().into_string(), "0.5".to_string());
        assert_eq!(Number(0.5).to_pretty_str().into_string(), "0.5".to_string());
M
mrec 已提交
2173 2174 2175 2176 2177 2178 2179 2180 2181

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

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

        assert_eq!(Number(f64::NEG_INFINITY).to_str().into_string(), "null".to_string());
        assert_eq!(Number(f64::NEG_INFINITY).to_pretty_str().into_string(), "null".to_string());
2182 2183 2184 2185
    }

    #[test]
    fn test_write_str() {
2186 2187
        assert_eq!(String("".to_string()).to_str().into_string(), "\"\"".to_string());
        assert_eq!(String("".to_string()).to_pretty_str().into_string(), "\"\"".to_string());
2188

2189 2190
        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());
2191 2192 2193 2194
    }

    #[test]
    fn test_write_bool() {
2195 2196
        assert_eq!(Boolean(true).to_str().into_string(), "true".to_string());
        assert_eq!(Boolean(true).to_pretty_str().into_string(), "true".to_string());
2197

2198 2199
        assert_eq!(Boolean(false).to_str().into_string(), "false".to_string());
        assert_eq!(Boolean(false).to_pretty_str().into_string(), "false".to_string());
2200 2201 2202 2203
    }

    #[test]
    fn test_write_list() {
2204 2205
        assert_eq!(List(vec![]).to_str().into_string(), "[]".to_string());
        assert_eq!(List(vec![]).to_pretty_str().into_string(), "[]".to_string());
2206

2207
        assert_eq!(List(vec![Boolean(true)]).to_str().into_string(), "[true]".to_string());
2208
        assert_eq!(
2209
            List(vec![Boolean(true)]).to_pretty_str().into_string(),
2210
            "\
2211 2212
            [\n  \
                true\n\
2213
            ]".to_string()
2214
        );
2215

K
Kevin Ballard 已提交
2216
        let long_test_list = List(vec![
2217 2218
            Boolean(false),
            Null,
2219
            List(vec![String("foo\nbar".to_string()), Number(3.5)])]);
2220

2221 2222
        assert_eq!(long_test_list.to_str().into_string(),
            "[false,null,[\"foo\\nbar\",3.5]]".to_string());
2223
        assert_eq!(
2224
            long_test_list.to_pretty_str().into_string(),
2225
            "\
2226 2227 2228 2229 2230 2231 2232
            [\n  \
                false,\n  \
                null,\n  \
                [\n    \
                    \"foo\\nbar\",\n    \
                    3.5\n  \
                ]\n\
2233
            ]".to_string()
2234 2235 2236
        );
    }

2237
    #[test]
2238
    fn test_write_object() {
2239 2240
        assert_eq!(mk_object([]).to_str().into_string(), "{}".to_string());
        assert_eq!(mk_object([]).to_pretty_str().into_string(), "{}".to_string());
2241

2242
        assert_eq!(
2243
            mk_object([
2244 2245 2246
                ("a".to_string(), Boolean(true))
            ]).to_str().into_string(),
            "{\"a\":true}".to_string()
2247
        );
2248
        assert_eq!(
2249
            mk_object([("a".to_string(), Boolean(true))]).to_pretty_str(),
2250
            "\
2251 2252
            {\n  \
                \"a\": true\n\
2253
            }".to_string()
2254 2255
        );

2256
        let complex_obj = mk_object([
2257 2258 2259
                ("b".to_string(), List(vec![
                    mk_object([("c".to_string(), String("\x0c\r".to_string()))]),
                    mk_object([("d".to_string(), String("".to_string()))])
2260
                ]))
2261 2262 2263
            ]);

        assert_eq!(
2264
            complex_obj.to_str().into_string(),
2265
            "{\
2266 2267 2268 2269
                \"b\":[\
                    {\"c\":\"\\f\\r\"},\
                    {\"d\":\"\"}\
                ]\
2270
            }".to_string()
2271 2272
        );
        assert_eq!(
2273
            complex_obj.to_pretty_str().into_string(),
2274
            "\
2275 2276 2277 2278 2279 2280 2281 2282 2283
            {\n  \
                \"b\": [\n    \
                    {\n      \
                        \"c\": \"\\f\\r\"\n    \
                    },\n    \
                    {\n      \
                        \"d\": \"\"\n    \
                    }\n  \
                ]\n\
2284
            }".to_string()
2285
        );
2286

E
Erick Tryzelaar 已提交
2287
        let a = mk_object([
2288 2289 2290 2291
            ("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()))])
2292
            ]))
G
Graydon Hoare 已提交
2293
        ]);
2294

2295 2296
        // We can't compare the strings directly because the object fields be
        // printed in a different order.
2297
        assert_eq!(a.clone(), from_str(a.to_str().as_slice()).unwrap());
2298 2299
        assert_eq!(a.clone(),
                   from_str(a.to_pretty_str().as_slice()).unwrap());
2300 2301
    }

2302
    fn with_str_writer(f: |&mut io::Writer|) -> String {
A
Alex Crichton 已提交
2303
        use std::io::MemWriter;
A
Alex Crichton 已提交
2304 2305
        use std::str;

2306 2307
        let mut m = MemWriter::new();
        f(&mut m as &mut io::Writer);
2308
        str::from_utf8(m.unwrap().as_slice()).unwrap().to_string()
A
Alex Crichton 已提交
2309 2310
    }

2311
    #[test]
2312
    fn test_write_enum() {
2313
        let animal = Dog;
2314
        assert_eq!(
A
Adolfo Ochagavía 已提交
2315 2316
            with_str_writer(|writer| {
                let mut encoder = Encoder::new(writer);
S
Sean McArthur 已提交
2317
                animal.encode(&mut encoder).unwrap();
2318
            }),
2319
            "\"Dog\"".to_string()
2320 2321
        );
        assert_eq!(
A
Adolfo Ochagavía 已提交
2322 2323
            with_str_writer(|writer| {
                let mut encoder = PrettyEncoder::new(writer);
S
Sean McArthur 已提交
2324
                animal.encode(&mut encoder).unwrap();
2325
            }),
2326
            "\"Dog\"".to_string()
2327
        );
2328

2329
        let animal = Frog("Henry".to_string(), 349);
2330
        assert_eq!(
A
Adolfo Ochagavía 已提交
2331 2332
            with_str_writer(|writer| {
                let mut encoder = Encoder::new(writer);
S
Sean McArthur 已提交
2333
                animal.encode(&mut encoder).unwrap();
2334
            }),
2335
            "{\"variant\":\"Frog\",\"fields\":[\"Henry\",349]}".to_string()
2336 2337
        );
        assert_eq!(
A
Adolfo Ochagavía 已提交
2338 2339
            with_str_writer(|writer| {
                let mut encoder = PrettyEncoder::new(writer);
S
Sean McArthur 已提交
2340
                animal.encode(&mut encoder).unwrap();
2341
            }),
2342
            "\
2343 2344
            [\n  \
                \"Frog\",\n  \
2345 2346
                \"Henry\",\n  \
                349\n\
2347
            ]".to_string()
2348
        );
2349 2350 2351
    }

    #[test]
2352
    fn test_write_some() {
2353
        let value = Some("jodhpurs".to_string());
A
Adolfo Ochagavía 已提交
2354 2355
        let s = with_str_writer(|writer| {
            let mut encoder = Encoder::new(writer);
S
Sean McArthur 已提交
2356
            value.encode(&mut encoder).unwrap();
2357
        });
2358
        assert_eq!(s, "\"jodhpurs\"".to_string());
2359

2360
        let value = Some("jodhpurs".to_string());
A
Adolfo Ochagavía 已提交
2361 2362
        let s = with_str_writer(|writer| {
            let mut encoder = PrettyEncoder::new(writer);
S
Sean McArthur 已提交
2363
            value.encode(&mut encoder).unwrap();
2364
        });
2365
        assert_eq!(s, "\"jodhpurs\"".to_string());
2366 2367
    }

2368
    #[test]
2369
    fn test_write_none() {
2370
        let value: Option<String> = None;
A
Adolfo Ochagavía 已提交
2371 2372
        let s = with_str_writer(|writer| {
            let mut encoder = Encoder::new(writer);
S
Sean McArthur 已提交
2373
            value.encode(&mut encoder).unwrap();
2374
        });
2375
        assert_eq!(s, "null".to_string());
J
John Clements 已提交
2376

A
Adolfo Ochagavía 已提交
2377 2378
        let s = with_str_writer(|writer| {
            let mut encoder = Encoder::new(writer);
S
Sean McArthur 已提交
2379
            value.encode(&mut encoder).unwrap();
2380
        });
2381
        assert_eq!(s, "null".to_string());
2382 2383
    }

2384
    #[test]
2385
    fn test_trailing_characters() {
2386 2387 2388 2389 2390 2391
        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)));
2392 2393 2394 2395
    }

    #[test]
    fn test_read_identifiers() {
2396 2397 2398 2399 2400 2401
        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)));
2402

E
Erick Tryzelaar 已提交
2403 2404 2405 2406 2407 2408
        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)));
2409 2410
    }

2411 2412
    #[test]
    fn test_decode_identifiers() {
2413
        let v: () = super::decode("null").unwrap();
2414 2415
        assert_eq!(v, ());

2416
        let v: bool = super::decode("true").unwrap();
2417 2418
        assert_eq!(v, true);

2419
        let v: bool = super::decode("false").unwrap();
2420 2421 2422
        assert_eq!(v, false);
    }

2423
    #[test]
2424
    fn test_read_number() {
2425 2426
        assert_eq!(from_str("+"),   Err(SyntaxError(InvalidSyntax, 1, 1)));
        assert_eq!(from_str("."),   Err(SyntaxError(InvalidSyntax, 1, 1)));
M
mrec 已提交
2427
        assert_eq!(from_str("NaN"), Err(SyntaxError(InvalidSyntax, 1, 1)));
2428 2429 2430 2431 2432
        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)));
2433

D
Daniel Micay 已提交
2434 2435 2436 2437 2438 2439 2440 2441
        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)));
2442 2443
    }

2444 2445
    #[test]
    fn test_decode_numbers() {
2446
        let v: f64 = super::decode("3").unwrap();
D
Daniel Micay 已提交
2447
        assert_eq!(v, 3.0);
2448

2449
        let v: f64 = super::decode("3.1").unwrap();
D
Daniel Micay 已提交
2450
        assert_eq!(v, 3.1);
2451

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

2455
        let v: f64 = super::decode("0.4").unwrap();
D
Daniel Micay 已提交
2456
        assert_eq!(v, 0.4);
2457

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

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

2464
        let v: f64 = super::decode("0.4e-01").unwrap();
D
Daniel Micay 已提交
2465
        assert_eq!(v, 0.4e-01);
2466 2467
    }

G
Gary Linscott 已提交
2468
    #[test]
2469
    fn test_read_str() {
2470 2471 2472
        assert_eq!(from_str("\""),    Err(SyntaxError(EOFWhileParsingString, 1, 2)));
        assert_eq!(from_str("\"lol"), Err(SyntaxError(EOFWhileParsingString, 1, 5)));

2473 2474 2475 2476 2477 2478 2479 2480 2481 2482
        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())));
2483 2484
    }

2485
    #[test]
2486
    fn test_decode_str() {
2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497
        let s = [("\"\"", ""),
                 ("\"foo\"", "foo"),
                 ("\"\\\"\"", "\""),
                 ("\"\\b\"", "\x08"),
                 ("\"\\n\"", "\n"),
                 ("\"\\r\"", "\r"),
                 ("\"\\t\"", "\t"),
                 ("\"\\u12ab\"", "\u12ab"),
                 ("\"\\uAB12\"", "\uAB12")];

        for &(i, o) in s.iter() {
2498
            let v: String = super::decode(i).unwrap();
2499 2500
            assert_eq!(v.as_slice(), o);
        }
2501 2502
    }

2503
    #[test]
2504
    fn test_read_list() {
2505 2506 2507 2508 2509
        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)));
2510

K
Kevin Ballard 已提交
2511 2512 2513 2514 2515
        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 已提交
2516
        assert_eq!(from_str("[3, 1]"),
K
Kevin Ballard 已提交
2517
                     Ok(List(vec![Number(3.0), Number(1.0)])));
E
Erick Tryzelaar 已提交
2518
        assert_eq!(from_str("\n[3, 2]\n"),
K
Kevin Ballard 已提交
2519
                     Ok(List(vec![Number(3.0), Number(2.0)])));
E
Erick Tryzelaar 已提交
2520
        assert_eq!(from_str("[2, [4, 1]]"),
K
Kevin Ballard 已提交
2521
               Ok(List(vec![Number(2.0), List(vec![Number(4.0), Number(1.0)])])));
2522 2523
    }

2524 2525
    #[test]
    fn test_decode_list() {
2526
        let v: Vec<()> = super::decode("[]").unwrap();
K
Kevin Ballard 已提交
2527
        assert_eq!(v, vec![]);
2528

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

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

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

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

2542
    #[test]
2543
    fn test_read_object() {
2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555
        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)));
2556

E
Erick Tryzelaar 已提交
2557 2558
        assert_eq!(from_str("{}").unwrap(), mk_object([]));
        assert_eq!(from_str("{\"a\": 3}").unwrap(),
2559
                  mk_object([("a".to_string(), Number(3.0))]));
2560

E
Erick Tryzelaar 已提交
2561 2562
        assert_eq!(from_str(
                      "{ \"a\": null, \"b\" : true }").unwrap(),
E
Erick Tryzelaar 已提交
2563
                  mk_object([
2564 2565
                      ("a".to_string(), Null),
                      ("b".to_string(), Boolean(true))]));
E
Erick Tryzelaar 已提交
2566
        assert_eq!(from_str("\n{ \"a\": null, \"b\" : true }\n").unwrap(),
E
Erick Tryzelaar 已提交
2567
                  mk_object([
2568 2569
                      ("a".to_string(), Null),
                      ("b".to_string(), Boolean(true))]));
E
Erick Tryzelaar 已提交
2570 2571
        assert_eq!(from_str(
                      "{\"a\" : 1.0 ,\"b\": [ true ]}").unwrap(),
E
Erick Tryzelaar 已提交
2572
                  mk_object([
2573 2574
                      ("a".to_string(), Number(1.0)),
                      ("b".to_string(), List(vec![Boolean(true)]))
2575
                  ]));
E
Erick Tryzelaar 已提交
2576
        assert_eq!(from_str(
2577 2578 2579 2580 2581 2582 2583 2584
                      "{\
                          \"a\": 1.0, \
                          \"b\": [\
                              true,\
                              \"foo\\nbar\", \
                              { \"c\": {\"d\": null} } \
                          ]\
                      }").unwrap(),
E
Erick Tryzelaar 已提交
2585
                  mk_object([
2586 2587
                      ("a".to_string(), Number(1.0)),
                      ("b".to_string(), List(vec![
B
Ben Striegel 已提交
2588
                          Boolean(true),
2589
                          String("foo\nbar".to_string()),
E
Erick Tryzelaar 已提交
2590
                          mk_object([
2591
                              ("c".to_string(), mk_object([("d".to_string(), Null)]))
2592 2593
                          ])
                      ]))
2594
                  ]));
2595 2596
    }

2597
    #[test]
2598
    fn test_decode_struct() {
2599
        let s = "{
2600 2601 2602
            \"inner\": [
                { \"a\": null, \"b\": 2, \"c\": [\"abc\", \"xyz\"] }
            ]
2603
        }";
2604 2605

        let v: Outer = super::decode(s).unwrap();
2606 2607 2608
        assert_eq!(
            v,
            Outer {
K
Kevin Ballard 已提交
2609
                inner: vec![
2610
                    Inner { a: (), b: 2, c: vec!["abc".to_string(), "xyz".to_string()] }
2611 2612 2613 2614 2615
                ]
            }
        );
    }

M
mrec 已提交
2616 2617 2618 2619 2620 2621 2622
    #[deriving(Decodable)]
    struct FloatStruct {
        f: f64,
        a: Vec<f64>
    }
    #[test]
    fn test_decode_struct_with_nan() {
2623 2624 2625 2626 2627
        let s = "{\"f\":null,\"a\":[null,123]}";
        let obj: FloatStruct = super::decode(s).unwrap();
        assert!(obj.f.is_nan());
        assert!(obj.a.get(0).is_nan());
        assert_eq!(obj.a.get(1), &123f64);
M
mrec 已提交
2628 2629
    }

2630 2631
    #[test]
    fn test_decode_option() {
2632
        let value: Option<String> = super::decode("null").unwrap();
2633 2634
        assert_eq!(value, None);

2635
        let value: Option<String> = super::decode("\"jodhpurs\"").unwrap();
2636
        assert_eq!(value, Some("jodhpurs".to_string()));
2637 2638
    }

2639
    #[test]
2640
    fn test_decode_enum() {
2641
        let value: Animal = super::decode("\"Dog\"").unwrap();
2642 2643
        assert_eq!(value, Dog);

2644
        let s = "{\"variant\":\"Frog\",\"fields\":[\"Henry\",349]}";
2645
        let value: Animal = super::decode(s).unwrap();
2646
        assert_eq!(value, Frog("Henry".to_string(), 349));
2647 2648
    }

2649
    #[test]
2650
    fn test_decode_map() {
2651
        let s = "{\"a\": \"Dog\", \"b\": {\"variant\":\"Frog\",\
2652
                  \"fields\":[\"Henry\", 349]}}";
2653
        let mut map: TreeMap<String, Animal> = super::decode(s).unwrap();
2654

2655 2656
        assert_eq!(map.pop(&"a".to_string()), Some(Dog));
        assert_eq!(map.pop(&"b".to_string()), Some(Frog("Henry".to_string(), 349)));
2657 2658
    }

2659
    #[test]
2660
    fn test_multiline_errors() {
E
Erick Tryzelaar 已提交
2661
        assert_eq!(from_str("{\n  \"foo\":\n \"bar\""),
2662
            Err(SyntaxError(EOFWhileParsingObject, 3u, 8u)));
2663
    }
2664 2665

    #[deriving(Decodable)]
M
mrec 已提交
2666
    #[allow(dead_code)]
2667 2668 2669
    struct DecodeStruct {
        x: f64,
        y: bool,
2670
        z: String,
K
Kevin Ballard 已提交
2671
        w: Vec<DecodeStruct>
2672 2673 2674 2675
    }
    #[deriving(Decodable)]
    enum DecodeEnum {
        A(f64),
2676
        B(String)
2677
    }
2678 2679
    fn check_err<T: Decodable<Decoder, DecoderError>>(to_parse: &'static str,
                                                      expected: DecoderError) {
S
Sean McArthur 已提交
2680
        let res: DecodeResult<T> = match from_str(to_parse) {
2681
            Err(e) => Err(ParseError(e)),
S
Sean McArthur 已提交
2682 2683
            Ok(json) => Decodable::decode(&mut Decoder::new(json))
        };
2684
        match res {
S
Sean McArthur 已提交
2685 2686
            Ok(_) => fail!("`{}` parsed & decoded ok, expecting error `{}`",
                              to_parse, expected),
2687
            Err(ParseError(e)) => fail!("`{}` is not valid json: {}",
S
Sean McArthur 已提交
2688
                                           to_parse, e),
2689
            Err(e) => {
S
Sean McArthur 已提交
2690
                assert_eq!(e, expected);
2691 2692 2693 2694 2695
            }
        }
    }
    #[test]
    fn test_decode_errors_struct() {
2696
        check_err::<DecodeStruct>("[]", ExpectedError("Object".to_string(), "[]".to_string()));
2697
        check_err::<DecodeStruct>("{\"x\": true, \"y\": true, \"z\": \"\", \"w\": []}",
2698
                                  ExpectedError("Number".to_string(), "true".to_string()));
2699
        check_err::<DecodeStruct>("{\"x\": 1, \"y\": [], \"z\": \"\", \"w\": []}",
2700
                                  ExpectedError("Boolean".to_string(), "[]".to_string()));
2701
        check_err::<DecodeStruct>("{\"x\": 1, \"y\": true, \"z\": {}, \"w\": []}",
2702
                                  ExpectedError("String".to_string(), "{}".to_string()));
2703
        check_err::<DecodeStruct>("{\"x\": 1, \"y\": true, \"z\": \"\", \"w\": null}",
2704
                                  ExpectedError("List".to_string(), "null".to_string()));
2705
        check_err::<DecodeStruct>("{\"x\": 1, \"y\": true, \"z\": \"\"}",
2706
                                  MissingFieldError("w".to_string()));
2707 2708 2709 2710
    }
    #[test]
    fn test_decode_errors_enum() {
        check_err::<DecodeEnum>("{}",
2711
                                MissingFieldError("variant".to_string()));
2712
        check_err::<DecodeEnum>("{\"variant\": 1}",
2713
                                ExpectedError("String".to_string(), "1".to_string()));
2714
        check_err::<DecodeEnum>("{\"variant\": \"A\"}",
2715
                                MissingFieldError("fields".to_string()));
2716
        check_err::<DecodeEnum>("{\"variant\": \"A\", \"fields\": null}",
2717
                                ExpectedError("List".to_string(), "null".to_string()));
2718
        check_err::<DecodeEnum>("{\"variant\": \"C\", \"fields\": []}",
2719
                                UnknownVariantError("C".to_string()));
2720
    }
2721 2722 2723 2724

    #[test]
    fn test_find(){
        let json_value = from_str("{\"dog\" : \"cat\"}").unwrap();
2725
        let found_str = json_value.find(&"dog".to_string());
2726
        assert!(found_str.is_some() && found_str.unwrap().as_string().unwrap() == "cat");
2727 2728 2729 2730 2731
    }

    #[test]
    fn test_find_path(){
        let json_value = from_str("{\"dog\":{\"cat\": {\"mouse\" : \"cheese\"}}}").unwrap();
2732 2733
        let found_str = json_value.find_path(&[&"dog".to_string(),
                                             &"cat".to_string(), &"mouse".to_string()]);
2734
        assert!(found_str.is_some() && found_str.unwrap().as_string().unwrap() == "cheese");
2735 2736 2737 2738 2739
    }

    #[test]
    fn test_search(){
        let json_value = from_str("{\"dog\":{\"cat\": {\"mouse\" : \"cheese\"}}}").unwrap();
2740
        let found_str = json_value.search(&"mouse".to_string()).and_then(|j| j.as_string());
2741
        assert!(found_str.is_some());
2742
        assert!(found_str.unwrap() == "cheese");
2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772
    }

    #[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]
2773
    fn test_is_string(){
2774
        let json_value = from_str("\"dog\"").unwrap();
2775
        assert!(json_value.is_string());
2776 2777 2778
    }

    #[test]
2779
    fn test_as_string(){
2780
        let json_value = from_str("\"dog\"").unwrap();
2781
        let json_str = json_value.as_string();
2782
        let expected_str = "dog";
2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826
        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);
    }
2827 2828 2829 2830 2831 2832

    #[test]
    fn test_encode_hashmap_with_numeric_key() {
        use std::str::from_utf8;
        use std::io::Writer;
        use std::io::MemWriter;
2833
        use std::collections::HashMap;
2834 2835 2836 2837 2838
        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 已提交
2839
            hm.encode(&mut encoder).unwrap();
2840 2841
        }
        let bytes = mem_buf.unwrap();
S
Steven Fackler 已提交
2842
        let json_str = from_utf8(bytes.as_slice()).unwrap();
2843
        match from_str(json_str) {
2844
            Err(_) => fail!("Unable to parse json_str: {}", json_str),
2845 2846 2847 2848 2849 2850 2851 2852
            _ => {} // 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;
2853
        use std::collections::HashMap;
2854 2855 2856 2857 2858
        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);
2859
            hm.encode(&mut encoder).unwrap()
2860 2861
        }
        let bytes = mem_buf.unwrap();
S
Steven Fackler 已提交
2862
        let json_str = from_utf8(bytes.as_slice()).unwrap();
2863
        match from_str(json_str) {
2864
            Err(_) => fail!("Unable to parse json_str: {}", json_str),
2865 2866 2867 2868 2869
            _ => {} // it parsed and we are good to go
        }
    }
    #[test]
    fn test_hashmap_with_numeric_key_can_handle_double_quote_delimited_key() {
2870
        use std::collections::HashMap;
2871 2872 2873
        use Decodable;
        let json_str = "{\"1\":true}";
        let json_obj = match from_str(json_str) {
2874
            Err(_) => fail!("Unable to parse json_str: {}", json_str),
2875 2876 2877
            Ok(o) => o
        };
        let mut decoder = Decoder::new(json_obj);
S
Sean McArthur 已提交
2878
        let _hm: HashMap<uint, bool> = Decodable::decode(&mut decoder).unwrap();
2879
    }
2880

2881 2882
    fn assert_stream_equal(src: &str,
                           expected: Vec<(JsonEvent, Vec<StackElement>)>) {
2883 2884 2885 2886 2887 2888 2889
        let mut parser = Parser::new(src.chars());
        let mut i = 0;
        loop {
            let evt = match parser.next() {
                Some(e) => e,
                None => { break; }
            };
2890
            let (ref expected_evt, ref expected_stack) = *expected.get(i);
2891 2892 2893 2894 2895 2896 2897 2898
            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]
2899
    #[ignore(cfg(target_word_size = "32"))] // FIXME(#14064)
2900 2901 2902
    fn test_streaming_parser() {
        assert_stream_equal(
            r#"{ "foo":"bar", "array" : [0, 1, 2,3 ,4,5], "idents":[null,true,false]}"#,
2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919
            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![]),
2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933
            ]
        );
    }
    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]
2934
    #[ignore(cfg(target_word_size = "32"))] // FIXME(#14064)
2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949
    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(
            "{}",
2950
            vec![(ObjectStart, vec![]), (ObjectEnd, vec![])]
2951 2952 2953
        );
        assert_stream_equal(
            "{\"a\": 3}",
2954 2955 2956 2957
            vec![
                (ObjectStart,        vec![]),
                  (NumberValue(3.0), vec![Key("a")]),
                (ObjectEnd,          vec![]),
2958 2959 2960 2961
            ]
        );
        assert_stream_equal(
            "{ \"a\": null, \"b\" : true }",
2962 2963 2964 2965 2966
            vec![
                (ObjectStart,           vec![]),
                  (NullValue,           vec![Key("a")]),
                  (BooleanValue(true),  vec![Key("b")]),
                (ObjectEnd,             vec![]),
2967 2968 2969 2970
            ]
        );
        assert_stream_equal(
            "{\"a\" : 1.0 ,\"b\": [ true ]}",
2971 2972 2973 2974 2975 2976 2977
            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![]),
2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988
            ]
        );
        assert_stream_equal(
            r#"{
                "a": 1.0,
                "b": [
                    true,
                    "foo\nbar",
                    { "c": {"d": null} }
                ]
            }"#,
2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001
            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![]),
3002 3003 3004 3005
            ]
        );
    }
    #[test]
3006
    #[ignore(cfg(target_word_size = "32"))] // FIXME(#14064)
3007 3008 3009
    fn test_read_list_streaming() {
        assert_stream_equal(
            "[]",
3010 3011 3012
            vec![
                (ListStart, vec![]),
                (ListEnd,   vec![]),
3013 3014 3015 3016
            ]
        );
        assert_stream_equal(
            "[ ]",
3017 3018 3019
            vec![
                (ListStart, vec![]),
                (ListEnd,   vec![]),
3020 3021 3022 3023
            ]
        );
        assert_stream_equal(
            "[true]",
3024 3025 3026 3027
            vec![
                (ListStart,              vec![]),
                    (BooleanValue(true), vec![Index(0)]),
                (ListEnd,                vec![]),
3028 3029 3030 3031
            ]
        );
        assert_stream_equal(
            "[ false ]",
3032 3033 3034 3035
            vec![
                (ListStart,               vec![]),
                    (BooleanValue(false), vec![Index(0)]),
                (ListEnd,                 vec![]),
3036 3037 3038 3039
            ]
        );
        assert_stream_equal(
            "[null]",
3040 3041 3042 3043
            vec![
                (ListStart,     vec![]),
                    (NullValue, vec![Index(0)]),
                (ListEnd,       vec![]),
3044 3045 3046 3047
            ]
        );
        assert_stream_equal(
            "[3, 1]",
3048 3049 3050 3051 3052
            vec![
                (ListStart,     vec![]),
                    (NumberValue(3.0), vec![Index(0)]),
                    (NumberValue(1.0), vec![Index(1)]),
                (ListEnd,       vec![]),
3053 3054 3055 3056
            ]
        );
        assert_stream_equal(
            "\n[3, 2]\n",
3057 3058 3059 3060 3061
            vec![
                (ListStart,     vec![]),
                    (NumberValue(3.0), vec![Index(0)]),
                    (NumberValue(2.0), vec![Index(1)]),
                (ListEnd,       vec![]),
3062 3063 3064 3065
            ]
        );
        assert_stream_equal(
            "[2, [4, 1]]",
3066 3067 3068 3069 3070 3071 3072 3073
            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![]),
3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126
            ]
        );

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

3127
        stack.push_key("foo".to_string());
3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138

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

3139
        stack.push_key("bar".to_string());
3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166

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

3167 3168
    #[test]
    fn test_to_json() {
3169
        use std::collections::{HashMap,TreeMap};
3170 3171 3172 3173 3174 3175 3176 3177
        use super::ToJson;

        let list2 = List(vec!(Number(1.0_f64), Number(2.0_f64)));
        let list3 = List(vec!(Number(1.0f64), Number(2.0f64), Number(3.0f64)));
        let object = {
            let mut tree_map = TreeMap::new();
            tree_map.insert("a".to_string(), Number(1.0_f64));
            tree_map.insert("b".to_string(), Number(2.0_f64));
A
Adolfo Ochagavía 已提交
3178
            Object(tree_map)
3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195
        };

        assert_eq!(list2.to_json(), list2);
        assert_eq!(object.to_json(), object);
        assert_eq!(3_i.to_json(), Number(3.0_f64));
        assert_eq!(4_i8.to_json(), Number(4.0_f64));
        assert_eq!(5_i16.to_json(), Number(5.0_f64));
        assert_eq!(6_i32.to_json(), Number(6.0_f64));
        assert_eq!(7_i64.to_json(), Number(7.0_f64));
        assert_eq!(8_u.to_json(), Number(8.0_f64));
        assert_eq!(9_u8.to_json(), Number(9.0_f64));
        assert_eq!(10_u16.to_json(), Number(10.0_f64));
        assert_eq!(11_u32.to_json(), Number(11.0_f64));
        assert_eq!(12_u64.to_json(), Number(12.0_f64));
        assert_eq!(13.0_f32.to_json(), Number(13.0_f64));
        assert_eq!(14.0_f64.to_json(), Number(14.0_f64));
        assert_eq!(().to_json(), Null);
M
mrec 已提交
3196 3197
        assert_eq!(f32::INFINITY.to_json(), Null);
        assert_eq!(f64::NAN.to_json(), Null);
3198 3199 3200
        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()));
3201 3202 3203 3204 3205 3206
        assert_eq!((1i, 2i).to_json(), list2);
        assert_eq!((1i, 2i, 3i).to_json(), list3);
        assert_eq!([1i, 2].to_json(), list2);
        assert_eq!((&[1i, 2, 3]).to_json(), list3);
        assert_eq!((vec![1i, 2]).to_json(), list2);
        assert_eq!(vec!(1i, 2i, 3i).to_json(), list3);
3207
        let mut tree_map = TreeMap::new();
3208
        tree_map.insert("a".to_string(), 1i);
3209 3210 3211
        tree_map.insert("b".to_string(), 2);
        assert_eq!(tree_map.to_json(), object);
        let mut hash_map = HashMap::new();
3212
        hash_map.insert("a".to_string(), 1i);
3213 3214
        hash_map.insert("b".to_string(), 2);
        assert_eq!(hash_map.to_json(), object);
3215
        assert_eq!(Some(15i).to_json(), Number(15f64));
3216 3217 3218
        assert_eq!(None::<int>.to_json(), Null);
    }

3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253
    #[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} }
                ]
            }"#);
        });
    }

3254
    fn big_json() -> String {
3255
        let mut src = "[\n".to_string();
3256
        for _ in range(0i, 500) {
3257 3258
            src.push_str(r#"{ "a": true, "b": null, "c":3.1415, "d": "Hello world", "e": \
                            [1,2,3]},"#);
3259
        }
3260
        src.push_str("{}]");
3261 3262 3263 3264 3265 3266 3267
        return src;
    }

    #[bench]
    fn bench_streaming_large(b: &mut Bencher) {
        let src = big_json();
        b.iter( || {
3268
            let mut parser = Parser::new(src.as_slice().chars());
3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279
            loop {
                match parser.next() {
                    None => return,
                    _ => {}
                }
            }
        });
    }
    #[bench]
    fn bench_large(b: &mut Bencher) {
        let src = big_json();
3280
        b.iter( || { let _ = from_str(src.as_slice()); });
3281
    }
3282
}