]> git.proxmox.com Git - rustc.git/blame - src/libserialize/json.rs
Imported Upstream version 1.1.0+dfsg1
[rustc.git] / src / libserialize / json.rs
CommitLineData
1a4d82fc
JJ
1// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT
2// file at the top-level directory of this distribution and at
3// http://rust-lang.org/COPYRIGHT.
4//
5// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8// option. This file may not be copied, modified, or distributed
9// except according to those terms.
10
11// Rust JSON serialization library
12// Copyright (c) 2011 Google Inc.
13
14#![forbid(non_camel_case_types)]
15#![allow(missing_docs)]
16
17//! JSON parsing and serialization
18//!
19//! # What is JSON?
20//!
21//! JSON (JavaScript Object Notation) is a way to write data in Javascript.
22//! Like XML, it allows to encode structured data in a text format that can be easily read by humans
23//! Its simple syntax and native compatibility with JavaScript have made it a widely used format.
24//!
25//! Data types that can be encoded are JavaScript types (see the `Json` enum for more details):
26//!
27//! * `Boolean`: equivalent to rust's `bool`
28//! * `Number`: equivalent to rust's `f64`
29//! * `String`: equivalent to rust's `String`
30//! * `Array`: equivalent to rust's `Vec<T>`, but also allowing objects of different types in the
31//! same array
32//! * `Object`: equivalent to rust's `BTreeMap<String, json::Json>`
33//! * `Null`
34//!
35//! An object is a series of string keys mapping to values, in `"key": value` format.
36//! Arrays are enclosed in square brackets ([ ... ]) and objects in curly brackets ({ ... }).
85aaf69f 37//! A simple JSON document encoding a person, their age, address and phone numbers could look like
1a4d82fc
JJ
38//!
39//! ```ignore
40//! {
41//! "FirstName": "John",
42//! "LastName": "Doe",
43//! "Age": 43,
44//! "Address": {
45//! "Street": "Downing Street 10",
46//! "City": "London",
47//! "Country": "Great Britain"
48//! },
49//! "PhoneNumbers": [
50//! "+44 1234567",
51//! "+44 2345678"
52//! ]
53//! }
54//! ```
55//!
56//! # Rust Type-based Encoding and Decoding
57//!
58//! Rust provides a mechanism for low boilerplate encoding & decoding of values to and from JSON via
59//! the serialization API.
60//! To be able to encode a piece of data, it must implement the `serialize::RustcEncodable` trait.
61//! To be able to decode a piece of data, it must implement the `serialize::RustcDecodable` trait.
62//! The Rust compiler provides an annotation to automatically generate the code for these traits:
63//! `#[derive(RustcDecodable, RustcEncodable)]`
64//!
65//! The JSON API provides an enum `json::Json` and a trait `ToJson` to encode objects.
66//! The `ToJson` trait provides a `to_json` method to convert an object into a `json::Json` value.
67//! A `json::Json` value can be encoded as a string or buffer using the functions described above.
68//! You can also use the `json::Encoder` object, which implements the `Encoder` trait.
69//!
70//! When using `ToJson` the `RustcEncodable` trait implementation is not mandatory.
71//!
72//! # Examples of use
73//!
74//! ## Using Autoserialization
75//!
76//! Create a struct called `TestStruct` and serialize and deserialize it to and from JSON using the
77//! serialization API, using the derived serialization code.
78//!
79//! ```notrust
80//! // FIXME(#19470): this cannot be ```rust``` because it fails orphan checking at the moment
81//! extern crate serialize;
82//! use serialize::json;
83//!
84//! // Automatically generate `Decodable` and `Encodable` trait implementations
85//! #[derive(RustcDecodable, RustcEncodable)]
86//! pub struct TestStruct {
87//! data_int: u8,
88//! data_str: String,
89//! data_vector: Vec<u8>,
90//! }
91//!
92//! fn main() {
93//! let object = TestStruct {
94//! data_int: 1,
95//! data_str: "homura".to_string(),
96//! data_vector: vec![2,3,4,5],
97//! };
98//!
99//! // Serialize using `json::encode`
85aaf69f 100//! let encoded = json::encode(&object).unwrap();
1a4d82fc
JJ
101//!
102//! // Deserialize using `json::decode`
c34b1796 103//! let decoded: TestStruct = json::decode(&encoded[..]).unwrap();
1a4d82fc
JJ
104//! }
105//! ```
106//!
107//! ## Using the `ToJson` trait
108//!
109//! The examples above use the `ToJson` trait to generate the JSON string, which is required
110//! for custom mappings.
111//!
112//! ### Simple example of `ToJson` usage
113//!
114//! ```notrust
115//! // FIXME(#19470): this cannot be ```rust``` because it fails orphan checking at the moment
116//! extern crate serialize;
117//! use serialize::json::{self, ToJson, Json};
118//!
119//! // A custom data structure
120//! struct ComplexNum {
121//! a: f64,
122//! b: f64,
123//! }
124//!
125//! // JSON value representation
126//! impl ToJson for ComplexNum {
127//! fn to_json(&self) -> Json {
128//! Json::String(format!("{}+{}i", self.a, self.b))
129//! }
130//! }
131//!
132//! // Only generate `RustcEncodable` trait implementation
133//! #[derive(Encodable)]
134//! pub struct ComplexNumRecord {
135//! uid: u8,
136//! dsc: String,
137//! val: Json,
138//! }
139//!
140//! fn main() {
141//! let num = ComplexNum { a: 0.0001, b: 12.539 };
142//! let data: String = json::encode(&ComplexNumRecord{
143//! uid: 1,
144//! dsc: "test".to_string(),
145//! val: num.to_json(),
85aaf69f 146//! }).unwrap();
1a4d82fc
JJ
147//! println!("data: {}", data);
148//! // data: {"uid":1,"dsc":"test","val":"0.0001+12.539j"};
149//! }
150//! ```
151//!
152//! ### Verbose example of `ToJson` usage
153//!
154//! ```notrust
155//! // FIXME(#19470): this cannot be ```rust``` because it fails orphan checking at the moment
156//! extern crate serialize;
157//! use std::collections::BTreeMap;
158//! use serialize::json::{self, Json, ToJson};
159//!
160//! // Only generate `Decodable` trait implementation
161//! #[derive(Decodable)]
162//! pub struct TestStruct {
163//! data_int: u8,
164//! data_str: String,
165//! data_vector: Vec<u8>,
166//! }
167//!
168//! // Specify encoding method manually
169//! impl ToJson for TestStruct {
170//! fn to_json(&self) -> Json {
171//! let mut d = BTreeMap::new();
172//! // All standard types implement `to_json()`, so use it
173//! d.insert("data_int".to_string(), self.data_int.to_json());
174//! d.insert("data_str".to_string(), self.data_str.to_json());
175//! d.insert("data_vector".to_string(), self.data_vector.to_json());
176//! Json::Object(d)
177//! }
178//! }
179//!
180//! fn main() {
181//! // Serialize using `ToJson`
182//! let input_data = TestStruct {
183//! data_int: 1,
184//! data_str: "madoka".to_string(),
185//! data_vector: vec![2,3,4,5],
186//! };
187//! let json_obj: Json = input_data.to_json();
188//! let json_str: String = json_obj.to_string();
189//!
190//! // Deserialize like before
c34b1796 191//! let decoded: TestStruct = json::decode(json_str)).unwrap();
1a4d82fc
JJ
192//! }
193//! ```
194
195use self::JsonEvent::*;
196use self::ErrorCode::*;
197use self::ParserError::*;
198use self::DecoderError::*;
199use self::ParserState::*;
200use self::InternalStackElement::*;
201
1a4d82fc 202use std::collections::{HashMap, BTreeMap};
c34b1796
AL
203use std::io::prelude::*;
204use std::io;
205use std::mem::swap;
1a4d82fc 206use std::num::FpCategory as Fp;
c34b1796 207use std::ops::Index;
1a4d82fc
JJ
208use std::str::FromStr;
209use std::string;
9346a6ac 210use std::{char, f64, fmt, str};
c34b1796 211use std;
d9579d0f
AL
212use rustc_unicode::str as unicode_str;
213use rustc_unicode::str::Utf16Item;
1a4d82fc
JJ
214
215use Encodable;
216
217/// Represents a json value
85aaf69f 218#[derive(Clone, PartialEq, PartialOrd, Debug)]
1a4d82fc
JJ
219pub enum Json {
220 I64(i64),
221 U64(u64),
222 F64(f64),
223 String(string::String),
224 Boolean(bool),
225 Array(self::Array),
226 Object(self::Object),
227 Null,
228}
229
230pub type Array = Vec<Json>;
231pub type Object = BTreeMap<string::String, Json>;
232
233pub struct PrettyJson<'a> { inner: &'a Json }
234
235pub struct AsJson<'a, T: 'a> { inner: &'a T }
c34b1796 236pub struct AsPrettyJson<'a, T: 'a> { inner: &'a T, indent: Option<usize> }
1a4d82fc
JJ
237
238/// The errors that can arise while parsing a JSON stream.
85aaf69f 239#[derive(Clone, Copy, PartialEq, Debug)]
1a4d82fc
JJ
240pub enum ErrorCode {
241 InvalidSyntax,
242 InvalidNumber,
243 EOFWhileParsingObject,
244 EOFWhileParsingArray,
245 EOFWhileParsingValue,
246 EOFWhileParsingString,
247 KeyMustBeAString,
248 ExpectedColon,
249 TrailingCharacters,
250 TrailingComma,
251 InvalidEscape,
252 InvalidUnicodeCodePoint,
253 LoneLeadingSurrogateInHexEscape,
254 UnexpectedEndOfHexEscape,
255 UnrecognizedHex,
256 NotFourDigit,
257 NotUtf8,
258}
259
c34b1796 260#[derive(Clone, PartialEq, Debug)]
1a4d82fc
JJ
261pub enum ParserError {
262 /// msg, line, col
c34b1796
AL
263 SyntaxError(ErrorCode, usize, usize),
264 IoError(io::ErrorKind, String),
1a4d82fc
JJ
265}
266
267// Builder and Parser have the same errors.
268pub type BuilderError = ParserError;
269
85aaf69f 270#[derive(Clone, PartialEq, Debug)]
1a4d82fc
JJ
271pub enum DecoderError {
272 ParseError(ParserError),
273 ExpectedError(string::String, string::String),
274 MissingFieldError(string::String),
275 UnknownVariantError(string::String),
276 ApplicationError(string::String)
277}
278
c34b1796 279#[derive(Copy, Clone, Debug)]
85aaf69f
SL
280pub enum EncoderError {
281 FmtError(fmt::Error),
282 BadHashmapKey,
283}
284
1a4d82fc
JJ
285/// Returns a readable error string for a given error code.
286pub fn error_str(error: ErrorCode) -> &'static str {
287 match error {
288 InvalidSyntax => "invalid syntax",
289 InvalidNumber => "invalid number",
290 EOFWhileParsingObject => "EOF While parsing object",
291 EOFWhileParsingArray => "EOF While parsing array",
292 EOFWhileParsingValue => "EOF While parsing value",
293 EOFWhileParsingString => "EOF While parsing string",
294 KeyMustBeAString => "key must be a string",
295 ExpectedColon => "expected `:`",
296 TrailingCharacters => "trailing characters",
297 TrailingComma => "trailing comma",
298 InvalidEscape => "invalid escape",
299 UnrecognizedHex => "invalid \\u{ esc}ape (unrecognized hex)",
300 NotFourDigit => "invalid \\u{ esc}ape (not four digits)",
301 NotUtf8 => "contents not utf-8",
302 InvalidUnicodeCodePoint => "invalid Unicode code point",
303 LoneLeadingSurrogateInHexEscape => "lone leading surrogate in hex escape",
304 UnexpectedEndOfHexEscape => "unexpected end of hex escape",
305 }
306}
307
308/// Shortcut function to decode a JSON `&str` into an object
309pub fn decode<T: ::Decodable>(s: &str) -> DecodeResult<T> {
310 let json = match from_str(s) {
311 Ok(x) => x,
312 Err(e) => return Err(ParseError(e))
313 };
314
315 let mut decoder = Decoder::new(json);
316 ::Decodable::decode(&mut decoder)
317}
318
319/// Shortcut function to encode a `T` into a JSON `String`
85aaf69f 320pub fn encode<T: ::Encodable>(object: &T) -> Result<string::String, EncoderError> {
1a4d82fc
JJ
321 let mut s = String::new();
322 {
323 let mut encoder = Encoder::new(&mut s);
85aaf69f 324 try!(object.encode(&mut encoder));
1a4d82fc 325 }
85aaf69f 326 Ok(s)
1a4d82fc
JJ
327}
328
85aaf69f 329impl fmt::Display for ErrorCode {
1a4d82fc
JJ
330 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
331 error_str(*self).fmt(f)
332 }
333}
334
c34b1796
AL
335fn io_error_to_error(io: io::Error) -> ParserError {
336 IoError(io.kind(), io.to_string())
1a4d82fc
JJ
337}
338
85aaf69f
SL
339impl fmt::Display for ParserError {
340 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
341 // FIXME this should be a nicer error
342 fmt::Debug::fmt(self, f)
343 }
344}
345
346impl fmt::Display for DecoderError {
347 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
348 // FIXME this should be a nicer error
349 fmt::Debug::fmt(self, f)
350 }
351}
352
1a4d82fc
JJ
353impl std::error::Error for DecoderError {
354 fn description(&self) -> &str { "decoder error" }
1a4d82fc
JJ
355}
356
85aaf69f
SL
357impl fmt::Display for EncoderError {
358 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
359 // FIXME this should be a nicer error
360 fmt::Debug::fmt(self, f)
361 }
362}
363
364impl std::error::Error for EncoderError {
365 fn description(&self) -> &str { "encoder error" }
366}
367
c34b1796
AL
368impl From<fmt::Error> for EncoderError {
369 fn from(err: fmt::Error) -> EncoderError { EncoderError::FmtError(err) }
85aaf69f
SL
370}
371
372pub type EncodeResult = Result<(), EncoderError>;
1a4d82fc
JJ
373pub type DecodeResult<T> = Result<T, DecoderError>;
374
85aaf69f 375fn escape_str(wr: &mut fmt::Write, v: &str) -> EncodeResult {
1a4d82fc
JJ
376 try!(wr.write_str("\""));
377
378 let mut start = 0;
379
380 for (i, byte) in v.bytes().enumerate() {
381 let escaped = match byte {
382 b'"' => "\\\"",
383 b'\\' => "\\\\",
384 b'\x00' => "\\u0000",
385 b'\x01' => "\\u0001",
386 b'\x02' => "\\u0002",
387 b'\x03' => "\\u0003",
388 b'\x04' => "\\u0004",
389 b'\x05' => "\\u0005",
390 b'\x06' => "\\u0006",
391 b'\x07' => "\\u0007",
392 b'\x08' => "\\b",
393 b'\t' => "\\t",
394 b'\n' => "\\n",
395 b'\x0b' => "\\u000b",
396 b'\x0c' => "\\f",
397 b'\r' => "\\r",
398 b'\x0e' => "\\u000e",
399 b'\x0f' => "\\u000f",
400 b'\x10' => "\\u0010",
401 b'\x11' => "\\u0011",
402 b'\x12' => "\\u0012",
403 b'\x13' => "\\u0013",
404 b'\x14' => "\\u0014",
405 b'\x15' => "\\u0015",
406 b'\x16' => "\\u0016",
407 b'\x17' => "\\u0017",
408 b'\x18' => "\\u0018",
409 b'\x19' => "\\u0019",
410 b'\x1a' => "\\u001a",
411 b'\x1b' => "\\u001b",
412 b'\x1c' => "\\u001c",
413 b'\x1d' => "\\u001d",
414 b'\x1e' => "\\u001e",
415 b'\x1f' => "\\u001f",
416 b'\x7f' => "\\u007f",
417 _ => { continue; }
418 };
419
420 if start < i {
421 try!(wr.write_str(&v[start..i]));
422 }
423
424 try!(wr.write_str(escaped));
425
426 start = i + 1;
427 }
428
429 if start != v.len() {
430 try!(wr.write_str(&v[start..]));
431 }
432
85aaf69f
SL
433 try!(wr.write_str("\""));
434 Ok(())
1a4d82fc
JJ
435}
436
85aaf69f 437fn escape_char(writer: &mut fmt::Write, v: char) -> EncodeResult {
1a4d82fc
JJ
438 let mut buf = [0; 4];
439 let n = v.encode_utf8(&mut buf).unwrap();
85aaf69f 440 let buf = unsafe { str::from_utf8_unchecked(&buf[..n]) };
1a4d82fc
JJ
441 escape_str(writer, buf)
442}
443
c34b1796 444fn spaces(wr: &mut fmt::Write, mut n: usize) -> EncodeResult {
1a4d82fc
JJ
445 const BUF: &'static str = " ";
446
447 while n >= BUF.len() {
448 try!(wr.write_str(BUF));
449 n -= BUF.len();
450 }
451
452 if n > 0 {
85aaf69f 453 try!(wr.write_str(&BUF[..n]));
1a4d82fc 454 }
85aaf69f 455 Ok(())
1a4d82fc
JJ
456}
457
458fn fmt_number_or_null(v: f64) -> string::String {
459 match v.classify() {
460 Fp::Nan | Fp::Infinite => string::String::from_str("null"),
9346a6ac
AL
461 _ if v.fract() != 0f64 => v.to_string(),
462 _ => v.to_string() + ".0",
1a4d82fc
JJ
463 }
464}
465
466/// A structure for implementing serialization to JSON.
467pub struct Encoder<'a> {
85aaf69f
SL
468 writer: &'a mut (fmt::Write+'a),
469 is_emitting_map_key: bool,
1a4d82fc
JJ
470}
471
472impl<'a> Encoder<'a> {
473 /// Creates a new JSON encoder whose output will be written to the writer
474 /// specified.
85aaf69f
SL
475 pub fn new(writer: &'a mut fmt::Write) -> Encoder<'a> {
476 Encoder { writer: writer, is_emitting_map_key: false, }
477 }
478}
479
480macro_rules! emit_enquoted_if_mapkey {
481 ($enc:ident,$e:expr) => {
482 if $enc.is_emitting_map_key {
483 try!(write!($enc.writer, "\"{}\"", $e));
484 Ok(())
485 } else {
486 try!(write!($enc.writer, "{}", $e));
487 Ok(())
488 }
1a4d82fc
JJ
489 }
490}
491
492impl<'a> ::Encoder for Encoder<'a> {
85aaf69f 493 type Error = EncoderError;
1a4d82fc 494
85aaf69f
SL
495 fn emit_nil(&mut self) -> EncodeResult {
496 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
497 try!(write!(self.writer, "null"));
498 Ok(())
499 }
1a4d82fc 500
c34b1796 501 fn emit_uint(&mut self, v: usize) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) }
85aaf69f
SL
502 fn emit_u64(&mut self, v: u64) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) }
503 fn emit_u32(&mut self, v: u32) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) }
504 fn emit_u16(&mut self, v: u16) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) }
505 fn emit_u8(&mut self, v: u8) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) }
1a4d82fc 506
c34b1796 507 fn emit_int(&mut self, v: isize) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) }
85aaf69f
SL
508 fn emit_i64(&mut self, v: i64) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) }
509 fn emit_i32(&mut self, v: i32) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) }
510 fn emit_i16(&mut self, v: i16) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) }
511 fn emit_i8(&mut self, v: i8) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) }
1a4d82fc
JJ
512
513 fn emit_bool(&mut self, v: bool) -> EncodeResult {
85aaf69f 514 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
1a4d82fc 515 if v {
85aaf69f 516 try!(write!(self.writer, "true"));
1a4d82fc 517 } else {
85aaf69f 518 try!(write!(self.writer, "false"));
1a4d82fc 519 }
85aaf69f 520 Ok(())
1a4d82fc
JJ
521 }
522
523 fn emit_f64(&mut self, v: f64) -> EncodeResult {
85aaf69f 524 emit_enquoted_if_mapkey!(self, fmt_number_or_null(v))
1a4d82fc
JJ
525 }
526 fn emit_f32(&mut self, v: f32) -> EncodeResult {
527 self.emit_f64(v as f64)
528 }
529
530 fn emit_char(&mut self, v: char) -> EncodeResult {
531 escape_char(self.writer, v)
532 }
533 fn emit_str(&mut self, v: &str) -> EncodeResult {
534 escape_str(self.writer, v)
535 }
536
537 fn emit_enum<F>(&mut self, _name: &str, f: F) -> EncodeResult where
538 F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
539 {
540 f(self)
541 }
542
543 fn emit_enum_variant<F>(&mut self,
544 name: &str,
c34b1796
AL
545 _id: usize,
546 cnt: usize,
1a4d82fc
JJ
547 f: F) -> EncodeResult where
548 F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
549 {
550 // enums are encoded as strings or objects
551 // Bunny => "Bunny"
552 // Kangaroo(34,"William") => {"variant": "Kangaroo", "fields": [34,"William"]}
553 if cnt == 0 {
554 escape_str(self.writer, name)
555 } else {
85aaf69f 556 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
1a4d82fc
JJ
557 try!(write!(self.writer, "{{\"variant\":"));
558 try!(escape_str(self.writer, name));
559 try!(write!(self.writer, ",\"fields\":["));
560 try!(f(self));
85aaf69f
SL
561 try!(write!(self.writer, "]}}"));
562 Ok(())
1a4d82fc
JJ
563 }
564 }
565
c34b1796 566 fn emit_enum_variant_arg<F>(&mut self, idx: usize, f: F) -> EncodeResult where
1a4d82fc
JJ
567 F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
568 {
85aaf69f 569 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
1a4d82fc
JJ
570 if idx != 0 {
571 try!(write!(self.writer, ","));
572 }
573 f(self)
574 }
575
576 fn emit_enum_struct_variant<F>(&mut self,
577 name: &str,
c34b1796
AL
578 id: usize,
579 cnt: usize,
1a4d82fc
JJ
580 f: F) -> EncodeResult where
581 F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
582 {
85aaf69f 583 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
1a4d82fc
JJ
584 self.emit_enum_variant(name, id, cnt, f)
585 }
586
587 fn emit_enum_struct_variant_field<F>(&mut self,
588 _: &str,
c34b1796 589 idx: usize,
1a4d82fc
JJ
590 f: F) -> EncodeResult where
591 F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
592 {
85aaf69f 593 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
1a4d82fc
JJ
594 self.emit_enum_variant_arg(idx, f)
595 }
596
c34b1796 597 fn emit_struct<F>(&mut self, _: &str, _: usize, f: F) -> EncodeResult where
1a4d82fc
JJ
598 F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
599 {
85aaf69f 600 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
1a4d82fc
JJ
601 try!(write!(self.writer, "{{"));
602 try!(f(self));
85aaf69f
SL
603 try!(write!(self.writer, "}}"));
604 Ok(())
1a4d82fc
JJ
605 }
606
c34b1796 607 fn emit_struct_field<F>(&mut self, name: &str, idx: usize, f: F) -> EncodeResult where
1a4d82fc
JJ
608 F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
609 {
85aaf69f 610 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
1a4d82fc
JJ
611 if idx != 0 { try!(write!(self.writer, ",")); }
612 try!(escape_str(self.writer, name));
613 try!(write!(self.writer, ":"));
614 f(self)
615 }
616
c34b1796 617 fn emit_tuple<F>(&mut self, len: usize, f: F) -> EncodeResult where
1a4d82fc
JJ
618 F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
619 {
85aaf69f 620 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
1a4d82fc
JJ
621 self.emit_seq(len, f)
622 }
c34b1796 623 fn emit_tuple_arg<F>(&mut self, idx: usize, f: F) -> EncodeResult where
1a4d82fc
JJ
624 F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
625 {
85aaf69f 626 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
1a4d82fc
JJ
627 self.emit_seq_elt(idx, f)
628 }
629
c34b1796 630 fn emit_tuple_struct<F>(&mut self, _name: &str, len: usize, f: F) -> EncodeResult where
1a4d82fc
JJ
631 F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
632 {
85aaf69f 633 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
1a4d82fc
JJ
634 self.emit_seq(len, f)
635 }
c34b1796 636 fn emit_tuple_struct_arg<F>(&mut self, idx: usize, f: F) -> EncodeResult where
1a4d82fc
JJ
637 F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
638 {
85aaf69f 639 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
1a4d82fc
JJ
640 self.emit_seq_elt(idx, f)
641 }
642
643 fn emit_option<F>(&mut self, f: F) -> EncodeResult where
644 F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
645 {
85aaf69f 646 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
1a4d82fc
JJ
647 f(self)
648 }
85aaf69f
SL
649 fn emit_option_none(&mut self) -> EncodeResult {
650 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
651 self.emit_nil()
652 }
1a4d82fc
JJ
653 fn emit_option_some<F>(&mut self, f: F) -> EncodeResult where
654 F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
655 {
85aaf69f 656 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
1a4d82fc
JJ
657 f(self)
658 }
659
c34b1796 660 fn emit_seq<F>(&mut self, _len: usize, f: F) -> EncodeResult where
1a4d82fc
JJ
661 F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
662 {
85aaf69f 663 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
1a4d82fc
JJ
664 try!(write!(self.writer, "["));
665 try!(f(self));
85aaf69f
SL
666 try!(write!(self.writer, "]"));
667 Ok(())
1a4d82fc
JJ
668 }
669
c34b1796 670 fn emit_seq_elt<F>(&mut self, idx: usize, f: F) -> EncodeResult where
1a4d82fc
JJ
671 F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
672 {
85aaf69f 673 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
1a4d82fc
JJ
674 if idx != 0 {
675 try!(write!(self.writer, ","));
676 }
677 f(self)
678 }
679
c34b1796 680 fn emit_map<F>(&mut self, _len: usize, f: F) -> EncodeResult where
1a4d82fc
JJ
681 F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
682 {
85aaf69f 683 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
1a4d82fc
JJ
684 try!(write!(self.writer, "{{"));
685 try!(f(self));
85aaf69f
SL
686 try!(write!(self.writer, "}}"));
687 Ok(())
1a4d82fc
JJ
688 }
689
c34b1796 690 fn emit_map_elt_key<F>(&mut self, idx: usize, f: F) -> EncodeResult where
85aaf69f 691 F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
1a4d82fc 692 {
85aaf69f 693 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
1a4d82fc 694 if idx != 0 { try!(write!(self.writer, ",")) }
85aaf69f 695 self.is_emitting_map_key = true;
1a4d82fc 696 try!(f(self));
85aaf69f 697 self.is_emitting_map_key = false;
1a4d82fc
JJ
698 Ok(())
699 }
700
c34b1796 701 fn emit_map_elt_val<F>(&mut self, _idx: usize, f: F) -> EncodeResult where
1a4d82fc
JJ
702 F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
703 {
85aaf69f 704 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
1a4d82fc
JJ
705 try!(write!(self.writer, ":"));
706 f(self)
707 }
708}
709
710/// Another encoder for JSON, but prints out human-readable JSON instead of
711/// compact data
712pub struct PrettyEncoder<'a> {
85aaf69f 713 writer: &'a mut (fmt::Write+'a),
c34b1796
AL
714 curr_indent: usize,
715 indent: usize,
85aaf69f 716 is_emitting_map_key: bool,
1a4d82fc
JJ
717}
718
719impl<'a> PrettyEncoder<'a> {
720 /// Creates a new encoder whose output will be written to the specified writer
85aaf69f
SL
721 pub fn new(writer: &'a mut fmt::Write) -> PrettyEncoder<'a> {
722 PrettyEncoder {
723 writer: writer,
724 curr_indent: 0,
725 indent: 2,
726 is_emitting_map_key: false,
727 }
1a4d82fc
JJ
728 }
729
730 /// Set the number of spaces to indent for each level.
731 /// This is safe to set during encoding.
c34b1796 732 pub fn set_indent(&mut self, indent: usize) {
1a4d82fc
JJ
733 // self.indent very well could be 0 so we need to use checked division.
734 let level = self.curr_indent.checked_div(self.indent).unwrap_or(0);
735 self.indent = indent;
736 self.curr_indent = level * self.indent;
737 }
738}
739
740impl<'a> ::Encoder for PrettyEncoder<'a> {
85aaf69f 741 type Error = EncoderError;
1a4d82fc 742
85aaf69f
SL
743 fn emit_nil(&mut self) -> EncodeResult {
744 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
745 try!(write!(self.writer, "null"));
746 Ok(())
747 }
1a4d82fc 748
c34b1796 749 fn emit_uint(&mut self, v: usize) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) }
85aaf69f
SL
750 fn emit_u64(&mut self, v: u64) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) }
751 fn emit_u32(&mut self, v: u32) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) }
752 fn emit_u16(&mut self, v: u16) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) }
753 fn emit_u8(&mut self, v: u8) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) }
1a4d82fc 754
c34b1796 755 fn emit_int(&mut self, v: isize) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) }
85aaf69f
SL
756 fn emit_i64(&mut self, v: i64) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) }
757 fn emit_i32(&mut self, v: i32) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) }
758 fn emit_i16(&mut self, v: i16) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) }
759 fn emit_i8(&mut self, v: i8) -> EncodeResult { emit_enquoted_if_mapkey!(self, v) }
1a4d82fc
JJ
760
761 fn emit_bool(&mut self, v: bool) -> EncodeResult {
85aaf69f 762 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
1a4d82fc 763 if v {
85aaf69f 764 try!(write!(self.writer, "true"));
1a4d82fc 765 } else {
85aaf69f 766 try!(write!(self.writer, "false"));
1a4d82fc 767 }
85aaf69f 768 Ok(())
1a4d82fc
JJ
769 }
770
771 fn emit_f64(&mut self, v: f64) -> EncodeResult {
85aaf69f 772 emit_enquoted_if_mapkey!(self, fmt_number_or_null(v))
1a4d82fc
JJ
773 }
774 fn emit_f32(&mut self, v: f32) -> EncodeResult {
775 self.emit_f64(v as f64)
776 }
777
778 fn emit_char(&mut self, v: char) -> EncodeResult {
779 escape_char(self.writer, v)
780 }
781 fn emit_str(&mut self, v: &str) -> EncodeResult {
782 escape_str(self.writer, v)
783 }
784
785 fn emit_enum<F>(&mut self, _name: &str, f: F) -> EncodeResult where
786 F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
787 {
788 f(self)
789 }
790
791 fn emit_enum_variant<F>(&mut self,
792 name: &str,
c34b1796
AL
793 _id: usize,
794 cnt: usize,
1a4d82fc
JJ
795 f: F)
796 -> EncodeResult where
797 F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
798 {
799 if cnt == 0 {
800 escape_str(self.writer, name)
801 } else {
85aaf69f 802 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
1a4d82fc
JJ
803 try!(write!(self.writer, "{{\n"));
804 self.curr_indent += self.indent;
805 try!(spaces(self.writer, self.curr_indent));
806 try!(write!(self.writer, "\"variant\": "));
807 try!(escape_str(self.writer, name));
808 try!(write!(self.writer, ",\n"));
809 try!(spaces(self.writer, self.curr_indent));
810 try!(write!(self.writer, "\"fields\": [\n"));
811 self.curr_indent += self.indent;
812 try!(f(self));
813 self.curr_indent -= self.indent;
814 try!(write!(self.writer, "\n"));
815 try!(spaces(self.writer, self.curr_indent));
816 self.curr_indent -= self.indent;
817 try!(write!(self.writer, "]\n"));
818 try!(spaces(self.writer, self.curr_indent));
85aaf69f
SL
819 try!(write!(self.writer, "}}"));
820 Ok(())
1a4d82fc
JJ
821 }
822 }
823
c34b1796 824 fn emit_enum_variant_arg<F>(&mut self, idx: usize, f: F) -> EncodeResult where
1a4d82fc
JJ
825 F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
826 {
85aaf69f 827 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
1a4d82fc
JJ
828 if idx != 0 {
829 try!(write!(self.writer, ",\n"));
830 }
831 try!(spaces(self.writer, self.curr_indent));
832 f(self)
833 }
834
835 fn emit_enum_struct_variant<F>(&mut self,
836 name: &str,
c34b1796
AL
837 id: usize,
838 cnt: usize,
1a4d82fc
JJ
839 f: F) -> EncodeResult where
840 F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
841 {
85aaf69f 842 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
1a4d82fc
JJ
843 self.emit_enum_variant(name, id, cnt, f)
844 }
845
846 fn emit_enum_struct_variant_field<F>(&mut self,
847 _: &str,
c34b1796 848 idx: usize,
1a4d82fc
JJ
849 f: F) -> EncodeResult where
850 F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
851 {
85aaf69f 852 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
1a4d82fc
JJ
853 self.emit_enum_variant_arg(idx, f)
854 }
855
856
c34b1796 857 fn emit_struct<F>(&mut self, _: &str, len: usize, f: F) -> EncodeResult where
1a4d82fc
JJ
858 F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
859 {
85aaf69f 860 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
1a4d82fc 861 if len == 0 {
85aaf69f 862 try!(write!(self.writer, "{{}}"));
1a4d82fc
JJ
863 } else {
864 try!(write!(self.writer, "{{"));
865 self.curr_indent += self.indent;
866 try!(f(self));
867 self.curr_indent -= self.indent;
868 try!(write!(self.writer, "\n"));
869 try!(spaces(self.writer, self.curr_indent));
85aaf69f 870 try!(write!(self.writer, "}}"));
1a4d82fc 871 }
85aaf69f 872 Ok(())
1a4d82fc
JJ
873 }
874
c34b1796 875 fn emit_struct_field<F>(&mut self, name: &str, idx: usize, f: F) -> EncodeResult where
1a4d82fc
JJ
876 F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
877 {
85aaf69f 878 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
1a4d82fc
JJ
879 if idx == 0 {
880 try!(write!(self.writer, "\n"));
881 } else {
882 try!(write!(self.writer, ",\n"));
883 }
884 try!(spaces(self.writer, self.curr_indent));
885 try!(escape_str(self.writer, name));
886 try!(write!(self.writer, ": "));
887 f(self)
888 }
889
c34b1796 890 fn emit_tuple<F>(&mut self, len: usize, f: F) -> EncodeResult where
1a4d82fc
JJ
891 F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
892 {
85aaf69f 893 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
1a4d82fc
JJ
894 self.emit_seq(len, f)
895 }
c34b1796 896 fn emit_tuple_arg<F>(&mut self, idx: usize, f: F) -> EncodeResult where
1a4d82fc
JJ
897 F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
898 {
85aaf69f 899 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
1a4d82fc
JJ
900 self.emit_seq_elt(idx, f)
901 }
902
c34b1796 903 fn emit_tuple_struct<F>(&mut self, _: &str, len: usize, f: F) -> EncodeResult where
1a4d82fc
JJ
904 F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
905 {
85aaf69f 906 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
1a4d82fc
JJ
907 self.emit_seq(len, f)
908 }
c34b1796 909 fn emit_tuple_struct_arg<F>(&mut self, idx: usize, f: F) -> EncodeResult where
1a4d82fc
JJ
910 F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
911 {
85aaf69f 912 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
1a4d82fc
JJ
913 self.emit_seq_elt(idx, f)
914 }
915
916 fn emit_option<F>(&mut self, f: F) -> EncodeResult where
917 F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
918 {
85aaf69f 919 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
1a4d82fc
JJ
920 f(self)
921 }
85aaf69f
SL
922 fn emit_option_none(&mut self) -> EncodeResult {
923 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
924 self.emit_nil()
925 }
1a4d82fc
JJ
926 fn emit_option_some<F>(&mut self, f: F) -> EncodeResult where
927 F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
928 {
85aaf69f 929 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
1a4d82fc
JJ
930 f(self)
931 }
932
c34b1796 933 fn emit_seq<F>(&mut self, len: usize, f: F) -> EncodeResult where
1a4d82fc
JJ
934 F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
935 {
85aaf69f 936 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
1a4d82fc 937 if len == 0 {
85aaf69f 938 try!(write!(self.writer, "[]"));
1a4d82fc
JJ
939 } else {
940 try!(write!(self.writer, "["));
941 self.curr_indent += self.indent;
942 try!(f(self));
943 self.curr_indent -= self.indent;
944 try!(write!(self.writer, "\n"));
945 try!(spaces(self.writer, self.curr_indent));
85aaf69f 946 try!(write!(self.writer, "]"));
1a4d82fc 947 }
85aaf69f 948 Ok(())
1a4d82fc
JJ
949 }
950
c34b1796 951 fn emit_seq_elt<F>(&mut self, idx: usize, f: F) -> EncodeResult where
1a4d82fc
JJ
952 F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
953 {
85aaf69f 954 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
1a4d82fc
JJ
955 if idx == 0 {
956 try!(write!(self.writer, "\n"));
957 } else {
958 try!(write!(self.writer, ",\n"));
959 }
960 try!(spaces(self.writer, self.curr_indent));
961 f(self)
962 }
963
c34b1796 964 fn emit_map<F>(&mut self, len: usize, f: F) -> EncodeResult where
1a4d82fc
JJ
965 F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
966 {
85aaf69f 967 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
1a4d82fc 968 if len == 0 {
85aaf69f 969 try!(write!(self.writer, "{{}}"));
1a4d82fc
JJ
970 } else {
971 try!(write!(self.writer, "{{"));
972 self.curr_indent += self.indent;
973 try!(f(self));
974 self.curr_indent -= self.indent;
975 try!(write!(self.writer, "\n"));
976 try!(spaces(self.writer, self.curr_indent));
85aaf69f 977 try!(write!(self.writer, "}}"));
1a4d82fc 978 }
85aaf69f 979 Ok(())
1a4d82fc
JJ
980 }
981
c34b1796 982 fn emit_map_elt_key<F>(&mut self, idx: usize, f: F) -> EncodeResult where
85aaf69f 983 F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
1a4d82fc 984 {
85aaf69f 985 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
1a4d82fc
JJ
986 if idx == 0 {
987 try!(write!(self.writer, "\n"));
988 } else {
989 try!(write!(self.writer, ",\n"));
990 }
991 try!(spaces(self.writer, self.curr_indent));
85aaf69f 992 self.is_emitting_map_key = true;
1a4d82fc 993 try!(f(self));
85aaf69f 994 self.is_emitting_map_key = false;
1a4d82fc
JJ
995 Ok(())
996 }
997
c34b1796 998 fn emit_map_elt_val<F>(&mut self, _idx: usize, f: F) -> EncodeResult where
1a4d82fc
JJ
999 F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult,
1000 {
85aaf69f 1001 if self.is_emitting_map_key { return Err(EncoderError::BadHashmapKey); }
1a4d82fc
JJ
1002 try!(write!(self.writer, ": "));
1003 f(self)
1004 }
1005}
1006
1007impl Encodable for Json {
1008 fn encode<E: ::Encoder>(&self, e: &mut E) -> Result<(), E::Error> {
1009 match *self {
1010 Json::I64(v) => v.encode(e),
1011 Json::U64(v) => v.encode(e),
1012 Json::F64(v) => v.encode(e),
1013 Json::String(ref v) => v.encode(e),
1014 Json::Boolean(v) => v.encode(e),
1015 Json::Array(ref v) => v.encode(e),
1016 Json::Object(ref v) => v.encode(e),
1017 Json::Null => e.emit_nil(),
1018 }
1019 }
1020}
1021
1022/// Create an `AsJson` wrapper which can be used to print a value as JSON
1023/// on-the-fly via `write!`
1024pub fn as_json<T>(t: &T) -> AsJson<T> {
1025 AsJson { inner: t }
1026}
1027
1028/// Create an `AsPrettyJson` wrapper which can be used to print a value as JSON
1029/// on-the-fly via `write!`
1030pub fn as_pretty_json<T>(t: &T) -> AsPrettyJson<T> {
1031 AsPrettyJson { inner: t, indent: None }
1032}
1033
1034impl Json {
1035 /// Borrow this json object as a pretty object to generate a pretty
85aaf69f 1036 /// representation for it via `Display`.
1a4d82fc
JJ
1037 pub fn pretty(&self) -> PrettyJson {
1038 PrettyJson { inner: self }
1039 }
1040
1041 /// If the Json value is an Object, returns the value associated with the provided key.
1042 /// Otherwise, returns None.
1043 pub fn find<'a>(&'a self, key: &str) -> Option<&'a Json>{
1044 match self {
1045 &Json::Object(ref map) => map.get(key),
1046 _ => None
1047 }
1048 }
1049
1050 /// Attempts to get a nested Json Object for each key in `keys`.
1051 /// If any key is found not to exist, find_path will return None.
1052 /// Otherwise, it will return the Json value associated with the final key.
1053 pub fn find_path<'a>(&'a self, keys: &[&str]) -> Option<&'a Json>{
1054 let mut target = self;
85aaf69f 1055 for key in keys {
1a4d82fc
JJ
1056 match target.find(*key) {
1057 Some(t) => { target = t; },
1058 None => return None
1059 }
1060 }
1061 Some(target)
1062 }
1063
1064 /// If the Json value is an Object, performs a depth-first search until
1065 /// a value associated with the provided key is found. If no value is found
1066 /// or the Json value is not an Object, returns None.
1067 pub fn search<'a>(&'a self, key: &str) -> Option<&'a Json> {
1068 match self {
1069 &Json::Object(ref map) => {
1070 match map.get(key) {
1071 Some(json_value) => Some(json_value),
1072 None => {
85aaf69f 1073 for (_, v) in map {
1a4d82fc
JJ
1074 match v.search(key) {
1075 x if x.is_some() => return x,
1076 _ => ()
1077 }
1078 }
1079 None
1080 }
1081 }
1082 },
1083 _ => None
1084 }
1085 }
1086
1087 /// Returns true if the Json value is an Object. Returns false otherwise.
1088 pub fn is_object<'a>(&'a self) -> bool {
1089 self.as_object().is_some()
1090 }
1091
1092 /// If the Json value is an Object, returns the associated BTreeMap.
1093 /// Returns None otherwise.
1094 pub fn as_object<'a>(&'a self) -> Option<&'a Object> {
1095 match self {
1096 &Json::Object(ref map) => Some(map),
1097 _ => None
1098 }
1099 }
1100
1101 /// Returns true if the Json value is an Array. Returns false otherwise.
1102 pub fn is_array<'a>(&'a self) -> bool {
1103 self.as_array().is_some()
1104 }
1105
1106 /// If the Json value is an Array, returns the associated vector.
1107 /// Returns None otherwise.
1108 pub fn as_array<'a>(&'a self) -> Option<&'a Array> {
1109 match self {
1110 &Json::Array(ref array) => Some(&*array),
1111 _ => None
1112 }
1113 }
1114
1115 /// Returns true if the Json value is a String. Returns false otherwise.
1116 pub fn is_string<'a>(&'a self) -> bool {
1117 self.as_string().is_some()
1118 }
1119
1120 /// If the Json value is a String, returns the associated str.
1121 /// Returns None otherwise.
1122 pub fn as_string<'a>(&'a self) -> Option<&'a str> {
1123 match *self {
85aaf69f 1124 Json::String(ref s) => Some(&s[..]),
1a4d82fc
JJ
1125 _ => None
1126 }
1127 }
1128
1129 /// Returns true if the Json value is a Number. Returns false otherwise.
1130 pub fn is_number(&self) -> bool {
1131 match *self {
1132 Json::I64(_) | Json::U64(_) | Json::F64(_) => true,
1133 _ => false,
1134 }
1135 }
1136
1137 /// Returns true if the Json value is a i64. Returns false otherwise.
1138 pub fn is_i64(&self) -> bool {
1139 match *self {
1140 Json::I64(_) => true,
1141 _ => false,
1142 }
1143 }
1144
1145 /// Returns true if the Json value is a u64. Returns false otherwise.
1146 pub fn is_u64(&self) -> bool {
1147 match *self {
1148 Json::U64(_) => true,
1149 _ => false,
1150 }
1151 }
1152
1153 /// Returns true if the Json value is a f64. Returns false otherwise.
1154 pub fn is_f64(&self) -> bool {
1155 match *self {
1156 Json::F64(_) => true,
1157 _ => false,
1158 }
1159 }
1160
1161 /// If the Json value is a number, return or cast it to a i64.
1162 /// Returns None otherwise.
1163 pub fn as_i64(&self) -> Option<i64> {
1164 match *self {
1165 Json::I64(n) => Some(n),
9346a6ac 1166 Json::U64(n) => Some(n as i64),
1a4d82fc
JJ
1167 _ => None
1168 }
1169 }
1170
1171 /// If the Json value is a number, return or cast it to a u64.
1172 /// Returns None otherwise.
1173 pub fn as_u64(&self) -> Option<u64> {
1174 match *self {
9346a6ac 1175 Json::I64(n) => Some(n as u64),
1a4d82fc
JJ
1176 Json::U64(n) => Some(n),
1177 _ => None
1178 }
1179 }
1180
1181 /// If the Json value is a number, return or cast it to a f64.
1182 /// Returns None otherwise.
1183 pub fn as_f64(&self) -> Option<f64> {
1184 match *self {
9346a6ac
AL
1185 Json::I64(n) => Some(n as f64),
1186 Json::U64(n) => Some(n as f64),
1a4d82fc
JJ
1187 Json::F64(n) => Some(n),
1188 _ => None
1189 }
1190 }
1191
1192 /// Returns true if the Json value is a Boolean. Returns false otherwise.
1193 pub fn is_boolean(&self) -> bool {
1194 self.as_boolean().is_some()
1195 }
1196
1197 /// If the Json value is a Boolean, returns the associated bool.
1198 /// Returns None otherwise.
1199 pub fn as_boolean(&self) -> Option<bool> {
1200 match self {
1201 &Json::Boolean(b) => Some(b),
1202 _ => None
1203 }
1204 }
1205
1206 /// Returns true if the Json value is a Null. Returns false otherwise.
1207 pub fn is_null(&self) -> bool {
1208 self.as_null().is_some()
1209 }
1210
1211 /// If the Json value is a Null, returns ().
1212 /// Returns None otherwise.
1213 pub fn as_null(&self) -> Option<()> {
1214 match self {
1215 &Json::Null => Some(()),
1216 _ => None
1217 }
1218 }
1219}
1220
1221impl<'a> Index<&'a str> for Json {
1222 type Output = Json;
1223
c34b1796
AL
1224 fn index(&self, idx: &'a str) -> &Json {
1225 self.find(idx).unwrap()
1a4d82fc
JJ
1226 }
1227}
1228
c34b1796 1229impl Index<usize> for Json {
1a4d82fc
JJ
1230 type Output = Json;
1231
c34b1796 1232 fn index<'a>(&'a self, idx: usize) -> &'a Json {
1a4d82fc 1233 match self {
c34b1796
AL
1234 &Json::Array(ref v) => &v[idx],
1235 _ => panic!("can only index Json with usize if it is an array")
1a4d82fc
JJ
1236 }
1237 }
1238}
1239
1240/// The output of the streaming parser.
85aaf69f 1241#[derive(PartialEq, Clone, Debug)]
1a4d82fc
JJ
1242pub enum JsonEvent {
1243 ObjectStart,
1244 ObjectEnd,
1245 ArrayStart,
1246 ArrayEnd,
1247 BooleanValue(bool),
1248 I64Value(i64),
1249 U64Value(u64),
1250 F64Value(f64),
1251 StringValue(string::String),
1252 NullValue,
1253 Error(ParserError),
1254}
1255
85aaf69f 1256#[derive(PartialEq, Debug)]
1a4d82fc
JJ
1257enum ParserState {
1258 // Parse a value in an array, true means first element.
1259 ParseArray(bool),
1260 // Parse ',' or ']' after an element in an array.
1261 ParseArrayComma,
1262 // Parse a key:value in an object, true means first element.
1263 ParseObject(bool),
1264 // Parse ',' or ']' after an element in an object.
1265 ParseObjectComma,
1266 // Initial state.
1267 ParseStart,
1268 // Expecting the stream to end.
1269 ParseBeforeFinish,
1270 // Parsing can't continue.
1271 ParseFinished,
1272}
1273
1274/// A Stack represents the current position of the parser in the logical
1275/// structure of the JSON stream.
1276/// For example foo.bar[3].x
1277pub struct Stack {
1278 stack: Vec<InternalStackElement>,
1279 str_buffer: Vec<u8>,
1280}
1281
1282/// StackElements compose a Stack.
1283/// For example, StackElement::Key("foo"), StackElement::Key("bar"),
1284/// StackElement::Index(3) and StackElement::Key("x") are the
1285/// StackElements compositing the stack that represents foo.bar[3].x
85aaf69f 1286#[derive(PartialEq, Clone, Debug)]
1a4d82fc
JJ
1287pub enum StackElement<'l> {
1288 Index(u32),
1289 Key(&'l str),
1290}
1291
1292// Internally, Key elements are stored as indices in a buffer to avoid
1293// allocating a string for every member of an object.
85aaf69f 1294#[derive(PartialEq, Clone, Debug)]
1a4d82fc
JJ
1295enum InternalStackElement {
1296 InternalIndex(u32),
1297 InternalKey(u16, u16), // start, size
1298}
1299
1300impl Stack {
1301 pub fn new() -> Stack {
1302 Stack { stack: Vec::new(), str_buffer: Vec::new() }
1303 }
1304
1305 /// Returns The number of elements in the Stack.
c34b1796 1306 pub fn len(&self) -> usize { self.stack.len() }
1a4d82fc
JJ
1307
1308 /// Returns true if the stack is empty.
1309 pub fn is_empty(&self) -> bool { self.stack.is_empty() }
1310
1311 /// Provides access to the StackElement at a given index.
1312 /// lower indices are at the bottom of the stack while higher indices are
1313 /// at the top.
c34b1796 1314 pub fn get<'l>(&'l self, idx: usize) -> StackElement<'l> {
1a4d82fc
JJ
1315 match self.stack[idx] {
1316 InternalIndex(i) => StackElement::Index(i),
1317 InternalKey(start, size) => {
1318 StackElement::Key(str::from_utf8(
c34b1796 1319 &self.str_buffer[start as usize .. start as usize + size as usize])
1a4d82fc
JJ
1320 .unwrap())
1321 }
1322 }
1323 }
1324
1325 /// Compares this stack with an array of StackElements.
1326 pub fn is_equal_to(&self, rhs: &[StackElement]) -> bool {
1327 if self.stack.len() != rhs.len() { return false; }
85aaf69f 1328 for i in 0..rhs.len() {
1a4d82fc
JJ
1329 if self.get(i) != rhs[i] { return false; }
1330 }
1331 return true;
1332 }
1333
1334 /// Returns true if the bottom-most elements of this stack are the same as
1335 /// the ones passed as parameter.
1336 pub fn starts_with(&self, rhs: &[StackElement]) -> bool {
1337 if self.stack.len() < rhs.len() { return false; }
85aaf69f 1338 for i in 0..rhs.len() {
1a4d82fc
JJ
1339 if self.get(i) != rhs[i] { return false; }
1340 }
1341 return true;
1342 }
1343
1344 /// Returns true if the top-most elements of this stack are the same as
1345 /// the ones passed as parameter.
1346 pub fn ends_with(&self, rhs: &[StackElement]) -> bool {
1347 if self.stack.len() < rhs.len() { return false; }
1348 let offset = self.stack.len() - rhs.len();
85aaf69f 1349 for i in 0..rhs.len() {
1a4d82fc
JJ
1350 if self.get(i + offset) != rhs[i] { return false; }
1351 }
1352 return true;
1353 }
1354
1355 /// Returns the top-most element (if any).
1356 pub fn top<'l>(&'l self) -> Option<StackElement<'l>> {
1357 return match self.stack.last() {
1358 None => None,
1359 Some(&InternalIndex(i)) => Some(StackElement::Index(i)),
1360 Some(&InternalKey(start, size)) => {
1361 Some(StackElement::Key(str::from_utf8(
c34b1796 1362 &self.str_buffer[start as usize .. (start+size) as usize]
1a4d82fc
JJ
1363 ).unwrap()))
1364 }
1365 }
1366 }
1367
1368 // Used by Parser to insert StackElement::Key elements at the top of the stack.
1369 fn push_key(&mut self, key: string::String) {
1370 self.stack.push(InternalKey(self.str_buffer.len() as u16, key.len() as u16));
85aaf69f 1371 for c in key.as_bytes() {
1a4d82fc
JJ
1372 self.str_buffer.push(*c);
1373 }
1374 }
1375
1376 // Used by Parser to insert StackElement::Index elements at the top of the stack.
1377 fn push_index(&mut self, index: u32) {
1378 self.stack.push(InternalIndex(index));
1379 }
1380
1381 // Used by Parser to remove the top-most element of the stack.
1382 fn pop(&mut self) {
1383 assert!(!self.is_empty());
1384 match *self.stack.last().unwrap() {
1385 InternalKey(_, sz) => {
c34b1796 1386 let new_size = self.str_buffer.len() - sz as usize;
1a4d82fc
JJ
1387 self.str_buffer.truncate(new_size);
1388 }
1389 InternalIndex(_) => {}
1390 }
1391 self.stack.pop();
1392 }
1393
1394 // Used by Parser to test whether the top-most element is an index.
1395 fn last_is_index(&self) -> bool {
1396 if self.is_empty() { return false; }
1397 return match *self.stack.last().unwrap() {
1398 InternalIndex(_) => true,
1399 _ => false,
1400 }
1401 }
1402
1403 // Used by Parser to increment the index of the top-most element.
1404 fn bump_index(&mut self) {
1405 let len = self.stack.len();
1406 let idx = match *self.stack.last().unwrap() {
1407 InternalIndex(i) => { i + 1 }
1408 _ => { panic!(); }
1409 };
1410 self.stack[len - 1] = InternalIndex(idx);
1411 }
1412}
1413
1414/// A streaming JSON parser implemented as an iterator of JsonEvent, consuming
1415/// an iterator of char.
1416pub struct Parser<T> {
1417 rdr: T,
1418 ch: Option<char>,
c34b1796
AL
1419 line: usize,
1420 col: usize,
1a4d82fc
JJ
1421 // We maintain a stack representing where we are in the logical structure
1422 // of the JSON stream.
1423 stack: Stack,
1424 // A state machine is kept to make it possible to interrupt and resume parsing.
1425 state: ParserState,
1426}
1427
1428impl<T: Iterator<Item=char>> Iterator for Parser<T> {
1429 type Item = JsonEvent;
1430
1431 fn next(&mut self) -> Option<JsonEvent> {
1432 if self.state == ParseFinished {
1433 return None;
1434 }
1435
1436 if self.state == ParseBeforeFinish {
1437 self.parse_whitespace();
1438 // Make sure there is no trailing characters.
1439 if self.eof() {
1440 self.state = ParseFinished;
1441 return None;
1442 } else {
1443 return Some(self.error_event(TrailingCharacters));
1444 }
1445 }
1446
1447 return Some(self.parse());
1448 }
1449}
1450
1451impl<T: Iterator<Item=char>> Parser<T> {
1452 /// Creates the JSON parser.
1453 pub fn new(rdr: T) -> Parser<T> {
1454 let mut p = Parser {
1455 rdr: rdr,
1456 ch: Some('\x00'),
1457 line: 1,
1458 col: 0,
1459 stack: Stack::new(),
1460 state: ParseStart,
1461 };
1462 p.bump();
1463 return p;
1464 }
1465
1466 /// Provides access to the current position in the logical structure of the
1467 /// JSON stream.
1468 pub fn stack<'l>(&'l self) -> &'l Stack {
1469 return &self.stack;
1470 }
1471
1472 fn eof(&self) -> bool { self.ch.is_none() }
1473 fn ch_or_null(&self) -> char { self.ch.unwrap_or('\x00') }
1474 fn bump(&mut self) {
1475 self.ch = self.rdr.next();
1476
1477 if self.ch_is('\n') {
85aaf69f
SL
1478 self.line += 1;
1479 self.col = 1;
1a4d82fc 1480 } else {
85aaf69f 1481 self.col += 1;
1a4d82fc
JJ
1482 }
1483 }
1484
1485 fn next_char(&mut self) -> Option<char> {
1486 self.bump();
1487 self.ch
1488 }
1489 fn ch_is(&self, c: char) -> bool {
1490 self.ch == Some(c)
1491 }
1492
1493 fn error<U>(&self, reason: ErrorCode) -> Result<U, ParserError> {
1494 Err(SyntaxError(reason, self.line, self.col))
1495 }
1496
1497 fn parse_whitespace(&mut self) {
1498 while self.ch_is(' ') ||
1499 self.ch_is('\n') ||
1500 self.ch_is('\t') ||
1501 self.ch_is('\r') { self.bump(); }
1502 }
1503
1504 fn parse_number(&mut self) -> JsonEvent {
1505 let mut neg = false;
1506
1507 if self.ch_is('-') {
1508 self.bump();
1509 neg = true;
1510 }
1511
1512 let res = match self.parse_u64() {
1513 Ok(res) => res,
1514 Err(e) => { return Error(e); }
1515 };
1516
1517 if self.ch_is('.') || self.ch_is('e') || self.ch_is('E') {
1518 let mut res = res as f64;
1519
1520 if self.ch_is('.') {
1521 res = match self.parse_decimal(res) {
1522 Ok(res) => res,
1523 Err(e) => { return Error(e); }
1524 };
1525 }
1526
1527 if self.ch_is('e') || self.ch_is('E') {
1528 res = match self.parse_exponent(res) {
1529 Ok(res) => res,
1530 Err(e) => { return Error(e); }
1531 };
1532 }
1533
1534 if neg {
1535 res *= -1.0;
1536 }
1537
1538 F64Value(res)
1539 } else {
1540 if neg {
d9579d0f 1541 let res = (res as i64).wrapping_neg();
1a4d82fc
JJ
1542
1543 // Make sure we didn't underflow.
1544 if res > 0 {
1545 Error(SyntaxError(InvalidNumber, self.line, self.col))
1546 } else {
1547 I64Value(res)
1548 }
1549 } else {
1550 U64Value(res)
1551 }
1552 }
1553 }
1554
c34b1796 1555 #[allow(deprecated)] // possible resolve bug is mapping these to traits
1a4d82fc 1556 fn parse_u64(&mut self) -> Result<u64, ParserError> {
9346a6ac 1557 let mut accum = 0u64;
1a4d82fc
JJ
1558 let last_accum = 0; // necessary to detect overflow.
1559
1560 match self.ch_or_null() {
1561 '0' => {
1562 self.bump();
1563
1564 // A leading '0' must be the only digit before the decimal point.
1565 match self.ch_or_null() {
1566 '0' ... '9' => return self.error(InvalidNumber),
1567 _ => ()
1568 }
1569 },
1570 '1' ... '9' => {
1571 while !self.eof() {
1572 match self.ch_or_null() {
1573 c @ '0' ... '9' => {
c34b1796
AL
1574 accum = accum.wrapping_mul(10);
1575 accum = accum.wrapping_add((c as u64) - ('0' as u64));
1a4d82fc
JJ
1576
1577 // Detect overflow by comparing to the last value.
1578 if accum <= last_accum { return self.error(InvalidNumber); }
1579
1580 self.bump();
1581 }
1582 _ => break,
1583 }
1584 }
1585 }
1586 _ => return self.error(InvalidNumber),
1587 }
1588
1589 Ok(accum)
1590 }
1591
1592 fn parse_decimal(&mut self, mut res: f64) -> Result<f64, ParserError> {
1593 self.bump();
1594
1595 // Make sure a digit follows the decimal place.
1596 match self.ch_or_null() {
1597 '0' ... '9' => (),
1598 _ => return self.error(InvalidNumber)
1599 }
1600
1601 let mut dec = 1.0;
1602 while !self.eof() {
1603 match self.ch_or_null() {
1604 c @ '0' ... '9' => {
1605 dec /= 10.0;
c34b1796 1606 res += (((c as isize) - ('0' as isize)) as f64) * dec;
1a4d82fc
JJ
1607 self.bump();
1608 }
1609 _ => break,
1610 }
1611 }
1612
1613 Ok(res)
1614 }
1615
1616 fn parse_exponent(&mut self, mut res: f64) -> Result<f64, ParserError> {
1617 self.bump();
1618
85aaf69f 1619 let mut exp = 0;
1a4d82fc
JJ
1620 let mut neg_exp = false;
1621
1622 if self.ch_is('+') {
1623 self.bump();
1624 } else if self.ch_is('-') {
1625 self.bump();
1626 neg_exp = true;
1627 }
1628
1629 // Make sure a digit follows the exponent place.
1630 match self.ch_or_null() {
1631 '0' ... '9' => (),
1632 _ => return self.error(InvalidNumber)
1633 }
1634 while !self.eof() {
1635 match self.ch_or_null() {
1636 c @ '0' ... '9' => {
1637 exp *= 10;
c34b1796 1638 exp += (c as usize) - ('0' as usize);
1a4d82fc
JJ
1639
1640 self.bump();
1641 }
1642 _ => break
1643 }
1644 }
1645
1646 let exp = 10_f64.powi(exp as i32);
1647 if neg_exp {
1648 res /= exp;
1649 } else {
1650 res *= exp;
1651 }
1652
1653 Ok(res)
1654 }
1655
1656 fn decode_hex_escape(&mut self) -> Result<u16, ParserError> {
85aaf69f 1657 let mut i = 0;
c34b1796 1658 let mut n = 0;
1a4d82fc
JJ
1659 while i < 4 && !self.eof() {
1660 self.bump();
1661 n = match self.ch_or_null() {
1662 c @ '0' ... '9' => n * 16 + ((c as u16) - ('0' as u16)),
1663 'a' | 'A' => n * 16 + 10,
1664 'b' | 'B' => n * 16 + 11,
1665 'c' | 'C' => n * 16 + 12,
1666 'd' | 'D' => n * 16 + 13,
1667 'e' | 'E' => n * 16 + 14,
1668 'f' | 'F' => n * 16 + 15,
1669 _ => return self.error(InvalidEscape)
1670 };
1671
85aaf69f 1672 i += 1;
1a4d82fc
JJ
1673 }
1674
1675 // Error out if we didn't parse 4 digits.
1676 if i != 4 {
1677 return self.error(InvalidEscape);
1678 }
1679
1680 Ok(n)
1681 }
1682
1683 fn parse_str(&mut self) -> Result<string::String, ParserError> {
1684 let mut escape = false;
1685 let mut res = string::String::new();
1686
1687 loop {
1688 self.bump();
1689 if self.eof() {
1690 return self.error(EOFWhileParsingString);
1691 }
1692
1693 if escape {
1694 match self.ch_or_null() {
1695 '"' => res.push('"'),
1696 '\\' => res.push('\\'),
1697 '/' => res.push('/'),
1698 'b' => res.push('\x08'),
1699 'f' => res.push('\x0c'),
1700 'n' => res.push('\n'),
1701 'r' => res.push('\r'),
1702 't' => res.push('\t'),
1703 'u' => match try!(self.decode_hex_escape()) {
1704 0xDC00 ... 0xDFFF => {
1705 return self.error(LoneLeadingSurrogateInHexEscape)
1706 }
1707
1708 // Non-BMP characters are encoded as a sequence of
1709 // two hex escapes, representing UTF-16 surrogates.
1710 n1 @ 0xD800 ... 0xDBFF => {
1711 match (self.next_char(), self.next_char()) {
1712 (Some('\\'), Some('u')) => (),
1713 _ => return self.error(UnexpectedEndOfHexEscape),
1714 }
1715
1716 let buf = [n1, try!(self.decode_hex_escape())];
1717 match unicode_str::utf16_items(&buf).next() {
1718 Some(Utf16Item::ScalarValue(c)) => res.push(c),
1719 _ => return self.error(LoneLeadingSurrogateInHexEscape),
1720 }
1721 }
1722
1723 n => match char::from_u32(n as u32) {
1724 Some(c) => res.push(c),
1725 None => return self.error(InvalidUnicodeCodePoint),
1726 },
1727 },
1728 _ => return self.error(InvalidEscape),
1729 }
1730 escape = false;
1731 } else if self.ch_is('\\') {
1732 escape = true;
1733 } else {
1734 match self.ch {
1735 Some('"') => {
1736 self.bump();
1737 return Ok(res);
1738 },
1739 Some(c) => res.push(c),
1740 None => unreachable!()
1741 }
1742 }
1743 }
1744 }
1745
1746 // Invoked at each iteration, consumes the stream until it has enough
1747 // information to return a JsonEvent.
1748 // Manages an internal state so that parsing can be interrupted and resumed.
1749 // Also keeps track of the position in the logical structure of the json
c34b1796 1750 // stream isize the form of a stack that can be queried by the user using the
1a4d82fc
JJ
1751 // stack() method.
1752 fn parse(&mut self) -> JsonEvent {
1753 loop {
1754 // The only paths where the loop can spin a new iteration
1755 // are in the cases ParseArrayComma and ParseObjectComma if ','
1756 // is parsed. In these cases the state is set to (respectively)
1757 // ParseArray(false) and ParseObject(false), which always return,
1758 // so there is no risk of getting stuck in an infinite loop.
1759 // All other paths return before the end of the loop's iteration.
1760 self.parse_whitespace();
1761
1762 match self.state {
1763 ParseStart => {
1764 return self.parse_start();
1765 }
1766 ParseArray(first) => {
1767 return self.parse_array(first);
1768 }
1769 ParseArrayComma => {
1770 match self.parse_array_comma_or_end() {
1771 Some(evt) => { return evt; }
1772 None => {}
1773 }
1774 }
1775 ParseObject(first) => {
1776 return self.parse_object(first);
1777 }
1778 ParseObjectComma => {
1779 self.stack.pop();
1780 if self.ch_is(',') {
1781 self.state = ParseObject(false);
1782 self.bump();
1783 } else {
1784 return self.parse_object_end();
1785 }
1786 }
1787 _ => {
1788 return self.error_event(InvalidSyntax);
1789 }
1790 }
1791 }
1792 }
1793
1794 fn parse_start(&mut self) -> JsonEvent {
1795 let val = self.parse_value();
1796 self.state = match val {
1797 Error(_) => ParseFinished,
1798 ArrayStart => ParseArray(true),
1799 ObjectStart => ParseObject(true),
1800 _ => ParseBeforeFinish,
1801 };
1802 return val;
1803 }
1804
1805 fn parse_array(&mut self, first: bool) -> JsonEvent {
1806 if self.ch_is(']') {
1807 if !first {
1808 self.error_event(InvalidSyntax)
1809 } else {
1810 self.state = if self.stack.is_empty() {
1811 ParseBeforeFinish
1812 } else if self.stack.last_is_index() {
1813 ParseArrayComma
1814 } else {
1815 ParseObjectComma
1816 };
1817 self.bump();
1818 ArrayEnd
1819 }
1820 } else {
1821 if first {
1822 self.stack.push_index(0);
1823 }
1824 let val = self.parse_value();
1825 self.state = match val {
1826 Error(_) => ParseFinished,
1827 ArrayStart => ParseArray(true),
1828 ObjectStart => ParseObject(true),
1829 _ => ParseArrayComma,
1830 };
1831 val
1832 }
1833 }
1834
1835 fn parse_array_comma_or_end(&mut self) -> Option<JsonEvent> {
1836 if self.ch_is(',') {
1837 self.stack.bump_index();
1838 self.state = ParseArray(false);
1839 self.bump();
1840 None
1841 } else if self.ch_is(']') {
1842 self.stack.pop();
1843 self.state = if self.stack.is_empty() {
1844 ParseBeforeFinish
1845 } else if self.stack.last_is_index() {
1846 ParseArrayComma
1847 } else {
1848 ParseObjectComma
1849 };
1850 self.bump();
1851 Some(ArrayEnd)
1852 } else if self.eof() {
1853 Some(self.error_event(EOFWhileParsingArray))
1854 } else {
1855 Some(self.error_event(InvalidSyntax))
1856 }
1857 }
1858
1859 fn parse_object(&mut self, first: bool) -> JsonEvent {
1860 if self.ch_is('}') {
1861 if !first {
1862 if self.stack.is_empty() {
1863 return self.error_event(TrailingComma);
1864 } else {
1865 self.stack.pop();
1866 }
1867 }
1868 self.state = if self.stack.is_empty() {
1869 ParseBeforeFinish
1870 } else if self.stack.last_is_index() {
1871 ParseArrayComma
1872 } else {
1873 ParseObjectComma
1874 };
1875 self.bump();
1876 return ObjectEnd;
1877 }
1878 if self.eof() {
1879 return self.error_event(EOFWhileParsingObject);
1880 }
1881 if !self.ch_is('"') {
1882 return self.error_event(KeyMustBeAString);
1883 }
1884 let s = match self.parse_str() {
1885 Ok(s) => s,
1886 Err(e) => {
1887 self.state = ParseFinished;
1888 return Error(e);
1889 }
1890 };
1891 self.parse_whitespace();
1892 if self.eof() {
1893 return self.error_event(EOFWhileParsingObject);
1894 } else if self.ch_or_null() != ':' {
1895 return self.error_event(ExpectedColon);
1896 }
1897 self.stack.push_key(s);
1898 self.bump();
1899 self.parse_whitespace();
1900
1901 let val = self.parse_value();
1902
1903 self.state = match val {
1904 Error(_) => ParseFinished,
1905 ArrayStart => ParseArray(true),
1906 ObjectStart => ParseObject(true),
1907 _ => ParseObjectComma,
1908 };
1909 return val;
1910 }
1911
1912 fn parse_object_end(&mut self) -> JsonEvent {
1913 if self.ch_is('}') {
1914 self.state = if self.stack.is_empty() {
1915 ParseBeforeFinish
1916 } else if self.stack.last_is_index() {
1917 ParseArrayComma
1918 } else {
1919 ParseObjectComma
1920 };
1921 self.bump();
1922 ObjectEnd
1923 } else if self.eof() {
1924 self.error_event(EOFWhileParsingObject)
1925 } else {
1926 self.error_event(InvalidSyntax)
1927 }
1928 }
1929
1930 fn parse_value(&mut self) -> JsonEvent {
1931 if self.eof() { return self.error_event(EOFWhileParsingValue); }
1932 match self.ch_or_null() {
1933 'n' => { self.parse_ident("ull", NullValue) }
1934 't' => { self.parse_ident("rue", BooleanValue(true)) }
1935 'f' => { self.parse_ident("alse", BooleanValue(false)) }
1936 '0' ... '9' | '-' => self.parse_number(),
1937 '"' => match self.parse_str() {
1938 Ok(s) => StringValue(s),
1939 Err(e) => Error(e),
1940 },
1941 '[' => {
1942 self.bump();
1943 ArrayStart
1944 }
1945 '{' => {
1946 self.bump();
1947 ObjectStart
1948 }
1949 _ => { self.error_event(InvalidSyntax) }
1950 }
1951 }
1952
1953 fn parse_ident(&mut self, ident: &str, value: JsonEvent) -> JsonEvent {
1954 if ident.chars().all(|c| Some(c) == self.next_char()) {
1955 self.bump();
1956 value
1957 } else {
1958 Error(SyntaxError(InvalidSyntax, self.line, self.col))
1959 }
1960 }
1961
1962 fn error_event(&mut self, reason: ErrorCode) -> JsonEvent {
1963 self.state = ParseFinished;
1964 Error(SyntaxError(reason, self.line, self.col))
1965 }
1966}
1967
1968/// A Builder consumes a json::Parser to create a generic Json structure.
1969pub struct Builder<T> {
1970 parser: Parser<T>,
1971 token: Option<JsonEvent>,
1972}
1973
1974impl<T: Iterator<Item=char>> Builder<T> {
1975 /// Create a JSON Builder.
1976 pub fn new(src: T) -> Builder<T> {
1977 Builder { parser: Parser::new(src), token: None, }
1978 }
1979
1980 // Decode a Json value from a Parser.
1981 pub fn build(&mut self) -> Result<Json, BuilderError> {
1982 self.bump();
1983 let result = self.build_value();
1984 self.bump();
1985 match self.token {
1986 None => {}
c34b1796 1987 Some(Error(ref e)) => { return Err(e.clone()); }
1a4d82fc
JJ
1988 ref tok => { panic!("unexpected token {:?}", tok.clone()); }
1989 }
1990 result
1991 }
1992
1993 fn bump(&mut self) {
1994 self.token = self.parser.next();
1995 }
1996
1997 fn build_value(&mut self) -> Result<Json, BuilderError> {
1998 return match self.token {
1999 Some(NullValue) => Ok(Json::Null),
2000 Some(I64Value(n)) => Ok(Json::I64(n)),
2001 Some(U64Value(n)) => Ok(Json::U64(n)),
2002 Some(F64Value(n)) => Ok(Json::F64(n)),
2003 Some(BooleanValue(b)) => Ok(Json::Boolean(b)),
2004 Some(StringValue(ref mut s)) => {
2005 let mut temp = string::String::new();
2006 swap(s, &mut temp);
2007 Ok(Json::String(temp))
2008 }
c34b1796 2009 Some(Error(ref e)) => Err(e.clone()),
1a4d82fc
JJ
2010 Some(ArrayStart) => self.build_array(),
2011 Some(ObjectStart) => self.build_object(),
2012 Some(ObjectEnd) => self.parser.error(InvalidSyntax),
2013 Some(ArrayEnd) => self.parser.error(InvalidSyntax),
2014 None => self.parser.error(EOFWhileParsingValue),
2015 }
2016 }
2017
2018 fn build_array(&mut self) -> Result<Json, BuilderError> {
2019 self.bump();
2020 let mut values = Vec::new();
2021
2022 loop {
2023 if self.token == Some(ArrayEnd) {
2024 return Ok(Json::Array(values.into_iter().collect()));
2025 }
2026 match self.build_value() {
2027 Ok(v) => values.push(v),
2028 Err(e) => { return Err(e) }
2029 }
2030 self.bump();
2031 }
2032 }
2033
2034 fn build_object(&mut self) -> Result<Json, BuilderError> {
2035 self.bump();
2036
2037 let mut values = BTreeMap::new();
2038
2039 loop {
2040 match self.token {
2041 Some(ObjectEnd) => { return Ok(Json::Object(values)); }
c34b1796 2042 Some(Error(ref e)) => { return Err(e.clone()); }
1a4d82fc
JJ
2043 None => { break; }
2044 _ => {}
2045 }
2046 let key = match self.parser.stack().top() {
2047 Some(StackElement::Key(k)) => { k.to_string() }
2048 _ => { panic!("invalid state"); }
2049 };
2050 match self.build_value() {
2051 Ok(value) => { values.insert(key, value); }
2052 Err(e) => { return Err(e); }
2053 }
2054 self.bump();
2055 }
2056 return self.parser.error(EOFWhileParsingObject);
2057 }
2058}
2059
d9579d0f 2060/// Decodes a json value from an `&mut io::Read`
c34b1796
AL
2061pub fn from_reader(rdr: &mut Read) -> Result<Json, BuilderError> {
2062 let mut contents = Vec::new();
2063 match rdr.read_to_end(&mut contents) {
1a4d82fc
JJ
2064 Ok(c) => c,
2065 Err(e) => return Err(io_error_to_error(e))
2066 };
85aaf69f 2067 let s = match str::from_utf8(&contents).ok() {
1a4d82fc
JJ
2068 Some(s) => s,
2069 _ => return Err(SyntaxError(NotUtf8, 0, 0))
2070 };
2071 let mut builder = Builder::new(s.chars());
2072 builder.build()
2073}
2074
2075/// Decodes a json value from a string
2076pub fn from_str(s: &str) -> Result<Json, BuilderError> {
2077 let mut builder = Builder::new(s.chars());
2078 builder.build()
2079}
2080
2081/// A structure to decode JSON to values in rust.
2082pub struct Decoder {
2083 stack: Vec<Json>,
2084}
2085
2086impl Decoder {
2087 /// Creates a new decoder instance for decoding the specified JSON value.
2088 pub fn new(json: Json) -> Decoder {
2089 Decoder { stack: vec![json] }
2090 }
2091}
2092
2093impl Decoder {
2094 fn pop(&mut self) -> Json {
2095 self.stack.pop().unwrap()
2096 }
2097}
2098
2099macro_rules! expect {
2100 ($e:expr, Null) => ({
2101 match $e {
2102 Json::Null => Ok(()),
2103 other => Err(ExpectedError("Null".to_string(),
2104 format!("{}", other)))
2105 }
2106 });
2107 ($e:expr, $t:ident) => ({
2108 match $e {
2109 Json::$t(v) => Ok(v),
2110 other => {
2111 Err(ExpectedError(stringify!($t).to_string(),
2112 format!("{}", other)))
2113 }
2114 }
2115 })
2116}
2117
2118macro_rules! read_primitive {
2119 ($name:ident, $ty:ty) => {
2120 fn $name(&mut self) -> DecodeResult<$ty> {
2121 match self.pop() {
9346a6ac
AL
2122 Json::I64(f) => Ok(f as $ty),
2123 Json::U64(f) => Ok(f as $ty),
1a4d82fc 2124 Json::F64(f) => Err(ExpectedError("Integer".to_string(), format!("{}", f))),
c34b1796 2125 // re: #12967.. a type w/ numeric keys (ie HashMap<usize, V> etc)
1a4d82fc 2126 // is going to have a string here, as per JSON spec.
85aaf69f 2127 Json::String(s) => match s.parse().ok() {
1a4d82fc
JJ
2128 Some(f) => Ok(f),
2129 None => Err(ExpectedError("Number".to_string(), s)),
2130 },
2131 value => Err(ExpectedError("Number".to_string(), format!("{}", value))),
2132 }
2133 }
2134 }
2135}
2136
2137impl ::Decoder for Decoder {
2138 type Error = DecoderError;
2139
2140 fn read_nil(&mut self) -> DecodeResult<()> {
2141 expect!(self.pop(), Null)
2142 }
2143
c34b1796 2144 read_primitive! { read_uint, usize }
1a4d82fc
JJ
2145 read_primitive! { read_u8, u8 }
2146 read_primitive! { read_u16, u16 }
2147 read_primitive! { read_u32, u32 }
2148 read_primitive! { read_u64, u64 }
c34b1796 2149 read_primitive! { read_int, isize }
1a4d82fc
JJ
2150 read_primitive! { read_i8, i8 }
2151 read_primitive! { read_i16, i16 }
2152 read_primitive! { read_i32, i32 }
2153 read_primitive! { read_i64, i64 }
2154
2155 fn read_f32(&mut self) -> DecodeResult<f32> { self.read_f64().map(|x| x as f32) }
2156
2157 fn read_f64(&mut self) -> DecodeResult<f64> {
2158 match self.pop() {
2159 Json::I64(f) => Ok(f as f64),
2160 Json::U64(f) => Ok(f as f64),
2161 Json::F64(f) => Ok(f),
2162 Json::String(s) => {
c34b1796 2163 // re: #12967.. a type w/ numeric keys (ie HashMap<usize, V> etc)
1a4d82fc 2164 // is going to have a string here, as per JSON spec.
85aaf69f 2165 match s.parse().ok() {
1a4d82fc
JJ
2166 Some(f) => Ok(f),
2167 None => Err(ExpectedError("Number".to_string(), s)),
2168 }
2169 },
2170 Json::Null => Ok(f64::NAN),
2171 value => Err(ExpectedError("Number".to_string(), format!("{}", value)))
2172 }
2173 }
2174
2175 fn read_bool(&mut self) -> DecodeResult<bool> {
2176 expect!(self.pop(), Boolean)
2177 }
2178
2179 fn read_char(&mut self) -> DecodeResult<char> {
2180 let s = try!(self.read_str());
2181 {
2182 let mut it = s.chars();
2183 match (it.next(), it.next()) {
2184 // exactly one character
2185 (Some(c), None) => return Ok(c),
2186 _ => ()
2187 }
2188 }
2189 Err(ExpectedError("single character string".to_string(), format!("{}", s)))
2190 }
2191
2192 fn read_str(&mut self) -> DecodeResult<string::String> {
2193 expect!(self.pop(), String)
2194 }
2195
2196 fn read_enum<T, F>(&mut self, _name: &str, f: F) -> DecodeResult<T> where
2197 F: FnOnce(&mut Decoder) -> DecodeResult<T>,
2198 {
2199 f(self)
2200 }
2201
2202 fn read_enum_variant<T, F>(&mut self, names: &[&str],
2203 mut f: F) -> DecodeResult<T>
c34b1796 2204 where F: FnMut(&mut Decoder, usize) -> DecodeResult<T>,
1a4d82fc
JJ
2205 {
2206 let name = match self.pop() {
2207 Json::String(s) => s,
2208 Json::Object(mut o) => {
2209 let n = match o.remove(&"variant".to_string()) {
2210 Some(Json::String(s)) => s,
2211 Some(val) => {
2212 return Err(ExpectedError("String".to_string(), format!("{}", val)))
2213 }
2214 None => {
2215 return Err(MissingFieldError("variant".to_string()))
2216 }
2217 };
2218 match o.remove(&"fields".to_string()) {
2219 Some(Json::Array(l)) => {
2220 for field in l.into_iter().rev() {
2221 self.stack.push(field);
2222 }
2223 },
2224 Some(val) => {
2225 return Err(ExpectedError("Array".to_string(), format!("{}", val)))
2226 }
2227 None => {
2228 return Err(MissingFieldError("fields".to_string()))
2229 }
2230 }
2231 n
2232 }
2233 json => {
2234 return Err(ExpectedError("String or Object".to_string(), format!("{}", json)))
2235 }
2236 };
85aaf69f 2237 let idx = match names.iter().position(|n| *n == &name[..]) {
1a4d82fc
JJ
2238 Some(idx) => idx,
2239 None => return Err(UnknownVariantError(name))
2240 };
2241 f(self, idx)
2242 }
2243
c34b1796 2244 fn read_enum_variant_arg<T, F>(&mut self, _idx: usize, f: F) -> DecodeResult<T> where
1a4d82fc
JJ
2245 F: FnOnce(&mut Decoder) -> DecodeResult<T>,
2246 {
2247 f(self)
2248 }
2249
2250 fn read_enum_struct_variant<T, F>(&mut self, names: &[&str], f: F) -> DecodeResult<T> where
c34b1796 2251 F: FnMut(&mut Decoder, usize) -> DecodeResult<T>,
1a4d82fc
JJ
2252 {
2253 self.read_enum_variant(names, f)
2254 }
2255
2256
2257 fn read_enum_struct_variant_field<T, F>(&mut self,
2258 _name: &str,
c34b1796 2259 idx: usize,
1a4d82fc
JJ
2260 f: F)
2261 -> DecodeResult<T> where
2262 F: FnOnce(&mut Decoder) -> DecodeResult<T>,
2263 {
2264 self.read_enum_variant_arg(idx, f)
2265 }
2266
c34b1796 2267 fn read_struct<T, F>(&mut self, _name: &str, _len: usize, f: F) -> DecodeResult<T> where
1a4d82fc
JJ
2268 F: FnOnce(&mut Decoder) -> DecodeResult<T>,
2269 {
2270 let value = try!(f(self));
2271 self.pop();
2272 Ok(value)
2273 }
2274
2275 fn read_struct_field<T, F>(&mut self,
2276 name: &str,
c34b1796 2277 _idx: usize,
1a4d82fc
JJ
2278 f: F)
2279 -> DecodeResult<T> where
2280 F: FnOnce(&mut Decoder) -> DecodeResult<T>,
2281 {
2282 let mut obj = try!(expect!(self.pop(), Object));
2283
2284 let value = match obj.remove(&name.to_string()) {
2285 None => {
2286 // Add a Null and try to parse it as an Option<_>
2287 // to get None as a default value.
2288 self.stack.push(Json::Null);
2289 match f(self) {
2290 Ok(x) => x,
2291 Err(_) => return Err(MissingFieldError(name.to_string())),
2292 }
2293 },
2294 Some(json) => {
2295 self.stack.push(json);
2296 try!(f(self))
2297 }
2298 };
2299 self.stack.push(Json::Object(obj));
2300 Ok(value)
2301 }
2302
c34b1796 2303 fn read_tuple<T, F>(&mut self, tuple_len: usize, f: F) -> DecodeResult<T> where
1a4d82fc
JJ
2304 F: FnOnce(&mut Decoder) -> DecodeResult<T>,
2305 {
2306 self.read_seq(move |d, len| {
2307 if len == tuple_len {
2308 f(d)
2309 } else {
2310 Err(ExpectedError(format!("Tuple{}", tuple_len), format!("Tuple{}", len)))
2311 }
2312 })
2313 }
2314
c34b1796 2315 fn read_tuple_arg<T, F>(&mut self, idx: usize, f: F) -> DecodeResult<T> where
1a4d82fc
JJ
2316 F: FnOnce(&mut Decoder) -> DecodeResult<T>,
2317 {
2318 self.read_seq_elt(idx, f)
2319 }
2320
2321 fn read_tuple_struct<T, F>(&mut self,
2322 _name: &str,
c34b1796 2323 len: usize,
1a4d82fc
JJ
2324 f: F)
2325 -> DecodeResult<T> where
2326 F: FnOnce(&mut Decoder) -> DecodeResult<T>,
2327 {
2328 self.read_tuple(len, f)
2329 }
2330
2331 fn read_tuple_struct_arg<T, F>(&mut self,
c34b1796 2332 idx: usize,
1a4d82fc
JJ
2333 f: F)
2334 -> DecodeResult<T> where
2335 F: FnOnce(&mut Decoder) -> DecodeResult<T>,
2336 {
2337 self.read_tuple_arg(idx, f)
2338 }
2339
2340 fn read_option<T, F>(&mut self, mut f: F) -> DecodeResult<T> where
2341 F: FnMut(&mut Decoder, bool) -> DecodeResult<T>,
2342 {
2343 match self.pop() {
2344 Json::Null => f(self, false),
2345 value => { self.stack.push(value); f(self, true) }
2346 }
2347 }
2348
2349 fn read_seq<T, F>(&mut self, f: F) -> DecodeResult<T> where
c34b1796 2350 F: FnOnce(&mut Decoder, usize) -> DecodeResult<T>,
1a4d82fc
JJ
2351 {
2352 let array = try!(expect!(self.pop(), Array));
2353 let len = array.len();
2354 for v in array.into_iter().rev() {
2355 self.stack.push(v);
2356 }
2357 f(self, len)
2358 }
2359
c34b1796 2360 fn read_seq_elt<T, F>(&mut self, _idx: usize, f: F) -> DecodeResult<T> where
1a4d82fc
JJ
2361 F: FnOnce(&mut Decoder) -> DecodeResult<T>,
2362 {
2363 f(self)
2364 }
2365
2366 fn read_map<T, F>(&mut self, f: F) -> DecodeResult<T> where
c34b1796 2367 F: FnOnce(&mut Decoder, usize) -> DecodeResult<T>,
1a4d82fc
JJ
2368 {
2369 let obj = try!(expect!(self.pop(), Object));
2370 let len = obj.len();
85aaf69f 2371 for (key, value) in obj {
1a4d82fc
JJ
2372 self.stack.push(value);
2373 self.stack.push(Json::String(key));
2374 }
2375 f(self, len)
2376 }
2377
c34b1796 2378 fn read_map_elt_key<T, F>(&mut self, _idx: usize, f: F) -> DecodeResult<T> where
1a4d82fc
JJ
2379 F: FnOnce(&mut Decoder) -> DecodeResult<T>,
2380 {
2381 f(self)
2382 }
2383
c34b1796 2384 fn read_map_elt_val<T, F>(&mut self, _idx: usize, f: F) -> DecodeResult<T> where
1a4d82fc
JJ
2385 F: FnOnce(&mut Decoder) -> DecodeResult<T>,
2386 {
2387 f(self)
2388 }
2389
2390 fn error(&mut self, err: &str) -> DecoderError {
2391 ApplicationError(err.to_string())
2392 }
2393}
2394
2395/// A trait for converting values to JSON
2396pub trait ToJson {
2397 /// Converts the value of `self` to an instance of JSON
2398 fn to_json(&self) -> Json;
2399}
2400
2401macro_rules! to_json_impl_i64 {
2402 ($($t:ty), +) => (
2403 $(impl ToJson for $t {
c34b1796
AL
2404 fn to_json(&self) -> Json {
2405 Json::I64(*self as i64)
2406 }
1a4d82fc
JJ
2407 })+
2408 )
2409}
2410
c34b1796 2411to_json_impl_i64! { isize, i8, i16, i32, i64 }
1a4d82fc
JJ
2412
2413macro_rules! to_json_impl_u64 {
2414 ($($t:ty), +) => (
2415 $(impl ToJson for $t {
c34b1796
AL
2416 fn to_json(&self) -> Json {
2417 Json::U64(*self as u64)
2418 }
1a4d82fc
JJ
2419 })+
2420 )
2421}
2422
c34b1796 2423to_json_impl_u64! { usize, u8, u16, u32, u64 }
1a4d82fc
JJ
2424
2425impl ToJson for Json {
2426 fn to_json(&self) -> Json { self.clone() }
2427}
2428
2429impl ToJson for f32 {
2430 fn to_json(&self) -> Json { (*self as f64).to_json() }
2431}
2432
2433impl ToJson for f64 {
2434 fn to_json(&self) -> Json {
2435 match self.classify() {
2436 Fp::Nan | Fp::Infinite => Json::Null,
2437 _ => Json::F64(*self)
2438 }
2439 }
2440}
2441
2442impl ToJson for () {
2443 fn to_json(&self) -> Json { Json::Null }
2444}
2445
2446impl ToJson for bool {
2447 fn to_json(&self) -> Json { Json::Boolean(*self) }
2448}
2449
2450impl ToJson for str {
2451 fn to_json(&self) -> Json { Json::String(self.to_string()) }
2452}
2453
2454impl ToJson for string::String {
2455 fn to_json(&self) -> Json { Json::String((*self).clone()) }
2456}
2457
2458macro_rules! tuple_impl {
2459 // use variables to indicate the arity of the tuple
2460 ($($tyvar:ident),* ) => {
2461 // the trailing commas are for the 1 tuple
2462 impl<
2463 $( $tyvar : ToJson ),*
2464 > ToJson for ( $( $tyvar ),* , ) {
2465
2466 #[inline]
2467 #[allow(non_snake_case)]
2468 fn to_json(&self) -> Json {
2469 match *self {
2470 ($(ref $tyvar),*,) => Json::Array(vec![$($tyvar.to_json()),*])
2471 }
2472 }
2473 }
2474 }
2475}
2476
2477tuple_impl!{A}
2478tuple_impl!{A, B}
2479tuple_impl!{A, B, C}
2480tuple_impl!{A, B, C, D}
2481tuple_impl!{A, B, C, D, E}
2482tuple_impl!{A, B, C, D, E, F}
2483tuple_impl!{A, B, C, D, E, F, G}
2484tuple_impl!{A, B, C, D, E, F, G, H}
2485tuple_impl!{A, B, C, D, E, F, G, H, I}
2486tuple_impl!{A, B, C, D, E, F, G, H, I, J}
2487tuple_impl!{A, B, C, D, E, F, G, H, I, J, K}
2488tuple_impl!{A, B, C, D, E, F, G, H, I, J, K, L}
2489
2490impl<A: ToJson> ToJson for [A] {
2491 fn to_json(&self) -> Json { Json::Array(self.iter().map(|elt| elt.to_json()).collect()) }
2492}
2493
2494impl<A: ToJson> ToJson for Vec<A> {
2495 fn to_json(&self) -> Json { Json::Array(self.iter().map(|elt| elt.to_json()).collect()) }
2496}
2497
2498impl<A: ToJson> ToJson for BTreeMap<string::String, A> {
2499 fn to_json(&self) -> Json {
2500 let mut d = BTreeMap::new();
85aaf69f 2501 for (key, value) in self {
1a4d82fc
JJ
2502 d.insert((*key).clone(), value.to_json());
2503 }
2504 Json::Object(d)
2505 }
2506}
2507
2508impl<A: ToJson> ToJson for HashMap<string::String, A> {
2509 fn to_json(&self) -> Json {
2510 let mut d = BTreeMap::new();
85aaf69f 2511 for (key, value) in self {
1a4d82fc
JJ
2512 d.insert((*key).clone(), value.to_json());
2513 }
2514 Json::Object(d)
2515 }
2516}
2517
2518impl<A:ToJson> ToJson for Option<A> {
2519 fn to_json(&self) -> Json {
2520 match *self {
2521 None => Json::Null,
2522 Some(ref value) => value.to_json()
2523 }
2524 }
2525}
2526
2527struct FormatShim<'a, 'b: 'a> {
2528 inner: &'a mut fmt::Formatter<'b>,
2529}
2530
85aaf69f 2531impl<'a, 'b> fmt::Write for FormatShim<'a, 'b> {
1a4d82fc 2532 fn write_str(&mut self, s: &str) -> fmt::Result {
85aaf69f
SL
2533 match self.inner.write_str(s) {
2534 Ok(_) => Ok(()),
2535 Err(_) => Err(fmt::Error)
2536 }
1a4d82fc
JJ
2537 }
2538}
2539
85aaf69f 2540impl fmt::Display for Json {
1a4d82fc
JJ
2541 /// Encodes a json value into a string
2542 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2543 let mut shim = FormatShim { inner: f };
2544 let mut encoder = Encoder::new(&mut shim);
85aaf69f
SL
2545 match self.encode(&mut encoder) {
2546 Ok(_) => Ok(()),
2547 Err(_) => Err(fmt::Error)
2548 }
1a4d82fc
JJ
2549 }
2550}
2551
85aaf69f 2552impl<'a> fmt::Display for PrettyJson<'a> {
1a4d82fc
JJ
2553 /// Encodes a json value into a string
2554 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2555 let mut shim = FormatShim { inner: f };
2556 let mut encoder = PrettyEncoder::new(&mut shim);
85aaf69f
SL
2557 match self.inner.encode(&mut encoder) {
2558 Ok(_) => Ok(()),
2559 Err(_) => Err(fmt::Error)
2560 }
1a4d82fc
JJ
2561 }
2562}
2563
85aaf69f 2564impl<'a, T: Encodable> fmt::Display for AsJson<'a, T> {
1a4d82fc
JJ
2565 /// Encodes a json value into a string
2566 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2567 let mut shim = FormatShim { inner: f };
2568 let mut encoder = Encoder::new(&mut shim);
85aaf69f
SL
2569 match self.inner.encode(&mut encoder) {
2570 Ok(_) => Ok(()),
2571 Err(_) => Err(fmt::Error)
2572 }
1a4d82fc
JJ
2573 }
2574}
2575
2576impl<'a, T> AsPrettyJson<'a, T> {
2577 /// Set the indentation level for the emitted JSON
c34b1796 2578 pub fn indent(mut self, indent: usize) -> AsPrettyJson<'a, T> {
1a4d82fc
JJ
2579 self.indent = Some(indent);
2580 self
2581 }
2582}
2583
85aaf69f 2584impl<'a, T: Encodable> fmt::Display for AsPrettyJson<'a, T> {
1a4d82fc
JJ
2585 /// Encodes a json value into a string
2586 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2587 let mut shim = FormatShim { inner: f };
2588 let mut encoder = PrettyEncoder::new(&mut shim);
2589 match self.indent {
2590 Some(n) => encoder.set_indent(n),
2591 None => {}
2592 }
85aaf69f
SL
2593 match self.inner.encode(&mut encoder) {
2594 Ok(_) => Ok(()),
2595 Err(_) => Err(fmt::Error)
2596 }
1a4d82fc
JJ
2597 }
2598}
2599
2600impl FromStr for Json {
85aaf69f
SL
2601 type Err = BuilderError;
2602 fn from_str(s: &str) -> Result<Json, BuilderError> {
2603 from_str(s)
1a4d82fc
JJ
2604 }
2605}
2606
2607#[cfg(test)]
2608mod tests {
2609 extern crate test;
2610 use self::Animal::*;
2611 use self::DecodeEnum::*;
2612 use self::test::Bencher;
2613 use {Encodable, Decodable};
2614 use super::Json::*;
2615 use super::ErrorCode::*;
2616 use super::ParserError::*;
2617 use super::DecoderError::*;
2618 use super::JsonEvent::*;
2619 use super::{Json, from_str, DecodeResult, DecoderError, JsonEvent, Parser,
85aaf69f
SL
2620 StackElement, Stack, Decoder, Encoder, EncoderError};
2621 use std::{i64, u64, f32, f64};
9346a6ac 2622 use std::io::prelude::*;
1a4d82fc 2623 use std::collections::BTreeMap;
1a4d82fc
JJ
2624 use std::string;
2625
85aaf69f 2626 #[derive(RustcDecodable, Eq, PartialEq, Debug)]
1a4d82fc 2627 struct OptionData {
c34b1796 2628 opt: Option<usize>,
1a4d82fc
JJ
2629 }
2630
2631 #[test]
2632 fn test_decode_option_none() {
2633 let s ="{}";
2634 let obj: OptionData = super::decode(s).unwrap();
2635 assert_eq!(obj, OptionData { opt: None });
2636 }
2637
2638 #[test]
2639 fn test_decode_option_some() {
2640 let s = "{ \"opt\": 10 }";
2641 let obj: OptionData = super::decode(s).unwrap();
85aaf69f 2642 assert_eq!(obj, OptionData { opt: Some(10) });
1a4d82fc
JJ
2643 }
2644
2645 #[test]
2646 fn test_decode_option_malformed() {
2647 check_err::<OptionData>("{ \"opt\": [] }",
2648 ExpectedError("Number".to_string(), "[]".to_string()));
2649 check_err::<OptionData>("{ \"opt\": false }",
2650 ExpectedError("Number".to_string(), "false".to_string()));
2651 }
2652
85aaf69f 2653 #[derive(PartialEq, RustcEncodable, RustcDecodable, Debug)]
1a4d82fc
JJ
2654 enum Animal {
2655 Dog,
c34b1796 2656 Frog(string::String, isize)
1a4d82fc
JJ
2657 }
2658
85aaf69f 2659 #[derive(PartialEq, RustcEncodable, RustcDecodable, Debug)]
1a4d82fc
JJ
2660 struct Inner {
2661 a: (),
c34b1796 2662 b: usize,
1a4d82fc
JJ
2663 c: Vec<string::String>,
2664 }
2665
85aaf69f 2666 #[derive(PartialEq, RustcEncodable, RustcDecodable, Debug)]
1a4d82fc
JJ
2667 struct Outer {
2668 inner: Vec<Inner>,
2669 }
2670
2671 fn mk_object(items: &[(string::String, Json)]) -> Json {
2672 let mut d = BTreeMap::new();
2673
85aaf69f 2674 for item in items {
1a4d82fc
JJ
2675 match *item {
2676 (ref key, ref value) => { d.insert((*key).clone(), (*value).clone()); },
2677 }
2678 };
2679
2680 Object(d)
2681 }
2682
2683 #[test]
2684 fn test_from_str_trait() {
2685 let s = "null";
2686 assert!(s.parse::<Json>().unwrap() == s.parse().unwrap());
2687 }
2688
2689 #[test]
2690 fn test_write_null() {
2691 assert_eq!(Null.to_string(), "null");
2692 assert_eq!(Null.pretty().to_string(), "null");
2693 }
2694
2695 #[test]
2696 fn test_write_i64() {
2697 assert_eq!(U64(0).to_string(), "0");
2698 assert_eq!(U64(0).pretty().to_string(), "0");
2699
2700 assert_eq!(U64(1234).to_string(), "1234");
2701 assert_eq!(U64(1234).pretty().to_string(), "1234");
2702
2703 assert_eq!(I64(-5678).to_string(), "-5678");
2704 assert_eq!(I64(-5678).pretty().to_string(), "-5678");
2705
2706 assert_eq!(U64(7650007200025252000).to_string(), "7650007200025252000");
2707 assert_eq!(U64(7650007200025252000).pretty().to_string(), "7650007200025252000");
2708 }
2709
2710 #[test]
2711 fn test_write_f64() {
2712 assert_eq!(F64(3.0).to_string(), "3.0");
2713 assert_eq!(F64(3.0).pretty().to_string(), "3.0");
2714
2715 assert_eq!(F64(3.1).to_string(), "3.1");
2716 assert_eq!(F64(3.1).pretty().to_string(), "3.1");
2717
2718 assert_eq!(F64(-1.5).to_string(), "-1.5");
2719 assert_eq!(F64(-1.5).pretty().to_string(), "-1.5");
2720
2721 assert_eq!(F64(0.5).to_string(), "0.5");
2722 assert_eq!(F64(0.5).pretty().to_string(), "0.5");
2723
2724 assert_eq!(F64(f64::NAN).to_string(), "null");
2725 assert_eq!(F64(f64::NAN).pretty().to_string(), "null");
2726
2727 assert_eq!(F64(f64::INFINITY).to_string(), "null");
2728 assert_eq!(F64(f64::INFINITY).pretty().to_string(), "null");
2729
2730 assert_eq!(F64(f64::NEG_INFINITY).to_string(), "null");
2731 assert_eq!(F64(f64::NEG_INFINITY).pretty().to_string(), "null");
2732 }
2733
2734 #[test]
2735 fn test_write_str() {
2736 assert_eq!(String("".to_string()).to_string(), "\"\"");
2737 assert_eq!(String("".to_string()).pretty().to_string(), "\"\"");
2738
2739 assert_eq!(String("homura".to_string()).to_string(), "\"homura\"");
2740 assert_eq!(String("madoka".to_string()).pretty().to_string(), "\"madoka\"");
2741 }
2742
2743 #[test]
2744 fn test_write_bool() {
2745 assert_eq!(Boolean(true).to_string(), "true");
2746 assert_eq!(Boolean(true).pretty().to_string(), "true");
2747
2748 assert_eq!(Boolean(false).to_string(), "false");
2749 assert_eq!(Boolean(false).pretty().to_string(), "false");
2750 }
2751
2752 #[test]
2753 fn test_write_array() {
2754 assert_eq!(Array(vec![]).to_string(), "[]");
2755 assert_eq!(Array(vec![]).pretty().to_string(), "[]");
2756
2757 assert_eq!(Array(vec![Boolean(true)]).to_string(), "[true]");
2758 assert_eq!(
2759 Array(vec![Boolean(true)]).pretty().to_string(),
2760 "\
2761 [\n \
2762 true\n\
2763 ]"
2764 );
2765
2766 let long_test_array = Array(vec![
2767 Boolean(false),
2768 Null,
2769 Array(vec![String("foo\nbar".to_string()), F64(3.5)])]);
2770
2771 assert_eq!(long_test_array.to_string(),
2772 "[false,null,[\"foo\\nbar\",3.5]]");
2773 assert_eq!(
2774 long_test_array.pretty().to_string(),
2775 "\
2776 [\n \
2777 false,\n \
2778 null,\n \
2779 [\n \
2780 \"foo\\nbar\",\n \
2781 3.5\n \
2782 ]\n\
2783 ]"
2784 );
2785 }
2786
2787 #[test]
2788 fn test_write_object() {
2789 assert_eq!(mk_object(&[]).to_string(), "{}");
2790 assert_eq!(mk_object(&[]).pretty().to_string(), "{}");
2791
2792 assert_eq!(
2793 mk_object(&[
2794 ("a".to_string(), Boolean(true))
2795 ]).to_string(),
2796 "{\"a\":true}"
2797 );
2798 assert_eq!(
2799 mk_object(&[("a".to_string(), Boolean(true))]).pretty().to_string(),
2800 "\
2801 {\n \
2802 \"a\": true\n\
2803 }"
2804 );
2805
2806 let complex_obj = mk_object(&[
2807 ("b".to_string(), Array(vec![
2808 mk_object(&[("c".to_string(), String("\x0c\r".to_string()))]),
2809 mk_object(&[("d".to_string(), String("".to_string()))])
2810 ]))
2811 ]);
2812
2813 assert_eq!(
2814 complex_obj.to_string(),
2815 "{\
2816 \"b\":[\
2817 {\"c\":\"\\f\\r\"},\
2818 {\"d\":\"\"}\
2819 ]\
2820 }"
2821 );
2822 assert_eq!(
2823 complex_obj.pretty().to_string(),
2824 "\
2825 {\n \
2826 \"b\": [\n \
2827 {\n \
2828 \"c\": \"\\f\\r\"\n \
2829 },\n \
2830 {\n \
2831 \"d\": \"\"\n \
2832 }\n \
2833 ]\n\
2834 }"
2835 );
2836
2837 let a = mk_object(&[
2838 ("a".to_string(), Boolean(true)),
2839 ("b".to_string(), Array(vec![
2840 mk_object(&[("c".to_string(), String("\x0c\r".to_string()))]),
2841 mk_object(&[("d".to_string(), String("".to_string()))])
2842 ]))
2843 ]);
2844
2845 // We can't compare the strings directly because the object fields be
2846 // printed in a different order.
2847 assert_eq!(a.clone(), a.to_string().parse().unwrap());
2848 assert_eq!(a.clone(), a.pretty().to_string().parse().unwrap());
2849 }
2850
2851 #[test]
2852 fn test_write_enum() {
2853 let animal = Dog;
2854 assert_eq!(
2855 format!("{}", super::as_json(&animal)),
2856 "\"Dog\""
2857 );
2858 assert_eq!(
2859 format!("{}", super::as_pretty_json(&animal)),
2860 "\"Dog\""
2861 );
2862
2863 let animal = Frog("Henry".to_string(), 349);
2864 assert_eq!(
2865 format!("{}", super::as_json(&animal)),
2866 "{\"variant\":\"Frog\",\"fields\":[\"Henry\",349]}"
2867 );
2868 assert_eq!(
2869 format!("{}", super::as_pretty_json(&animal)),
2870 "{\n \
2871 \"variant\": \"Frog\",\n \
2872 \"fields\": [\n \
2873 \"Henry\",\n \
2874 349\n \
2875 ]\n\
2876 }"
2877 );
2878 }
2879
2880 macro_rules! check_encoder_for_simple {
2881 ($value:expr, $expected:expr) => ({
2882 let s = format!("{}", super::as_json(&$value));
2883 assert_eq!(s, $expected);
2884
2885 let s = format!("{}", super::as_pretty_json(&$value));
2886 assert_eq!(s, $expected);
2887 })
2888 }
2889
2890 #[test]
2891 fn test_write_some() {
2892 check_encoder_for_simple!(Some("jodhpurs".to_string()), "\"jodhpurs\"");
2893 }
2894
2895 #[test]
2896 fn test_write_none() {
2897 check_encoder_for_simple!(None::<string::String>, "null");
2898 }
2899
2900 #[test]
2901 fn test_write_char() {
2902 check_encoder_for_simple!('a', "\"a\"");
2903 check_encoder_for_simple!('\t', "\"\\t\"");
2904 check_encoder_for_simple!('\u{0000}', "\"\\u0000\"");
2905 check_encoder_for_simple!('\u{001b}', "\"\\u001b\"");
2906 check_encoder_for_simple!('\u{007f}', "\"\\u007f\"");
2907 check_encoder_for_simple!('\u{00a0}', "\"\u{00a0}\"");
2908 check_encoder_for_simple!('\u{abcd}', "\"\u{abcd}\"");
2909 check_encoder_for_simple!('\u{10ffff}', "\"\u{10ffff}\"");
2910 }
2911
2912 #[test]
2913 fn test_trailing_characters() {
2914 assert_eq!(from_str("nulla"), Err(SyntaxError(TrailingCharacters, 1, 5)));
2915 assert_eq!(from_str("truea"), Err(SyntaxError(TrailingCharacters, 1, 5)));
2916 assert_eq!(from_str("falsea"), Err(SyntaxError(TrailingCharacters, 1, 6)));
2917 assert_eq!(from_str("1a"), Err(SyntaxError(TrailingCharacters, 1, 2)));
2918 assert_eq!(from_str("[]a"), Err(SyntaxError(TrailingCharacters, 1, 3)));
2919 assert_eq!(from_str("{}a"), Err(SyntaxError(TrailingCharacters, 1, 3)));
2920 }
2921
2922 #[test]
2923 fn test_read_identifiers() {
2924 assert_eq!(from_str("n"), Err(SyntaxError(InvalidSyntax, 1, 2)));
2925 assert_eq!(from_str("nul"), Err(SyntaxError(InvalidSyntax, 1, 4)));
2926 assert_eq!(from_str("t"), Err(SyntaxError(InvalidSyntax, 1, 2)));
2927 assert_eq!(from_str("truz"), Err(SyntaxError(InvalidSyntax, 1, 4)));
2928 assert_eq!(from_str("f"), Err(SyntaxError(InvalidSyntax, 1, 2)));
2929 assert_eq!(from_str("faz"), Err(SyntaxError(InvalidSyntax, 1, 3)));
2930
2931 assert_eq!(from_str("null"), Ok(Null));
2932 assert_eq!(from_str("true"), Ok(Boolean(true)));
2933 assert_eq!(from_str("false"), Ok(Boolean(false)));
2934 assert_eq!(from_str(" null "), Ok(Null));
2935 assert_eq!(from_str(" true "), Ok(Boolean(true)));
2936 assert_eq!(from_str(" false "), Ok(Boolean(false)));
2937 }
2938
2939 #[test]
2940 fn test_decode_identifiers() {
2941 let v: () = super::decode("null").unwrap();
2942 assert_eq!(v, ());
2943
2944 let v: bool = super::decode("true").unwrap();
2945 assert_eq!(v, true);
2946
2947 let v: bool = super::decode("false").unwrap();
2948 assert_eq!(v, false);
2949 }
2950
2951 #[test]
2952 fn test_read_number() {
2953 assert_eq!(from_str("+"), Err(SyntaxError(InvalidSyntax, 1, 1)));
2954 assert_eq!(from_str("."), Err(SyntaxError(InvalidSyntax, 1, 1)));
2955 assert_eq!(from_str("NaN"), Err(SyntaxError(InvalidSyntax, 1, 1)));
2956 assert_eq!(from_str("-"), Err(SyntaxError(InvalidNumber, 1, 2)));
2957 assert_eq!(from_str("00"), Err(SyntaxError(InvalidNumber, 1, 2)));
2958 assert_eq!(from_str("1."), Err(SyntaxError(InvalidNumber, 1, 3)));
2959 assert_eq!(from_str("1e"), Err(SyntaxError(InvalidNumber, 1, 3)));
2960 assert_eq!(from_str("1e+"), Err(SyntaxError(InvalidNumber, 1, 4)));
2961
2962 assert_eq!(from_str("18446744073709551616"), Err(SyntaxError(InvalidNumber, 1, 20)));
2963 assert_eq!(from_str("-9223372036854775809"), Err(SyntaxError(InvalidNumber, 1, 21)));
2964
2965 assert_eq!(from_str("3"), Ok(U64(3)));
2966 assert_eq!(from_str("3.1"), Ok(F64(3.1)));
2967 assert_eq!(from_str("-1.2"), Ok(F64(-1.2)));
2968 assert_eq!(from_str("0.4"), Ok(F64(0.4)));
2969 assert_eq!(from_str("0.4e5"), Ok(F64(0.4e5)));
2970 assert_eq!(from_str("0.4e+15"), Ok(F64(0.4e15)));
2971 assert_eq!(from_str("0.4e-01"), Ok(F64(0.4e-01)));
2972 assert_eq!(from_str(" 3 "), Ok(U64(3)));
2973
2974 assert_eq!(from_str("-9223372036854775808"), Ok(I64(i64::MIN)));
2975 assert_eq!(from_str("9223372036854775807"), Ok(U64(i64::MAX as u64)));
2976 assert_eq!(from_str("18446744073709551615"), Ok(U64(u64::MAX)));
2977 }
2978
2979 #[test]
2980 fn test_decode_numbers() {
2981 let v: f64 = super::decode("3").unwrap();
2982 assert_eq!(v, 3.0);
2983
2984 let v: f64 = super::decode("3.1").unwrap();
2985 assert_eq!(v, 3.1);
2986
2987 let v: f64 = super::decode("-1.2").unwrap();
2988 assert_eq!(v, -1.2);
2989
2990 let v: f64 = super::decode("0.4").unwrap();
2991 assert_eq!(v, 0.4);
2992
2993 let v: f64 = super::decode("0.4e5").unwrap();
2994 assert_eq!(v, 0.4e5);
2995
2996 let v: f64 = super::decode("0.4e15").unwrap();
2997 assert_eq!(v, 0.4e15);
2998
2999 let v: f64 = super::decode("0.4e-01").unwrap();
3000 assert_eq!(v, 0.4e-01);
3001
3002 let v: u64 = super::decode("0").unwrap();
3003 assert_eq!(v, 0);
3004
3005 let v: u64 = super::decode("18446744073709551615").unwrap();
3006 assert_eq!(v, u64::MAX);
3007
3008 let v: i64 = super::decode("-9223372036854775808").unwrap();
3009 assert_eq!(v, i64::MIN);
3010
3011 let v: i64 = super::decode("9223372036854775807").unwrap();
3012 assert_eq!(v, i64::MAX);
3013
d9579d0f 3014 let res: DecodeResult<i64> = super::decode("765.25");
1a4d82fc 3015 assert_eq!(res, Err(ExpectedError("Integer".to_string(),
d9579d0f 3016 "765.25".to_string())));
1a4d82fc
JJ
3017 }
3018
3019 #[test]
3020 fn test_read_str() {
3021 assert_eq!(from_str("\""), Err(SyntaxError(EOFWhileParsingString, 1, 2)));
3022 assert_eq!(from_str("\"lol"), Err(SyntaxError(EOFWhileParsingString, 1, 5)));
3023
3024 assert_eq!(from_str("\"\""), Ok(String("".to_string())));
3025 assert_eq!(from_str("\"foo\""), Ok(String("foo".to_string())));
3026 assert_eq!(from_str("\"\\\"\""), Ok(String("\"".to_string())));
3027 assert_eq!(from_str("\"\\b\""), Ok(String("\x08".to_string())));
3028 assert_eq!(from_str("\"\\n\""), Ok(String("\n".to_string())));
3029 assert_eq!(from_str("\"\\r\""), Ok(String("\r".to_string())));
3030 assert_eq!(from_str("\"\\t\""), Ok(String("\t".to_string())));
3031 assert_eq!(from_str(" \"foo\" "), Ok(String("foo".to_string())));
3032 assert_eq!(from_str("\"\\u12ab\""), Ok(String("\u{12ab}".to_string())));
3033 assert_eq!(from_str("\"\\uAB12\""), Ok(String("\u{AB12}".to_string())));
3034 }
3035
3036 #[test]
3037 fn test_decode_str() {
3038 let s = [("\"\"", ""),
3039 ("\"foo\"", "foo"),
3040 ("\"\\\"\"", "\""),
3041 ("\"\\b\"", "\x08"),
3042 ("\"\\n\"", "\n"),
3043 ("\"\\r\"", "\r"),
3044 ("\"\\t\"", "\t"),
3045 ("\"\\u12ab\"", "\u{12ab}"),
3046 ("\"\\uAB12\"", "\u{AB12}")];
3047
85aaf69f 3048 for &(i, o) in &s {
1a4d82fc
JJ
3049 let v: string::String = super::decode(i).unwrap();
3050 assert_eq!(v, o);
3051 }
3052 }
3053
3054 #[test]
3055 fn test_read_array() {
3056 assert_eq!(from_str("["), Err(SyntaxError(EOFWhileParsingValue, 1, 2)));
3057 assert_eq!(from_str("[1"), Err(SyntaxError(EOFWhileParsingArray, 1, 3)));
3058 assert_eq!(from_str("[1,"), Err(SyntaxError(EOFWhileParsingValue, 1, 4)));
3059 assert_eq!(from_str("[1,]"), Err(SyntaxError(InvalidSyntax, 1, 4)));
3060 assert_eq!(from_str("[6 7]"), Err(SyntaxError(InvalidSyntax, 1, 4)));
3061
3062 assert_eq!(from_str("[]"), Ok(Array(vec![])));
3063 assert_eq!(from_str("[ ]"), Ok(Array(vec![])));
3064 assert_eq!(from_str("[true]"), Ok(Array(vec![Boolean(true)])));
3065 assert_eq!(from_str("[ false ]"), Ok(Array(vec![Boolean(false)])));
3066 assert_eq!(from_str("[null]"), Ok(Array(vec![Null])));
3067 assert_eq!(from_str("[3, 1]"),
3068 Ok(Array(vec![U64(3), U64(1)])));
3069 assert_eq!(from_str("\n[3, 2]\n"),
3070 Ok(Array(vec![U64(3), U64(2)])));
3071 assert_eq!(from_str("[2, [4, 1]]"),
3072 Ok(Array(vec![U64(2), Array(vec![U64(4), U64(1)])])));
3073 }
3074
3075 #[test]
3076 fn test_decode_array() {
3077 let v: Vec<()> = super::decode("[]").unwrap();
c34b1796 3078 assert_eq!(v, []);
1a4d82fc
JJ
3079
3080 let v: Vec<()> = super::decode("[null]").unwrap();
c34b1796 3081 assert_eq!(v, [()]);
1a4d82fc
JJ
3082
3083 let v: Vec<bool> = super::decode("[true]").unwrap();
c34b1796 3084 assert_eq!(v, [true]);
1a4d82fc 3085
c34b1796
AL
3086 let v: Vec<isize> = super::decode("[3, 1]").unwrap();
3087 assert_eq!(v, [3, 1]);
1a4d82fc 3088
c34b1796
AL
3089 let v: Vec<Vec<usize>> = super::decode("[[3], [1, 2]]").unwrap();
3090 assert_eq!(v, [vec![3], vec![1, 2]]);
1a4d82fc
JJ
3091 }
3092
3093 #[test]
3094 fn test_decode_tuple() {
c34b1796 3095 let t: (usize, usize, usize) = super::decode("[1, 2, 3]").unwrap();
85aaf69f 3096 assert_eq!(t, (1, 2, 3));
1a4d82fc 3097
c34b1796 3098 let t: (usize, string::String) = super::decode("[1, \"two\"]").unwrap();
85aaf69f 3099 assert_eq!(t, (1, "two".to_string()));
1a4d82fc
JJ
3100 }
3101
3102 #[test]
3103 fn test_decode_tuple_malformed_types() {
c34b1796 3104 assert!(super::decode::<(usize, string::String)>("[1, 2]").is_err());
1a4d82fc
JJ
3105 }
3106
3107 #[test]
3108 fn test_decode_tuple_malformed_length() {
c34b1796 3109 assert!(super::decode::<(usize, usize)>("[1, 2, 3]").is_err());
1a4d82fc
JJ
3110 }
3111
3112 #[test]
3113 fn test_read_object() {
3114 assert_eq!(from_str("{"), Err(SyntaxError(EOFWhileParsingObject, 1, 2)));
3115 assert_eq!(from_str("{ "), Err(SyntaxError(EOFWhileParsingObject, 1, 3)));
3116 assert_eq!(from_str("{1"), Err(SyntaxError(KeyMustBeAString, 1, 2)));
3117 assert_eq!(from_str("{ \"a\""), Err(SyntaxError(EOFWhileParsingObject, 1, 6)));
3118 assert_eq!(from_str("{\"a\""), Err(SyntaxError(EOFWhileParsingObject, 1, 5)));
3119 assert_eq!(from_str("{\"a\" "), Err(SyntaxError(EOFWhileParsingObject, 1, 6)));
3120
3121 assert_eq!(from_str("{\"a\" 1"), Err(SyntaxError(ExpectedColon, 1, 6)));
3122 assert_eq!(from_str("{\"a\":"), Err(SyntaxError(EOFWhileParsingValue, 1, 6)));
3123 assert_eq!(from_str("{\"a\":1"), Err(SyntaxError(EOFWhileParsingObject, 1, 7)));
3124 assert_eq!(from_str("{\"a\":1 1"), Err(SyntaxError(InvalidSyntax, 1, 8)));
3125 assert_eq!(from_str("{\"a\":1,"), Err(SyntaxError(EOFWhileParsingObject, 1, 8)));
3126
3127 assert_eq!(from_str("{}").unwrap(), mk_object(&[]));
3128 assert_eq!(from_str("{\"a\": 3}").unwrap(),
3129 mk_object(&[("a".to_string(), U64(3))]));
3130
3131 assert_eq!(from_str(
3132 "{ \"a\": null, \"b\" : true }").unwrap(),
3133 mk_object(&[
3134 ("a".to_string(), Null),
3135 ("b".to_string(), Boolean(true))]));
3136 assert_eq!(from_str("\n{ \"a\": null, \"b\" : true }\n").unwrap(),
3137 mk_object(&[
3138 ("a".to_string(), Null),
3139 ("b".to_string(), Boolean(true))]));
3140 assert_eq!(from_str(
3141 "{\"a\" : 1.0 ,\"b\": [ true ]}").unwrap(),
3142 mk_object(&[
3143 ("a".to_string(), F64(1.0)),
3144 ("b".to_string(), Array(vec![Boolean(true)]))
3145 ]));
3146 assert_eq!(from_str(
3147 "{\
3148 \"a\": 1.0, \
3149 \"b\": [\
3150 true,\
3151 \"foo\\nbar\", \
3152 { \"c\": {\"d\": null} } \
3153 ]\
3154 }").unwrap(),
3155 mk_object(&[
3156 ("a".to_string(), F64(1.0)),
3157 ("b".to_string(), Array(vec![
3158 Boolean(true),
3159 String("foo\nbar".to_string()),
3160 mk_object(&[
3161 ("c".to_string(), mk_object(&[("d".to_string(), Null)]))
3162 ])
3163 ]))
3164 ]));
3165 }
3166
3167 #[test]
3168 fn test_decode_struct() {
3169 let s = "{
3170 \"inner\": [
3171 { \"a\": null, \"b\": 2, \"c\": [\"abc\", \"xyz\"] }
3172 ]
3173 }";
3174
3175 let v: Outer = super::decode(s).unwrap();
3176 assert_eq!(
3177 v,
3178 Outer {
3179 inner: vec![
3180 Inner { a: (), b: 2, c: vec!["abc".to_string(), "xyz".to_string()] }
3181 ]
3182 }
3183 );
3184 }
3185
3186 #[derive(RustcDecodable)]
3187 struct FloatStruct {
3188 f: f64,
3189 a: Vec<f64>
3190 }
3191 #[test]
3192 fn test_decode_struct_with_nan() {
3193 let s = "{\"f\":null,\"a\":[null,123]}";
3194 let obj: FloatStruct = super::decode(s).unwrap();
3195 assert!(obj.f.is_nan());
3196 assert!(obj.a[0].is_nan());
3197 assert_eq!(obj.a[1], 123f64);
3198 }
3199
3200 #[test]
3201 fn test_decode_option() {
3202 let value: Option<string::String> = super::decode("null").unwrap();
3203 assert_eq!(value, None);
3204
3205 let value: Option<string::String> = super::decode("\"jodhpurs\"").unwrap();
3206 assert_eq!(value, Some("jodhpurs".to_string()));
3207 }
3208
3209 #[test]
3210 fn test_decode_enum() {
3211 let value: Animal = super::decode("\"Dog\"").unwrap();
3212 assert_eq!(value, Dog);
3213
3214 let s = "{\"variant\":\"Frog\",\"fields\":[\"Henry\",349]}";
3215 let value: Animal = super::decode(s).unwrap();
3216 assert_eq!(value, Frog("Henry".to_string(), 349));
3217 }
3218
3219 #[test]
3220 fn test_decode_map() {
3221 let s = "{\"a\": \"Dog\", \"b\": {\"variant\":\"Frog\",\
3222 \"fields\":[\"Henry\", 349]}}";
3223 let mut map: BTreeMap<string::String, Animal> = super::decode(s).unwrap();
3224
3225 assert_eq!(map.remove(&"a".to_string()), Some(Dog));
3226 assert_eq!(map.remove(&"b".to_string()), Some(Frog("Henry".to_string(), 349)));
3227 }
3228
3229 #[test]
3230 fn test_multiline_errors() {
3231 assert_eq!(from_str("{\n \"foo\":\n \"bar\""),
85aaf69f 3232 Err(SyntaxError(EOFWhileParsingObject, 3, 8)));
1a4d82fc
JJ
3233 }
3234
3235 #[derive(RustcDecodable)]
3236 #[allow(dead_code)]
3237 struct DecodeStruct {
3238 x: f64,
3239 y: bool,
3240 z: string::String,
3241 w: Vec<DecodeStruct>
3242 }
3243 #[derive(RustcDecodable)]
3244 enum DecodeEnum {
3245 A(f64),
3246 B(string::String)
3247 }
3248 fn check_err<T: Decodable>(to_parse: &'static str, expected: DecoderError) {
3249 let res: DecodeResult<T> = match from_str(to_parse) {
3250 Err(e) => Err(ParseError(e)),
3251 Ok(json) => Decodable::decode(&mut Decoder::new(json))
3252 };
3253 match res {
3254 Ok(_) => panic!("`{:?}` parsed & decoded ok, expecting error `{:?}`",
3255 to_parse, expected),
3256 Err(ParseError(e)) => panic!("`{:?}` is not valid json: {:?}",
3257 to_parse, e),
3258 Err(e) => {
3259 assert_eq!(e, expected);
3260 }
3261 }
3262 }
3263 #[test]
3264 fn test_decode_errors_struct() {
3265 check_err::<DecodeStruct>("[]", ExpectedError("Object".to_string(), "[]".to_string()));
3266 check_err::<DecodeStruct>("{\"x\": true, \"y\": true, \"z\": \"\", \"w\": []}",
3267 ExpectedError("Number".to_string(), "true".to_string()));
3268 check_err::<DecodeStruct>("{\"x\": 1, \"y\": [], \"z\": \"\", \"w\": []}",
3269 ExpectedError("Boolean".to_string(), "[]".to_string()));
3270 check_err::<DecodeStruct>("{\"x\": 1, \"y\": true, \"z\": {}, \"w\": []}",
3271 ExpectedError("String".to_string(), "{}".to_string()));
3272 check_err::<DecodeStruct>("{\"x\": 1, \"y\": true, \"z\": \"\", \"w\": null}",
3273 ExpectedError("Array".to_string(), "null".to_string()));
3274 check_err::<DecodeStruct>("{\"x\": 1, \"y\": true, \"z\": \"\"}",
3275 MissingFieldError("w".to_string()));
3276 }
3277 #[test]
3278 fn test_decode_errors_enum() {
3279 check_err::<DecodeEnum>("{}",
3280 MissingFieldError("variant".to_string()));
3281 check_err::<DecodeEnum>("{\"variant\": 1}",
3282 ExpectedError("String".to_string(), "1".to_string()));
3283 check_err::<DecodeEnum>("{\"variant\": \"A\"}",
3284 MissingFieldError("fields".to_string()));
3285 check_err::<DecodeEnum>("{\"variant\": \"A\", \"fields\": null}",
3286 ExpectedError("Array".to_string(), "null".to_string()));
3287 check_err::<DecodeEnum>("{\"variant\": \"C\", \"fields\": []}",
3288 UnknownVariantError("C".to_string()));
3289 }
3290
3291 #[test]
3292 fn test_find(){
3293 let json_value = from_str("{\"dog\" : \"cat\"}").unwrap();
3294 let found_str = json_value.find("dog");
3295 assert!(found_str.unwrap().as_string().unwrap() == "cat");
3296 }
3297
3298 #[test]
3299 fn test_find_path(){
3300 let json_value = from_str("{\"dog\":{\"cat\": {\"mouse\" : \"cheese\"}}}").unwrap();
3301 let found_str = json_value.find_path(&["dog", "cat", "mouse"]);
3302 assert!(found_str.unwrap().as_string().unwrap() == "cheese");
3303 }
3304
3305 #[test]
3306 fn test_search(){
3307 let json_value = from_str("{\"dog\":{\"cat\": {\"mouse\" : \"cheese\"}}}").unwrap();
3308 let found_str = json_value.search("mouse").and_then(|j| j.as_string());
3309 assert!(found_str.unwrap() == "cheese");
3310 }
3311
3312 #[test]
3313 fn test_index(){
3314 let json_value = from_str("{\"animals\":[\"dog\",\"cat\",\"mouse\"]}").unwrap();
3315 let ref array = json_value["animals"];
3316 assert_eq!(array[0].as_string().unwrap(), "dog");
3317 assert_eq!(array[1].as_string().unwrap(), "cat");
3318 assert_eq!(array[2].as_string().unwrap(), "mouse");
3319 }
3320
3321 #[test]
3322 fn test_is_object(){
3323 let json_value = from_str("{}").unwrap();
3324 assert!(json_value.is_object());
3325 }
3326
3327 #[test]
3328 fn test_as_object(){
3329 let json_value = from_str("{}").unwrap();
3330 let json_object = json_value.as_object();
3331 assert!(json_object.is_some());
3332 }
3333
3334 #[test]
3335 fn test_is_array(){
3336 let json_value = from_str("[1, 2, 3]").unwrap();
3337 assert!(json_value.is_array());
3338 }
3339
3340 #[test]
3341 fn test_as_array(){
3342 let json_value = from_str("[1, 2, 3]").unwrap();
3343 let json_array = json_value.as_array();
3344 let expected_length = 3;
3345 assert!(json_array.is_some() && json_array.unwrap().len() == expected_length);
3346 }
3347
3348 #[test]
3349 fn test_is_string(){
3350 let json_value = from_str("\"dog\"").unwrap();
3351 assert!(json_value.is_string());
3352 }
3353
3354 #[test]
3355 fn test_as_string(){
3356 let json_value = from_str("\"dog\"").unwrap();
3357 let json_str = json_value.as_string();
3358 let expected_str = "dog";
3359 assert_eq!(json_str, Some(expected_str));
3360 }
3361
3362 #[test]
3363 fn test_is_number(){
3364 let json_value = from_str("12").unwrap();
3365 assert!(json_value.is_number());
3366 }
3367
3368 #[test]
3369 fn test_is_i64(){
3370 let json_value = from_str("-12").unwrap();
3371 assert!(json_value.is_i64());
3372
3373 let json_value = from_str("12").unwrap();
3374 assert!(!json_value.is_i64());
3375
3376 let json_value = from_str("12.0").unwrap();
3377 assert!(!json_value.is_i64());
3378 }
3379
3380 #[test]
3381 fn test_is_u64(){
3382 let json_value = from_str("12").unwrap();
3383 assert!(json_value.is_u64());
3384
3385 let json_value = from_str("-12").unwrap();
3386 assert!(!json_value.is_u64());
3387
3388 let json_value = from_str("12.0").unwrap();
3389 assert!(!json_value.is_u64());
3390 }
3391
3392 #[test]
3393 fn test_is_f64(){
3394 let json_value = from_str("12").unwrap();
3395 assert!(!json_value.is_f64());
3396
3397 let json_value = from_str("-12").unwrap();
3398 assert!(!json_value.is_f64());
3399
3400 let json_value = from_str("12.0").unwrap();
3401 assert!(json_value.is_f64());
3402
3403 let json_value = from_str("-12.0").unwrap();
3404 assert!(json_value.is_f64());
3405 }
3406
3407 #[test]
3408 fn test_as_i64(){
3409 let json_value = from_str("-12").unwrap();
3410 let json_num = json_value.as_i64();
3411 assert_eq!(json_num, Some(-12));
3412 }
3413
3414 #[test]
3415 fn test_as_u64(){
3416 let json_value = from_str("12").unwrap();
3417 let json_num = json_value.as_u64();
3418 assert_eq!(json_num, Some(12));
3419 }
3420
3421 #[test]
3422 fn test_as_f64(){
3423 let json_value = from_str("12.0").unwrap();
3424 let json_num = json_value.as_f64();
3425 assert_eq!(json_num, Some(12f64));
3426 }
3427
3428 #[test]
3429 fn test_is_boolean(){
3430 let json_value = from_str("false").unwrap();
3431 assert!(json_value.is_boolean());
3432 }
3433
3434 #[test]
3435 fn test_as_boolean(){
3436 let json_value = from_str("false").unwrap();
3437 let json_bool = json_value.as_boolean();
3438 let expected_bool = false;
3439 assert!(json_bool.is_some() && json_bool.unwrap() == expected_bool);
3440 }
3441
3442 #[test]
3443 fn test_is_null(){
3444 let json_value = from_str("null").unwrap();
3445 assert!(json_value.is_null());
3446 }
3447
3448 #[test]
3449 fn test_as_null(){
3450 let json_value = from_str("null").unwrap();
3451 let json_null = json_value.as_null();
3452 let expected_null = ();
3453 assert!(json_null.is_some() && json_null.unwrap() == expected_null);
3454 }
3455
3456 #[test]
3457 fn test_encode_hashmap_with_numeric_key() {
3458 use std::str::from_utf8;
1a4d82fc 3459 use std::collections::HashMap;
c34b1796 3460 let mut hm: HashMap<usize, bool> = HashMap::new();
1a4d82fc
JJ
3461 hm.insert(1, true);
3462 let mut mem_buf = Vec::new();
3463 write!(&mut mem_buf, "{}", super::as_pretty_json(&hm)).unwrap();
85aaf69f 3464 let json_str = from_utf8(&mem_buf[..]).unwrap();
1a4d82fc
JJ
3465 match from_str(json_str) {
3466 Err(_) => panic!("Unable to parse json_str: {:?}", json_str),
3467 _ => {} // it parsed and we are good to go
3468 }
3469 }
3470
3471 #[test]
3472 fn test_prettyencode_hashmap_with_numeric_key() {
3473 use std::str::from_utf8;
1a4d82fc 3474 use std::collections::HashMap;
c34b1796 3475 let mut hm: HashMap<usize, bool> = HashMap::new();
1a4d82fc
JJ
3476 hm.insert(1, true);
3477 let mut mem_buf = Vec::new();
3478 write!(&mut mem_buf, "{}", super::as_pretty_json(&hm)).unwrap();
85aaf69f 3479 let json_str = from_utf8(&mem_buf[..]).unwrap();
1a4d82fc
JJ
3480 match from_str(json_str) {
3481 Err(_) => panic!("Unable to parse json_str: {:?}", json_str),
3482 _ => {} // it parsed and we are good to go
3483 }
3484 }
3485
3486 #[test]
3487 fn test_prettyencoder_indent_level_param() {
3488 use std::str::from_utf8;
3489 use std::collections::BTreeMap;
3490
3491 let mut tree = BTreeMap::new();
3492
3493 tree.insert("hello".to_string(), String("guten tag".to_string()));
3494 tree.insert("goodbye".to_string(), String("sayonara".to_string()));
3495
3496 let json = Array(
3497 // The following layout below should look a lot like
3498 // the pretty-printed JSON (indent * x)
3499 vec!
3500 ( // 0x
3501 String("greetings".to_string()), // 1x
3502 Object(tree), // 1x + 2x + 2x + 1x
3503 ) // 0x
3504 // End JSON array (7 lines)
3505 );
3506
3507 // Helper function for counting indents
c34b1796 3508 fn indents(source: &str) -> usize {
1a4d82fc
JJ
3509 let trimmed = source.trim_left_matches(' ');
3510 source.len() - trimmed.len()
3511 }
3512
3513 // Test up to 4 spaces of indents (more?)
85aaf69f 3514 for i in 0..4 {
1a4d82fc
JJ
3515 let mut writer = Vec::new();
3516 write!(&mut writer, "{}",
3517 super::as_pretty_json(&json).indent(i)).unwrap();
3518
85aaf69f 3519 let printed = from_utf8(&writer[..]).unwrap();
1a4d82fc
JJ
3520
3521 // Check for indents at each line
3522 let lines: Vec<&str> = printed.lines().collect();
3523 assert_eq!(lines.len(), 7); // JSON should be 7 lines
3524
3525 assert_eq!(indents(lines[0]), 0 * i); // [
3526 assert_eq!(indents(lines[1]), 1 * i); // "greetings",
3527 assert_eq!(indents(lines[2]), 1 * i); // {
3528 assert_eq!(indents(lines[3]), 2 * i); // "hello": "guten tag",
3529 assert_eq!(indents(lines[4]), 2 * i); // "goodbye": "sayonara"
3530 assert_eq!(indents(lines[5]), 1 * i); // },
3531 assert_eq!(indents(lines[6]), 0 * i); // ]
3532
3533 // Finally, test that the pretty-printed JSON is valid
3534 from_str(printed).ok().expect("Pretty-printed JSON is invalid!");
3535 }
3536 }
3537
85aaf69f
SL
3538 #[test]
3539 fn test_hashmap_with_enum_key() {
3540 use std::collections::HashMap;
3541 use json;
3542 #[derive(RustcEncodable, Eq, Hash, PartialEq, RustcDecodable, Debug)]
3543 enum Enum {
3544 Foo,
3545 #[allow(dead_code)]
3546 Bar,
3547 }
3548 let mut map = HashMap::new();
3549 map.insert(Enum::Foo, 0);
3550 let result = json::encode(&map).unwrap();
3551 assert_eq!(&result[..], r#"{"Foo":0}"#);
3552 let decoded: HashMap<Enum, _> = json::decode(&result).unwrap();
3553 assert_eq!(map, decoded);
3554 }
3555
1a4d82fc
JJ
3556 #[test]
3557 fn test_hashmap_with_numeric_key_can_handle_double_quote_delimited_key() {
3558 use std::collections::HashMap;
3559 use Decodable;
3560 let json_str = "{\"1\":true}";
3561 let json_obj = match from_str(json_str) {
3562 Err(_) => panic!("Unable to parse json_str: {:?}", json_str),
3563 Ok(o) => o
3564 };
3565 let mut decoder = Decoder::new(json_obj);
c34b1796 3566 let _hm: HashMap<usize, bool> = Decodable::decode(&mut decoder).unwrap();
1a4d82fc
JJ
3567 }
3568
3569 #[test]
3570 fn test_hashmap_with_numeric_key_will_error_with_string_keys() {
3571 use std::collections::HashMap;
3572 use Decodable;
3573 let json_str = "{\"a\":true}";
3574 let json_obj = match from_str(json_str) {
3575 Err(_) => panic!("Unable to parse json_str: {:?}", json_str),
3576 Ok(o) => o
3577 };
3578 let mut decoder = Decoder::new(json_obj);
c34b1796 3579 let result: Result<HashMap<usize, bool>, DecoderError> = Decodable::decode(&mut decoder);
1a4d82fc
JJ
3580 assert_eq!(result, Err(ExpectedError("Number".to_string(), "a".to_string())));
3581 }
3582
3583 fn assert_stream_equal(src: &str,
3584 expected: Vec<(JsonEvent, Vec<StackElement>)>) {
3585 let mut parser = Parser::new(src.chars());
3586 let mut i = 0;
3587 loop {
3588 let evt = match parser.next() {
3589 Some(e) => e,
3590 None => { break; }
3591 };
3592 let (ref expected_evt, ref expected_stack) = expected[i];
85aaf69f 3593 if !parser.stack().is_equal_to(expected_stack) {
1a4d82fc
JJ
3594 panic!("Parser stack is not equal to {:?}", expected_stack);
3595 }
3596 assert_eq!(&evt, expected_evt);
3597 i+=1;
3598 }
3599 }
3600 #[test]
3601 #[cfg_attr(target_pointer_width = "32", ignore)] // FIXME(#14064)
3602 fn test_streaming_parser() {
3603 assert_stream_equal(
3604 r#"{ "foo":"bar", "array" : [0, 1, 2, 3, 4, 5], "idents":[null,true,false]}"#,
3605 vec![
3606 (ObjectStart, vec![]),
3607 (StringValue("bar".to_string()), vec![StackElement::Key("foo")]),
3608 (ArrayStart, vec![StackElement::Key("array")]),
3609 (U64Value(0), vec![StackElement::Key("array"), StackElement::Index(0)]),
3610 (U64Value(1), vec![StackElement::Key("array"), StackElement::Index(1)]),
3611 (U64Value(2), vec![StackElement::Key("array"), StackElement::Index(2)]),
3612 (U64Value(3), vec![StackElement::Key("array"), StackElement::Index(3)]),
3613 (U64Value(4), vec![StackElement::Key("array"), StackElement::Index(4)]),
3614 (U64Value(5), vec![StackElement::Key("array"), StackElement::Index(5)]),
3615 (ArrayEnd, vec![StackElement::Key("array")]),
3616 (ArrayStart, vec![StackElement::Key("idents")]),
3617 (NullValue, vec![StackElement::Key("idents"),
3618 StackElement::Index(0)]),
3619 (BooleanValue(true), vec![StackElement::Key("idents"),
3620 StackElement::Index(1)]),
3621 (BooleanValue(false), vec![StackElement::Key("idents"),
3622 StackElement::Index(2)]),
3623 (ArrayEnd, vec![StackElement::Key("idents")]),
3624 (ObjectEnd, vec![]),
3625 ]
3626 );
3627 }
3628 fn last_event(src: &str) -> JsonEvent {
3629 let mut parser = Parser::new(src.chars());
3630 let mut evt = NullValue;
3631 loop {
3632 evt = match parser.next() {
3633 Some(e) => e,
3634 None => return evt,
3635 }
3636 }
3637 }
3638
3639 #[test]
3640 #[cfg_attr(target_pointer_width = "32", ignore)] // FIXME(#14064)
3641 fn test_read_object_streaming() {
3642 assert_eq!(last_event("{ "), Error(SyntaxError(EOFWhileParsingObject, 1, 3)));
3643 assert_eq!(last_event("{1"), Error(SyntaxError(KeyMustBeAString, 1, 2)));
3644 assert_eq!(last_event("{ \"a\""), Error(SyntaxError(EOFWhileParsingObject, 1, 6)));
3645 assert_eq!(last_event("{\"a\""), Error(SyntaxError(EOFWhileParsingObject, 1, 5)));
3646 assert_eq!(last_event("{\"a\" "), Error(SyntaxError(EOFWhileParsingObject, 1, 6)));
3647
3648 assert_eq!(last_event("{\"a\" 1"), Error(SyntaxError(ExpectedColon, 1, 6)));
3649 assert_eq!(last_event("{\"a\":"), Error(SyntaxError(EOFWhileParsingValue, 1, 6)));
3650 assert_eq!(last_event("{\"a\":1"), Error(SyntaxError(EOFWhileParsingObject, 1, 7)));
3651 assert_eq!(last_event("{\"a\":1 1"), Error(SyntaxError(InvalidSyntax, 1, 8)));
3652 assert_eq!(last_event("{\"a\":1,"), Error(SyntaxError(EOFWhileParsingObject, 1, 8)));
3653 assert_eq!(last_event("{\"a\":1,}"), Error(SyntaxError(TrailingComma, 1, 8)));
3654
3655 assert_stream_equal(
3656 "{}",
3657 vec![(ObjectStart, vec![]), (ObjectEnd, vec![])]
3658 );
3659 assert_stream_equal(
3660 "{\"a\": 3}",
3661 vec![
3662 (ObjectStart, vec![]),
3663 (U64Value(3), vec![StackElement::Key("a")]),
3664 (ObjectEnd, vec![]),
3665 ]
3666 );
3667 assert_stream_equal(
3668 "{ \"a\": null, \"b\" : true }",
3669 vec![
3670 (ObjectStart, vec![]),
3671 (NullValue, vec![StackElement::Key("a")]),
3672 (BooleanValue(true), vec![StackElement::Key("b")]),
3673 (ObjectEnd, vec![]),
3674 ]
3675 );
3676 assert_stream_equal(
3677 "{\"a\" : 1.0 ,\"b\": [ true ]}",
3678 vec![
3679 (ObjectStart, vec![]),
3680 (F64Value(1.0), vec![StackElement::Key("a")]),
3681 (ArrayStart, vec![StackElement::Key("b")]),
3682 (BooleanValue(true),vec![StackElement::Key("b"), StackElement::Index(0)]),
3683 (ArrayEnd, vec![StackElement::Key("b")]),
3684 (ObjectEnd, vec![]),
3685 ]
3686 );
3687 assert_stream_equal(
3688 r#"{
3689 "a": 1.0,
3690 "b": [
3691 true,
3692 "foo\nbar",
3693 { "c": {"d": null} }
3694 ]
3695 }"#,
3696 vec![
3697 (ObjectStart, vec![]),
3698 (F64Value(1.0), vec![StackElement::Key("a")]),
3699 (ArrayStart, vec![StackElement::Key("b")]),
3700 (BooleanValue(true), vec![StackElement::Key("b"),
3701 StackElement::Index(0)]),
3702 (StringValue("foo\nbar".to_string()), vec![StackElement::Key("b"),
3703 StackElement::Index(1)]),
3704 (ObjectStart, vec![StackElement::Key("b"),
3705 StackElement::Index(2)]),
3706 (ObjectStart, vec![StackElement::Key("b"),
3707 StackElement::Index(2),
3708 StackElement::Key("c")]),
3709 (NullValue, vec![StackElement::Key("b"),
3710 StackElement::Index(2),
3711 StackElement::Key("c"),
3712 StackElement::Key("d")]),
3713 (ObjectEnd, vec![StackElement::Key("b"),
3714 StackElement::Index(2),
3715 StackElement::Key("c")]),
3716 (ObjectEnd, vec![StackElement::Key("b"),
3717 StackElement::Index(2)]),
3718 (ArrayEnd, vec![StackElement::Key("b")]),
3719 (ObjectEnd, vec![]),
3720 ]
3721 );
3722 }
3723 #[test]
3724 #[cfg_attr(target_pointer_width = "32", ignore)] // FIXME(#14064)
3725 fn test_read_array_streaming() {
3726 assert_stream_equal(
3727 "[]",
3728 vec![
3729 (ArrayStart, vec![]),
3730 (ArrayEnd, vec![]),
3731 ]
3732 );
3733 assert_stream_equal(
3734 "[ ]",
3735 vec![
3736 (ArrayStart, vec![]),
3737 (ArrayEnd, vec![]),
3738 ]
3739 );
3740 assert_stream_equal(
3741 "[true]",
3742 vec![
3743 (ArrayStart, vec![]),
3744 (BooleanValue(true), vec![StackElement::Index(0)]),
3745 (ArrayEnd, vec![]),
3746 ]
3747 );
3748 assert_stream_equal(
3749 "[ false ]",
3750 vec![
3751 (ArrayStart, vec![]),
3752 (BooleanValue(false), vec![StackElement::Index(0)]),
3753 (ArrayEnd, vec![]),
3754 ]
3755 );
3756 assert_stream_equal(
3757 "[null]",
3758 vec![
3759 (ArrayStart, vec![]),
3760 (NullValue, vec![StackElement::Index(0)]),
3761 (ArrayEnd, vec![]),
3762 ]
3763 );
3764 assert_stream_equal(
3765 "[3, 1]",
3766 vec![
3767 (ArrayStart, vec![]),
3768 (U64Value(3), vec![StackElement::Index(0)]),
3769 (U64Value(1), vec![StackElement::Index(1)]),
3770 (ArrayEnd, vec![]),
3771 ]
3772 );
3773 assert_stream_equal(
3774 "\n[3, 2]\n",
3775 vec![
3776 (ArrayStart, vec![]),
3777 (U64Value(3), vec![StackElement::Index(0)]),
3778 (U64Value(2), vec![StackElement::Index(1)]),
3779 (ArrayEnd, vec![]),
3780 ]
3781 );
3782 assert_stream_equal(
3783 "[2, [4, 1]]",
3784 vec![
3785 (ArrayStart, vec![]),
3786 (U64Value(2), vec![StackElement::Index(0)]),
3787 (ArrayStart, vec![StackElement::Index(1)]),
3788 (U64Value(4), vec![StackElement::Index(1), StackElement::Index(0)]),
3789 (U64Value(1), vec![StackElement::Index(1), StackElement::Index(1)]),
3790 (ArrayEnd, vec![StackElement::Index(1)]),
3791 (ArrayEnd, vec![]),
3792 ]
3793 );
3794
3795 assert_eq!(last_event("["), Error(SyntaxError(EOFWhileParsingValue, 1, 2)));
3796
3797 assert_eq!(from_str("["), Err(SyntaxError(EOFWhileParsingValue, 1, 2)));
3798 assert_eq!(from_str("[1"), Err(SyntaxError(EOFWhileParsingArray, 1, 3)));
3799 assert_eq!(from_str("[1,"), Err(SyntaxError(EOFWhileParsingValue, 1, 4)));
3800 assert_eq!(from_str("[1,]"), Err(SyntaxError(InvalidSyntax, 1, 4)));
3801 assert_eq!(from_str("[6 7]"), Err(SyntaxError(InvalidSyntax, 1, 4)));
3802
3803 }
3804 #[test]
3805 fn test_trailing_characters_streaming() {
3806 assert_eq!(last_event("nulla"), Error(SyntaxError(TrailingCharacters, 1, 5)));
3807 assert_eq!(last_event("truea"), Error(SyntaxError(TrailingCharacters, 1, 5)));
3808 assert_eq!(last_event("falsea"), Error(SyntaxError(TrailingCharacters, 1, 6)));
3809 assert_eq!(last_event("1a"), Error(SyntaxError(TrailingCharacters, 1, 2)));
3810 assert_eq!(last_event("[]a"), Error(SyntaxError(TrailingCharacters, 1, 3)));
3811 assert_eq!(last_event("{}a"), Error(SyntaxError(TrailingCharacters, 1, 3)));
3812 }
3813 #[test]
3814 fn test_read_identifiers_streaming() {
3815 assert_eq!(Parser::new("null".chars()).next(), Some(NullValue));
3816 assert_eq!(Parser::new("true".chars()).next(), Some(BooleanValue(true)));
3817 assert_eq!(Parser::new("false".chars()).next(), Some(BooleanValue(false)));
3818
3819 assert_eq!(last_event("n"), Error(SyntaxError(InvalidSyntax, 1, 2)));
3820 assert_eq!(last_event("nul"), Error(SyntaxError(InvalidSyntax, 1, 4)));
3821 assert_eq!(last_event("t"), Error(SyntaxError(InvalidSyntax, 1, 2)));
3822 assert_eq!(last_event("truz"), Error(SyntaxError(InvalidSyntax, 1, 4)));
3823 assert_eq!(last_event("f"), Error(SyntaxError(InvalidSyntax, 1, 2)));
3824 assert_eq!(last_event("faz"), Error(SyntaxError(InvalidSyntax, 1, 3)));
3825 }
3826
3827 #[test]
3828 fn test_stack() {
3829 let mut stack = Stack::new();
3830
3831 assert!(stack.is_empty());
9346a6ac 3832 assert!(stack.is_empty());
1a4d82fc
JJ
3833 assert!(!stack.last_is_index());
3834
3835 stack.push_index(0);
3836 stack.bump_index();
3837
3838 assert!(stack.len() == 1);
3839 assert!(stack.is_equal_to(&[StackElement::Index(1)]));
3840 assert!(stack.starts_with(&[StackElement::Index(1)]));
3841 assert!(stack.ends_with(&[StackElement::Index(1)]));
3842 assert!(stack.last_is_index());
3843 assert!(stack.get(0) == StackElement::Index(1));
3844
3845 stack.push_key("foo".to_string());
3846
3847 assert!(stack.len() == 2);
3848 assert!(stack.is_equal_to(&[StackElement::Index(1), StackElement::Key("foo")]));
3849 assert!(stack.starts_with(&[StackElement::Index(1), StackElement::Key("foo")]));
3850 assert!(stack.starts_with(&[StackElement::Index(1)]));
3851 assert!(stack.ends_with(&[StackElement::Index(1), StackElement::Key("foo")]));
3852 assert!(stack.ends_with(&[StackElement::Key("foo")]));
3853 assert!(!stack.last_is_index());
3854 assert!(stack.get(0) == StackElement::Index(1));
3855 assert!(stack.get(1) == StackElement::Key("foo"));
3856
3857 stack.push_key("bar".to_string());
3858
3859 assert!(stack.len() == 3);
3860 assert!(stack.is_equal_to(&[StackElement::Index(1),
3861 StackElement::Key("foo"),
3862 StackElement::Key("bar")]));
3863 assert!(stack.starts_with(&[StackElement::Index(1)]));
3864 assert!(stack.starts_with(&[StackElement::Index(1), StackElement::Key("foo")]));
3865 assert!(stack.starts_with(&[StackElement::Index(1),
3866 StackElement::Key("foo"),
3867 StackElement::Key("bar")]));
3868 assert!(stack.ends_with(&[StackElement::Key("bar")]));
3869 assert!(stack.ends_with(&[StackElement::Key("foo"), StackElement::Key("bar")]));
3870 assert!(stack.ends_with(&[StackElement::Index(1),
3871 StackElement::Key("foo"),
3872 StackElement::Key("bar")]));
3873 assert!(!stack.last_is_index());
3874 assert!(stack.get(0) == StackElement::Index(1));
3875 assert!(stack.get(1) == StackElement::Key("foo"));
3876 assert!(stack.get(2) == StackElement::Key("bar"));
3877
3878 stack.pop();
3879
3880 assert!(stack.len() == 2);
3881 assert!(stack.is_equal_to(&[StackElement::Index(1), StackElement::Key("foo")]));
3882 assert!(stack.starts_with(&[StackElement::Index(1), StackElement::Key("foo")]));
3883 assert!(stack.starts_with(&[StackElement::Index(1)]));
3884 assert!(stack.ends_with(&[StackElement::Index(1), StackElement::Key("foo")]));
3885 assert!(stack.ends_with(&[StackElement::Key("foo")]));
3886 assert!(!stack.last_is_index());
3887 assert!(stack.get(0) == StackElement::Index(1));
3888 assert!(stack.get(1) == StackElement::Key("foo"));
3889 }
3890
3891 #[test]
3892 fn test_to_json() {
3893 use std::collections::{HashMap,BTreeMap};
3894 use super::ToJson;
3895
3896 let array2 = Array(vec!(U64(1), U64(2)));
3897 let array3 = Array(vec!(U64(1), U64(2), U64(3)));
3898 let object = {
3899 let mut tree_map = BTreeMap::new();
3900 tree_map.insert("a".to_string(), U64(1));
3901 tree_map.insert("b".to_string(), U64(2));
3902 Object(tree_map)
3903 };
3904
3905 assert_eq!(array2.to_json(), array2);
3906 assert_eq!(object.to_json(), object);
85aaf69f 3907 assert_eq!(3_isize.to_json(), I64(3));
1a4d82fc
JJ
3908 assert_eq!(4_i8.to_json(), I64(4));
3909 assert_eq!(5_i16.to_json(), I64(5));
3910 assert_eq!(6_i32.to_json(), I64(6));
3911 assert_eq!(7_i64.to_json(), I64(7));
85aaf69f 3912 assert_eq!(8_usize.to_json(), U64(8));
1a4d82fc
JJ
3913 assert_eq!(9_u8.to_json(), U64(9));
3914 assert_eq!(10_u16.to_json(), U64(10));
3915 assert_eq!(11_u32.to_json(), U64(11));
3916 assert_eq!(12_u64.to_json(), U64(12));
3917 assert_eq!(13.0_f32.to_json(), F64(13.0_f64));
3918 assert_eq!(14.0_f64.to_json(), F64(14.0_f64));
3919 assert_eq!(().to_json(), Null);
3920 assert_eq!(f32::INFINITY.to_json(), Null);
3921 assert_eq!(f64::NAN.to_json(), Null);
3922 assert_eq!(true.to_json(), Boolean(true));
3923 assert_eq!(false.to_json(), Boolean(false));
3924 assert_eq!("abc".to_json(), String("abc".to_string()));
3925 assert_eq!("abc".to_string().to_json(), String("abc".to_string()));
85aaf69f
SL
3926 assert_eq!((1_usize, 2_usize).to_json(), array2);
3927 assert_eq!((1_usize, 2_usize, 3_usize).to_json(), array3);
3928 assert_eq!([1_usize, 2_usize].to_json(), array2);
3929 assert_eq!((&[1_usize, 2_usize, 3_usize]).to_json(), array3);
3930 assert_eq!((vec![1_usize, 2_usize]).to_json(), array2);
3931 assert_eq!(vec!(1_usize, 2_usize, 3_usize).to_json(), array3);
1a4d82fc 3932 let mut tree_map = BTreeMap::new();
85aaf69f 3933 tree_map.insert("a".to_string(), 1 as usize);
1a4d82fc
JJ
3934 tree_map.insert("b".to_string(), 2);
3935 assert_eq!(tree_map.to_json(), object);
3936 let mut hash_map = HashMap::new();
85aaf69f 3937 hash_map.insert("a".to_string(), 1 as usize);
1a4d82fc
JJ
3938 hash_map.insert("b".to_string(), 2);
3939 assert_eq!(hash_map.to_json(), object);
85aaf69f
SL
3940 assert_eq!(Some(15).to_json(), I64(15));
3941 assert_eq!(Some(15 as usize).to_json(), U64(15));
c34b1796 3942 assert_eq!(None::<isize>.to_json(), Null);
1a4d82fc
JJ
3943 }
3944
85aaf69f
SL
3945 #[test]
3946 fn test_encode_hashmap_with_arbitrary_key() {
85aaf69f 3947 use std::collections::HashMap;
85aaf69f 3948 #[derive(PartialEq, Eq, Hash, RustcEncodable)]
c34b1796 3949 struct ArbitraryType(usize);
85aaf69f
SL
3950 let mut hm: HashMap<ArbitraryType, bool> = HashMap::new();
3951 hm.insert(ArbitraryType(1), true);
3952 let mut mem_buf = string::String::new();
3953 let mut encoder = Encoder::new(&mut mem_buf);
3954 let result = hm.encode(&mut encoder);
3955 match result.err().unwrap() {
3956 EncoderError::BadHashmapKey => (),
3957 _ => panic!("expected bad hash map key")
3958 }
3959 }
3960
1a4d82fc
JJ
3961 #[bench]
3962 fn bench_streaming_small(b: &mut Bencher) {
3963 b.iter( || {
3964 let mut parser = Parser::new(
3965 r#"{
3966 "a": 1.0,
3967 "b": [
3968 true,
3969 "foo\nbar",
3970 { "c": {"d": null} }
3971 ]
3972 }"#.chars()
3973 );
3974 loop {
3975 match parser.next() {
3976 None => return,
3977 _ => {}
3978 }
3979 }
3980 });
3981 }
3982 #[bench]
3983 fn bench_small(b: &mut Bencher) {
3984 b.iter( || {
3985 let _ = from_str(r#"{
3986 "a": 1.0,
3987 "b": [
3988 true,
3989 "foo\nbar",
3990 { "c": {"d": null} }
3991 ]
3992 }"#);
3993 });
3994 }
3995
3996 fn big_json() -> string::String {
3997 let mut src = "[\n".to_string();
85aaf69f 3998 for _ in 0..500 {
1a4d82fc
JJ
3999 src.push_str(r#"{ "a": true, "b": null, "c":3.1415, "d": "Hello world", "e": \
4000 [1,2,3]},"#);
4001 }
4002 src.push_str("{}]");
4003 return src;
4004 }
4005
4006 #[bench]
4007 fn bench_streaming_large(b: &mut Bencher) {
4008 let src = big_json();
4009 b.iter( || {
4010 let mut parser = Parser::new(src.chars());
4011 loop {
4012 match parser.next() {
4013 None => return,
4014 _ => {}
4015 }
4016 }
4017 });
4018 }
4019 #[bench]
4020 fn bench_large(b: &mut Bencher) {
4021 let src = big_json();
85aaf69f 4022 b.iter( || { let _ = from_str(&src); });
1a4d82fc
JJ
4023 }
4024}