blob: fc1597ffed4456947aef9052bf38381c79b0d0ae [file] [log] [blame]
Graydon Hoare00c856c2012-12-04 00:48:011// Copyright 2012 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
Elly Jones656a2af2011-11-07 23:24:4411// Rust JSON serialization library
12// Copyright (c) 2011 Google Inc.
Patrick Walton5fb25462013-05-31 22:17:2213
Kevin Cantuc43426e2012-09-13 05:09:5514#[forbid(non_camel_case_types)];
Patrick Walton5fb25462013-05-31 22:17:2215#[allow(missing_doc)];
Elly Jonesbd726262011-11-07 19:01:2816
Gareth Daniel Smithbe014162012-07-04 21:53:1217//! json serialization
Brian Anderson95521c42012-03-08 02:17:3018
Patrick Waltonf3723cf2013-05-17 22:28:4419use core::prelude::*;
20
Huon Wilson4b806b42013-06-08 12:04:4621use core::iterator::IteratorUtil;
Patrick Walton206ab892013-05-25 02:35:2922use core::char;
23use core::float;
Daniel Micaycc148b52013-04-03 13:28:3624use core::hashmap::HashMap;
Patrick Walton206ab892013-05-25 02:35:2925use core::io::{WriterUtil, ReaderUtil};
26use core::io;
27use core::str;
28use core::to_str;
29use core::vec;
Erick Tryzelaarcefecd82013-03-13 18:29:0530
Patrick Waltoneb4d39e2013-01-26 00:57:3931use serialize::Encodable;
Patrick Walton57c59992012-12-23 22:41:3732use serialize;
Patrick Walton22b87572012-09-08 01:53:1433use sort::Sort;
Elly Jonesbd726262011-11-07 19:01:2834
Gareth Daniel Smithbe014162012-07-04 21:53:1235/// Represents a json value
Erick Tryzelaar49d00b22012-09-24 16:55:4236pub enum Json {
37 Number(float),
38 String(~str),
Ben Striegela605fd02012-08-11 14:08:4239 Boolean(bool),
Erick Tryzelaar49d00b22012-09-24 16:55:4240 List(List),
41 Object(~Object),
Ben Striegela605fd02012-08-11 14:08:4242 Null,
Elly Jonesbd726262011-11-07 19:01:2843}
44
Erick Tryzelaar49d00b22012-09-24 16:55:4245pub type List = ~[Json];
Daniel Micaycc148b52013-04-03 13:28:3646pub type Object = HashMap<~str, Json>;
Erick Tryzelaar49d00b22012-09-24 16:55:4247
Andrew Paseltiner45677ee2013-03-22 20:09:2048#[deriving(Eq)]
Alex Crichton39568502013-05-29 03:11:4149/// If an error occurs while parsing some JSON, this is the structure which is
50/// returned
Erick Tryzelaar49d00b22012-09-24 16:55:4251pub struct Error {
Alex Crichton39568502013-05-29 03:11:4152 /// The line number at which the error occurred
Erick Tryzelaar012dec52012-02-26 00:39:3253 line: uint,
Alex Crichton39568502013-05-29 03:11:4154 /// The column number at which the error occurred
Erick Tryzelaar012dec52012-02-26 00:39:3255 col: uint,
Alex Crichton39568502013-05-29 03:11:4156 /// A message describing the type of the error
Michael Sullivan92743dc2012-07-14 05:57:4857 msg: @~str,
Kevin Cantud47cb102012-08-30 23:39:5658}
59
Kevin Cantuc43426e2012-09-13 05:09:5560fn escape_str(s: &str) -> ~str {
Michael Sullivan92743dc2012-07-14 05:57:4861 let mut escaped = ~"\"";
Huon Wilson4b806b42013-06-08 12:04:4662 for s.iter().advance |c| {
Brian Andersonecaf9e32012-08-06 19:34:0863 match c {
Seo Sanghyeon8f803232013-05-23 16:09:1164 '"' => escaped += "\\\"",
65 '\\' => escaped += "\\\\",
66 '\x08' => escaped += "\\b",
67 '\x0c' => escaped += "\\f",
68 '\n' => escaped += "\\n",
69 '\r' => escaped += "\\r",
70 '\t' => escaped += "\\t",
Brian Anderson025d8662012-08-04 02:59:0471 _ => escaped += str::from_char(c)
Erick Tryzelaarb361f6c2012-06-13 00:20:5172 }
73 };
74
Seo Sanghyeon8f803232013-05-23 16:09:1175 escaped += "\"";
Erick Tryzelaarb361f6c2012-06-13 00:20:5176
77 escaped
78}
79
Erick Tryzelaar49d00b22012-09-24 16:55:4280fn spaces(n: uint) -> ~str {
81 let mut ss = ~"";
Tim Chevalier5a8ba072012-10-11 21:12:5082 for n.times { str::push_str(&mut ss, " "); }
Erick Tryzelaar49d00b22012-09-24 16:55:4283 return ss;
84}
85
Alex Crichton39568502013-05-29 03:11:4186/// A structure for implementing serialization to JSON.
Erick Tryzelaar8650c6f2012-12-18 03:31:0487pub struct Encoder {
Patrick Waltonb1c69982013-03-12 20:00:5088 priv wr: @io::Writer,
Erick Tryzelaar49d00b22012-09-24 16:55:4289}
90
Alex Crichton39568502013-05-29 03:11:4191/// Creates a new JSON encoder whose output will be written to the writer
92/// specified.
Patrick Waltonb1c69982013-03-12 20:00:5093pub fn Encoder(wr: @io::Writer) -> Encoder {
Patrick Waltondc5df612013-05-02 00:54:5494 Encoder {
95 wr: wr
96 }
Erick Tryzelaar49d00b22012-09-24 16:55:4297}
98
Patrick Waltondc5df612013-05-02 00:54:5499impl serialize::Encoder for Encoder {
100 fn emit_nil(&mut self) { self.wr.write_str("null") }
101
102 fn emit_uint(&mut self, v: uint) { self.emit_float(v as float); }
103 fn emit_u64(&mut self, v: u64) { self.emit_float(v as float); }
104 fn emit_u32(&mut self, v: u32) { self.emit_float(v as float); }
105 fn emit_u16(&mut self, v: u16) { self.emit_float(v as float); }
106 fn emit_u8(&mut self, v: u8) { self.emit_float(v as float); }
107
108 fn emit_int(&mut self, v: int) { self.emit_float(v as float); }
109 fn emit_i64(&mut self, v: i64) { self.emit_float(v as float); }
110 fn emit_i32(&mut self, v: i32) { self.emit_float(v as float); }
111 fn emit_i16(&mut self, v: i16) { self.emit_float(v as float); }
112 fn emit_i8(&mut self, v: i8) { self.emit_float(v as float); }
113
114 fn emit_bool(&mut self, v: bool) {
115 if v {
116 self.wr.write_str("true");
117 } else {
118 self.wr.write_str("false");
119 }
120 }
121
122 fn emit_f64(&mut self, v: f64) { self.emit_float(v as float); }
123 fn emit_f32(&mut self, v: f32) { self.emit_float(v as float); }
124 fn emit_float(&mut self, v: float) {
125 self.wr.write_str(float::to_str_digits(v, 6u));
126 }
127
128 fn emit_char(&mut self, v: char) { self.emit_str(str::from_char(v)) }
129 fn emit_str(&mut self, v: &str) { self.wr.write_str(escape_str(v)) }
130
131 fn emit_enum(&mut self, _name: &str, f: &fn(&mut Encoder)) { f(self) }
132
133 fn emit_enum_variant(&mut self,
134 name: &str,
135 _id: uint,
136 cnt: uint,
137 f: &fn(&mut Encoder)) {
138 // enums are encoded as strings or vectors:
139 // Bunny => "Bunny"
140 // Kangaroo(34,"William") => ["Kangaroo",[34,"William"]]
141
142 if cnt == 0 {
143 self.wr.write_str(escape_str(name));
144 } else {
145 self.wr.write_char('[');
146 self.wr.write_str(escape_str(name));
147 self.wr.write_char(',');
148 f(self);
149 self.wr.write_char(']');
150 }
151 }
152
153 fn emit_enum_variant_arg(&mut self, idx: uint, f: &fn(&mut Encoder)) {
154 if idx != 0 {
155 self.wr.write_char(',');
156 }
157 f(self);
158 }
159
160 fn emit_enum_struct_variant(&mut self,
161 name: &str,
162 id: uint,
163 cnt: uint,
164 f: &fn(&mut Encoder)) {
165 self.emit_enum_variant(name, id, cnt, f)
166 }
167
168 fn emit_enum_struct_variant_field(&mut self,
169 _: &str,
170 idx: uint,
171 f: &fn(&mut Encoder)) {
172 self.emit_enum_variant_arg(idx, f)
173 }
174
175 fn emit_struct(&mut self, _: &str, _: uint, f: &fn(&mut Encoder)) {
176 self.wr.write_char('{');
177 f(self);
178 self.wr.write_char('}');
179 }
180
181 fn emit_struct_field(&mut self,
182 name: &str,
183 idx: uint,
184 f: &fn(&mut Encoder)) {
185 if idx != 0 { self.wr.write_char(','); }
186 self.wr.write_str(escape_str(name));
187 self.wr.write_char(':');
188 f(self);
189 }
190
191 fn emit_tuple(&mut self, len: uint, f: &fn(&mut Encoder)) {
192 self.emit_seq(len, f)
193 }
194 fn emit_tuple_arg(&mut self, idx: uint, f: &fn(&mut Encoder)) {
195 self.emit_seq_elt(idx, f)
196 }
197
198 fn emit_tuple_struct(&mut self,
199 _name: &str,
200 len: uint,
201 f: &fn(&mut Encoder)) {
202 self.emit_seq(len, f)
203 }
204 fn emit_tuple_struct_arg(&mut self, idx: uint, f: &fn(&mut Encoder)) {
205 self.emit_seq_elt(idx, f)
206 }
207
208 fn emit_option(&mut self, f: &fn(&mut Encoder)) { f(self); }
209 fn emit_option_none(&mut self) { self.emit_nil(); }
210 fn emit_option_some(&mut self, f: &fn(&mut Encoder)) { f(self); }
211
212 fn emit_seq(&mut self, _len: uint, f: &fn(&mut Encoder)) {
213 self.wr.write_char('[');
214 f(self);
215 self.wr.write_char(']');
216 }
217
218 fn emit_seq_elt(&mut self, idx: uint, f: &fn(&mut Encoder)) {
219 if idx != 0 {
220 self.wr.write_char(',');
221 }
222 f(self)
223 }
224
225 fn emit_map(&mut self, _len: uint, f: &fn(&mut Encoder)) {
226 self.wr.write_char('{');
227 f(self);
228 self.wr.write_char('}');
229 }
230
231 fn emit_map_elt_key(&mut self, idx: uint, f: &fn(&mut Encoder)) {
232 if idx != 0 { self.wr.write_char(','); }
233 f(self)
234 }
235
236 fn emit_map_elt_val(&mut self, _idx: uint, f: &fn(&mut Encoder)) {
237 self.wr.write_char(':');
238 f(self)
239 }
240}
241
Alex Crichton39568502013-05-29 03:11:41242/// Another encoder for JSON, but prints out human-readable JSON instead of
243/// compact data
Patrick Waltonc7522412013-05-04 00:55:53244pub struct PrettyEncoder {
245 priv wr: @io::Writer,
246 priv indent: uint,
247}
248
Alex Crichton39568502013-05-29 03:11:41249/// Creates a new encoder whose output will be written to the specified writer
Patrick Waltonb1c69982013-03-12 20:00:50250pub fn PrettyEncoder(wr: @io::Writer) -> PrettyEncoder {
Patrick Waltondc5df612013-05-02 00:54:54251 PrettyEncoder {
252 wr: wr,
253 indent: 0,
254 }
Erick Tryzelaar49d00b22012-09-24 16:55:42255}
256
Patrick Waltondc5df612013-05-02 00:54:54257impl serialize::Encoder for PrettyEncoder {
258 fn emit_nil(&mut self) { self.wr.write_str("null") }
259
260 fn emit_uint(&mut self, v: uint) { self.emit_float(v as float); }
261 fn emit_u64(&mut self, v: u64) { self.emit_float(v as float); }
262 fn emit_u32(&mut self, v: u32) { self.emit_float(v as float); }
263 fn emit_u16(&mut self, v: u16) { self.emit_float(v as float); }
264 fn emit_u8(&mut self, v: u8) { self.emit_float(v as float); }
265
266 fn emit_int(&mut self, v: int) { self.emit_float(v as float); }
267 fn emit_i64(&mut self, v: i64) { self.emit_float(v as float); }
268 fn emit_i32(&mut self, v: i32) { self.emit_float(v as float); }
269 fn emit_i16(&mut self, v: i16) { self.emit_float(v as float); }
270 fn emit_i8(&mut self, v: i8) { self.emit_float(v as float); }
271
272 fn emit_bool(&mut self, v: bool) {
273 if v {
274 self.wr.write_str("true");
275 } else {
276 self.wr.write_str("false");
277 }
278 }
279
280 fn emit_f64(&mut self, v: f64) { self.emit_float(v as float); }
281 fn emit_f32(&mut self, v: f32) { self.emit_float(v as float); }
282 fn emit_float(&mut self, v: float) {
283 self.wr.write_str(float::to_str_digits(v, 6u));
284 }
285
286 fn emit_char(&mut self, v: char) { self.emit_str(str::from_char(v)) }
287 fn emit_str(&mut self, v: &str) { self.wr.write_str(escape_str(v)); }
288
289 fn emit_enum(&mut self, _name: &str, f: &fn(&mut PrettyEncoder)) {
290 f(self)
291 }
292
293 fn emit_enum_variant(&mut self,
294 name: &str,
295 _: uint,
296 cnt: uint,
297 f: &fn(&mut PrettyEncoder)) {
298 if cnt == 0 {
299 self.wr.write_str(escape_str(name));
300 } else {
301 self.wr.write_char('[');
302 self.indent += 2;
303 self.wr.write_char('\n');
304 self.wr.write_str(spaces(self.indent));
305 self.wr.write_str(escape_str(name));
306 self.wr.write_str(",\n");
307 f(self);
308 self.wr.write_char('\n');
309 self.indent -= 2;
310 self.wr.write_str(spaces(self.indent));
311 self.wr.write_char(']');
312 }
313 }
314
315 fn emit_enum_variant_arg(&mut self,
316 idx: uint,
317 f: &fn(&mut PrettyEncoder)) {
318 if idx != 0 {
319 self.wr.write_str(",\n");
320 }
321 self.wr.write_str(spaces(self.indent));
322 f(self)
323 }
324
325 fn emit_enum_struct_variant(&mut self,
326 name: &str,
327 id: uint,
328 cnt: uint,
329 f: &fn(&mut PrettyEncoder)) {
330 self.emit_enum_variant(name, id, cnt, f)
331 }
332
333 fn emit_enum_struct_variant_field(&mut self,
334 _: &str,
335 idx: uint,
336 f: &fn(&mut PrettyEncoder)) {
337 self.emit_enum_variant_arg(idx, f)
338 }
339
340
341 fn emit_struct(&mut self,
342 _: &str,
343 len: uint,
344 f: &fn(&mut PrettyEncoder)) {
345 if len == 0 {
346 self.wr.write_str("{}");
347 } else {
348 self.wr.write_char('{');
349 self.indent += 2;
350 f(self);
351 self.wr.write_char('\n');
352 self.indent -= 2;
353 self.wr.write_str(spaces(self.indent));
354 self.wr.write_char('}');
355 }
356 }
357
358 fn emit_struct_field(&mut self,
359 name: &str,
360 idx: uint,
361 f: &fn(&mut PrettyEncoder)) {
362 if idx == 0 {
363 self.wr.write_char('\n');
364 } else {
365 self.wr.write_str(",\n");
366 }
367 self.wr.write_str(spaces(self.indent));
368 self.wr.write_str(escape_str(name));
369 self.wr.write_str(": ");
370 f(self);
371 }
372
373 fn emit_tuple(&mut self, len: uint, f: &fn(&mut PrettyEncoder)) {
374 self.emit_seq(len, f)
375 }
376 fn emit_tuple_arg(&mut self, idx: uint, f: &fn(&mut PrettyEncoder)) {
377 self.emit_seq_elt(idx, f)
378 }
379
380 fn emit_tuple_struct(&mut self,
381 _: &str,
382 len: uint,
383 f: &fn(&mut PrettyEncoder)) {
384 self.emit_seq(len, f)
385 }
386 fn emit_tuple_struct_arg(&mut self,
387 idx: uint,
388 f: &fn(&mut PrettyEncoder)) {
389 self.emit_seq_elt(idx, f)
390 }
391
392 fn emit_option(&mut self, f: &fn(&mut PrettyEncoder)) { f(self); }
393 fn emit_option_none(&mut self) { self.emit_nil(); }
394 fn emit_option_some(&mut self, f: &fn(&mut PrettyEncoder)) { f(self); }
395
396 fn emit_seq(&mut self, len: uint, f: &fn(&mut PrettyEncoder)) {
397 if len == 0 {
398 self.wr.write_str("[]");
399 } else {
400 self.wr.write_char('[');
401 self.indent += 2;
402 f(self);
403 self.wr.write_char('\n');
404 self.indent -= 2;
405 self.wr.write_str(spaces(self.indent));
406 self.wr.write_char(']');
407 }
408 }
409
410 fn emit_seq_elt(&mut self, idx: uint, f: &fn(&mut PrettyEncoder)) {
411 if idx == 0 {
412 self.wr.write_char('\n');
413 } else {
414 self.wr.write_str(",\n");
415 }
416 self.wr.write_str(spaces(self.indent));
417 f(self)
418 }
419
420 fn emit_map(&mut self, len: uint, f: &fn(&mut PrettyEncoder)) {
421 if len == 0 {
422 self.wr.write_str("{}");
423 } else {
424 self.wr.write_char('{');
425 self.indent += 2;
426 f(self);
427 self.wr.write_char('\n');
428 self.indent -= 2;
429 self.wr.write_str(spaces(self.indent));
430 self.wr.write_char('}');
431 }
432 }
433
434 fn emit_map_elt_key(&mut self, idx: uint, f: &fn(&mut PrettyEncoder)) {
435 if idx == 0 {
436 self.wr.write_char('\n');
437 } else {
438 self.wr.write_str(",\n");
439 }
440 self.wr.write_str(spaces(self.indent));
441 f(self);
442 }
443
444 fn emit_map_elt_val(&mut self, _idx: uint, f: &fn(&mut PrettyEncoder)) {
445 self.wr.write_str(": ");
446 f(self);
447 }
448}
449
Patrick Waltondc5df612013-05-02 00:54:54450impl<E: serialize::Encoder> serialize::Encodable<E> for Json {
451 fn encode(&self, e: &mut E) {
452 match *self {
453 Number(v) => v.encode(e),
454 String(ref v) => v.encode(e),
455 Boolean(v) => v.encode(e),
456 List(ref v) => v.encode(e),
457 Object(ref v) => v.encode(e),
458 Null => e.emit_nil(),
459 }
460 }
461}
462
Erick Tryzelaar8650c6f2012-12-18 03:31:04463/// Encodes a json value into a io::writer
Patrick Waltondc5df612013-05-02 00:54:54464pub fn to_writer(wr: @io::Writer, json: &Json) {
465 let mut encoder = Encoder(wr);
466 json.encode(&mut encoder)
Erick Tryzelaar49d00b22012-09-24 16:55:42467}
468
Erick Tryzelaar8650c6f2012-12-18 03:31:04469/// Encodes a json value into a string
Patrick Waltonc1084092013-03-22 04:34:30470pub fn to_str(json: &Json) -> ~str {
Alex Crichton255193c2013-04-08 20:50:34471 io::with_str_writer(|wr| to_writer(wr, json))
Elly Jonesbd726262011-11-07 19:01:28472}
473
Erick Tryzelaar8650c6f2012-12-18 03:31:04474/// Encodes a json value into a io::writer
Patrick Waltondc5df612013-05-02 00:54:54475pub fn to_pretty_writer(wr: @io::Writer, json: &Json) {
476 let mut encoder = PrettyEncoder(wr);
477 json.encode(&mut encoder)
Kevin Cantud47cb102012-08-30 23:39:56478}
479
Erick Tryzelaar8650c6f2012-12-18 03:31:04480/// Encodes a json value into a string
Erick Tryzelaar49d00b22012-09-24 16:55:42481pub fn to_pretty_str(json: &Json) -> ~str {
482 io::with_str_writer(|wr| to_pretty_writer(wr, json))
Patrick Waltondb020ab2012-07-11 22:00:40483}
484
Alex Crichton39568502013-05-29 03:11:41485#[allow(missing_doc)]
Erick Tryzelaar49d00b22012-09-24 16:55:42486pub struct Parser {
Patrick Waltonb1c69982013-03-12 20:00:50487 priv rdr: @io::Reader,
Alex Crichton3136fba2013-03-24 16:41:19488 priv ch: char,
489 priv line: uint,
490 priv col: uint,
Erick Tryzelaar49d00b22012-09-24 16:55:42491}
492
Erick Tryzelaar8650c6f2012-12-18 03:31:04493/// Decode a json value from an io::reader
Patrick Waltonb1c69982013-03-12 20:00:50494pub fn Parser(rdr: @io::Reader) -> Parser {
Erick Tryzelaar49d00b22012-09-24 16:55:42495 Parser {
496 rdr: rdr,
497 ch: rdr.read_char(),
Tim Chevalier90d06b82012-09-19 05:35:42498 line: 1,
499 col: 1,
Erick Tryzelaar49d00b22012-09-24 16:55:42500 }
501}
502
Patrick Walton5fb25462013-05-31 22:17:22503impl Parser {
504 pub fn parse(&mut self) -> Result<Json, Error> {
Luqman Aden4cf51c22013-02-15 07:30:30505 match self.parse_value() {
506 Ok(value) => {
Erick Tryzelaar49d00b22012-09-24 16:55:42507 // Skip trailing whitespaces.
508 self.parse_whitespace();
509 // Make sure there is no trailing characters.
510 if self.eof() {
Luqman Aden4cf51c22013-02-15 07:30:30511 Ok(value)
Erick Tryzelaar49d00b22012-09-24 16:55:42512 } else {
513 self.error(~"trailing characters")
514 }
515 }
Luqman Aden4cf51c22013-02-15 07:30:30516 Err(e) => Err(e)
Erick Tryzelaar49d00b22012-09-24 16:55:42517 }
518 }
519}
520
Patrick Walton5fb25462013-05-31 22:17:22521impl Parser {
Ben Striegel0fed29c2013-03-08 02:11:09522 fn eof(&self) -> bool { self.ch == -1 as char }
Elly Jonesbd726262011-11-07 19:01:28523
Alex Crichton3136fba2013-03-24 16:41:19524 fn bump(&mut self) {
Erick Tryzelaar012dec52012-02-26 00:39:32525 self.ch = self.rdr.read_char();
526
527 if self.ch == '\n' {
528 self.line += 1u;
529 self.col = 1u;
530 } else {
531 self.col += 1u;
532 }
Elly Jonesbd726262011-11-07 19:01:28533 }
534
Alex Crichton3136fba2013-03-24 16:41:19535 fn next_char(&mut self) -> char {
Erick Tryzelaar012dec52012-02-26 00:39:32536 self.bump();
537 self.ch
Elly Jonesbd726262011-11-07 19:01:28538 }
539
Ben Striegel0fed29c2013-03-08 02:11:09540 fn error<T>(&self, msg: ~str) -> Result<T, Error> {
Erick Tryzelaar49d00b22012-09-24 16:55:42541 Err(Error { line: self.line, col: self.col, msg: @msg })
Elly Jonesbd726262011-11-07 19:01:28542 }
Elly Jonesbd726262011-11-07 19:01:28543
Alex Crichton3136fba2013-03-24 16:41:19544 fn parse_value(&mut self) -> Result<Json, Error> {
Erick Tryzelaar012dec52012-02-26 00:39:32545 self.parse_whitespace();
Elly Jonesbd726262011-11-07 19:01:28546
Brian Andersonb3559362012-08-02 00:30:05547 if self.eof() { return self.error(~"EOF while parsing value"); }
Erick Tryzelaar012dec52012-02-26 00:39:32548
Brian Andersonecaf9e32012-08-06 19:34:08549 match self.ch {
Alex Crichton82fa0012013-05-19 05:07:44550 'n' => self.parse_ident("ull", Null),
551 't' => self.parse_ident("rue", Boolean(true)),
552 'f' => self.parse_ident("alse", Boolean(false)),
Brian Anderson80c4f742012-09-02 01:38:05553 '0' .. '9' | '-' => self.parse_number(),
Erick Tryzelaar49d00b22012-09-24 16:55:42554 '"' =>
Luqman Aden4cf51c22013-02-15 07:30:30555 match self.parse_str() {
556 Ok(s) => Ok(String(s)),
557 Err(e) => Err(e),
Erick Tryzelaar49d00b22012-09-24 16:55:42558 },
Brian Anderson025d8662012-08-04 02:59:04559 '[' => self.parse_list(),
560 '{' => self.parse_object(),
561 _ => self.error(~"invalid syntax")
Erick Tryzelaar012dec52012-02-26 00:39:32562 }
563 }
564
Alex Crichton3136fba2013-03-24 16:41:19565 fn parse_whitespace(&mut self) {
Erick Tryzelaar012dec52012-02-26 00:39:32566 while char::is_whitespace(self.ch) { self.bump(); }
567 }
568
Alex Crichton3136fba2013-03-24 16:41:19569 fn parse_ident(&mut self, ident: &str, value: Json) -> Result<Json, Error> {
Brian Andersond1fc2b52012-06-30 23:19:07570 if str::all(ident, |c| c == self.next_char()) {
Erick Tryzelaar012dec52012-02-26 00:39:32571 self.bump();
Luqman Aden4cf51c22013-02-15 07:30:30572 Ok(value)
Erick Tryzelaar012dec52012-02-26 00:39:32573 } else {
Michael Sullivan92743dc2012-07-14 05:57:48574 self.error(~"invalid syntax")
Erick Tryzelaar012dec52012-02-26 00:39:32575 }
576 }
577
Alex Crichton3136fba2013-03-24 16:41:19578 fn parse_number(&mut self) -> Result<Json, Error> {
Niko Matsakis6b358752012-03-14 18:03:56579 let mut neg = 1f;
Erick Tryzelaar012dec52012-02-26 00:39:32580
581 if self.ch == '-' {
582 self.bump();
Marijn Haverbeke4f826d82011-12-16 09:11:00583 neg = -1f;
Elly Jonesbd726262011-11-07 19:01:28584 }
Elly Jonesbd726262011-11-07 19:01:28585
Brian Andersonecaf9e32012-08-06 19:34:08586 let mut res = match self.parse_integer() {
Brian Anderson0c6e4702012-08-26 23:54:31587 Ok(res) => res,
588 Err(e) => return Err(e)
Erick Tryzelaar012dec52012-02-26 00:39:32589 };
590
591 if self.ch == '.' {
Brian Andersonecaf9e32012-08-06 19:34:08592 match self.parse_decimal(res) {
Brian Anderson0c6e4702012-08-26 23:54:31593 Ok(r) => res = r,
594 Err(e) => return Err(e)
Elly Jonesbd726262011-11-07 19:01:28595 }
Elly Jonesbd726262011-11-07 19:01:28596 }
Erick Tryzelaar012dec52012-02-26 00:39:32597
598 if self.ch == 'e' || self.ch == 'E' {
Brian Andersonecaf9e32012-08-06 19:34:08599 match self.parse_exponent(res) {
Brian Anderson0c6e4702012-08-26 23:54:31600 Ok(r) => res = r,
601 Err(e) => return Err(e)
Erick Tryzelaar012dec52012-02-26 00:39:32602 }
603 }
604
Erick Tryzelaar49d00b22012-09-24 16:55:42605 Ok(Number(neg * res))
Elly Jonesbd726262011-11-07 19:01:28606 }
607
Alex Crichton3136fba2013-03-24 16:41:19608 fn parse_integer(&mut self) -> Result<float, Error> {
Niko Matsakis6b358752012-03-14 18:03:56609 let mut res = 0f;
Erick Tryzelaar012dec52012-02-26 00:39:32610
Brian Andersonecaf9e32012-08-06 19:34:08611 match self.ch {
Brian Anderson025d8662012-08-04 02:59:04612 '0' => {
Erick Tryzelaar012dec52012-02-26 00:39:32613 self.bump();
614
615 // There can be only one leading '0'.
Brian Andersonecaf9e32012-08-06 19:34:08616 match self.ch {
Brian Anderson80c4f742012-09-02 01:38:05617 '0' .. '9' => return self.error(~"invalid number"),
Brian Anderson025d8662012-08-04 02:59:04618 _ => ()
Erick Tryzelaar012dec52012-02-26 00:39:32619 }
620 }
Brian Anderson80c4f742012-09-02 01:38:05621 '1' .. '9' => {
Erick Tryzelaar012dec52012-02-26 00:39:32622 while !self.eof() {
Brian Andersonecaf9e32012-08-06 19:34:08623 match self.ch {
Brian Anderson80c4f742012-09-02 01:38:05624 '0' .. '9' => {
Erick Tryzelaar012dec52012-02-26 00:39:32625 res *= 10f;
626 res += ((self.ch as int) - ('0' as int)) as float;
627
628 self.bump();
629 }
Brian Anderson025d8662012-08-04 02:59:04630 _ => break
Erick Tryzelaar012dec52012-02-26 00:39:32631 }
632 }
633 }
Brian Anderson025d8662012-08-04 02:59:04634 _ => return self.error(~"invalid number")
Erick Tryzelaar012dec52012-02-26 00:39:32635 }
636
Brian Anderson0c6e4702012-08-26 23:54:31637 Ok(res)
Elly Jonesbd726262011-11-07 19:01:28638 }
639
Alex Crichton3136fba2013-03-24 16:41:19640 fn parse_decimal(&mut self, res: float) -> Result<float, Error> {
Erick Tryzelaar012dec52012-02-26 00:39:32641 self.bump();
642
643 // Make sure a digit follows the decimal place.
Brian Andersonecaf9e32012-08-06 19:34:08644 match self.ch {
Brian Anderson80c4f742012-09-02 01:38:05645 '0' .. '9' => (),
Brian Anderson025d8662012-08-04 02:59:04646 _ => return self.error(~"invalid number")
Erick Tryzelaar012dec52012-02-26 00:39:32647 }
648
Niko Matsakis6b358752012-03-14 18:03:56649 let mut res = res;
650 let mut dec = 1f;
Erick Tryzelaar012dec52012-02-26 00:39:32651 while !self.eof() {
Brian Andersonecaf9e32012-08-06 19:34:08652 match self.ch {
Brian Anderson80c4f742012-09-02 01:38:05653 '0' .. '9' => {
Marijn Haverbeke4f826d82011-12-16 09:11:00654 dec /= 10f;
Erick Tryzelaar012dec52012-02-26 00:39:32655 res += (((self.ch as int) - ('0' as int)) as float) * dec;
656
657 self.bump();
658 }
Brian Anderson025d8662012-08-04 02:59:04659 _ => break
Elly Jonesbd726262011-11-07 19:01:28660 }
Elly Jonesbd726262011-11-07 19:01:28661 }
Elly Jonesbd726262011-11-07 19:01:28662
Brian Anderson0c6e4702012-08-26 23:54:31663 Ok(res)
Erick Tryzelaar012dec52012-02-26 00:39:32664 }
665
Alex Crichton3136fba2013-03-24 16:41:19666 fn parse_exponent(&mut self, mut res: float) -> Result<float, Error> {
Erick Tryzelaar012dec52012-02-26 00:39:32667 self.bump();
668
Niko Matsakis6b358752012-03-14 18:03:56669 let mut exp = 0u;
670 let mut neg_exp = false;
Erick Tryzelaar012dec52012-02-26 00:39:32671
Brian Andersonecaf9e32012-08-06 19:34:08672 match self.ch {
Brian Anderson025d8662012-08-04 02:59:04673 '+' => self.bump(),
674 '-' => { self.bump(); neg_exp = true; }
675 _ => ()
Erick Tryzelaar012dec52012-02-26 00:39:32676 }
677
678 // Make sure a digit follows the exponent place.
Brian Andersonecaf9e32012-08-06 19:34:08679 match self.ch {
Brian Anderson80c4f742012-09-02 01:38:05680 '0' .. '9' => (),
Brian Anderson025d8662012-08-04 02:59:04681 _ => return self.error(~"invalid number")
Erick Tryzelaar012dec52012-02-26 00:39:32682 }
683
684 while !self.eof() {
Brian Andersonecaf9e32012-08-06 19:34:08685 match self.ch {
Brian Anderson80c4f742012-09-02 01:38:05686 '0' .. '9' => {
Erick Tryzelaar012dec52012-02-26 00:39:32687 exp *= 10u;
688 exp += (self.ch as uint) - ('0' as uint);
689
690 self.bump();
691 }
Brian Anderson025d8662012-08-04 02:59:04692 _ => break
Erick Tryzelaar012dec52012-02-26 00:39:32693 }
694 }
695
696 let exp = float::pow_with_uint(10u, exp);
697 if neg_exp {
698 res /= exp;
699 } else {
700 res *= exp;
701 }
702
Brian Anderson0c6e4702012-08-26 23:54:31703 Ok(res)
Erick Tryzelaar012dec52012-02-26 00:39:32704 }
705
Alex Crichton3136fba2013-03-24 16:41:19706 fn parse_str(&mut self) -> Result<~str, Error> {
Niko Matsakis6b358752012-03-14 18:03:56707 let mut escape = false;
Michael Sullivan92743dc2012-07-14 05:57:48708 let mut res = ~"";
Erick Tryzelaar012dec52012-02-26 00:39:32709
710 while !self.eof() {
711 self.bump();
712
713 if (escape) {
Brian Andersonecaf9e32012-08-06 19:34:08714 match self.ch {
Tim Chevalier5a8ba072012-10-11 21:12:50715 '"' => str::push_char(&mut res, '"'),
716 '\\' => str::push_char(&mut res, '\\'),
717 '/' => str::push_char(&mut res, '/'),
718 'b' => str::push_char(&mut res, '\x08'),
719 'f' => str::push_char(&mut res, '\x0c'),
720 'n' => str::push_char(&mut res, '\n'),
721 'r' => str::push_char(&mut res, '\r'),
722 't' => str::push_char(&mut res, '\t'),
Brian Anderson025d8662012-08-04 02:59:04723 'u' => {
Erick Tryzelaar012dec52012-02-26 00:39:32724 // Parse \u1234.
Niko Matsakis6b358752012-03-14 18:03:56725 let mut i = 0u;
726 let mut n = 0u;
Erick Tryzelaar012dec52012-02-26 00:39:32727 while i < 4u {
Brian Andersonecaf9e32012-08-06 19:34:08728 match self.next_char() {
Brian Anderson80c4f742012-09-02 01:38:05729 '0' .. '9' => {
Kevin Cantu4fb675b2012-08-31 03:12:10730 n = n * 16u + (self.ch as uint)
731 - ('0' as uint);
732 },
733 'a' | 'A' => n = n * 16u + 10u,
734 'b' | 'B' => n = n * 16u + 11u,
735 'c' | 'C' => n = n * 16u + 12u,
736 'd' | 'D' => n = n * 16u + 13u,
737 'e' | 'E' => n = n * 16u + 14u,
738 'f' | 'F' => n = n * 16u + 15u,
739 _ => return self.error(
740 ~"invalid \\u escape (unrecognized hex)")
Erick Tryzelaar012dec52012-02-26 00:39:32741 }
Niko Matsakis6b358752012-03-14 18:03:56742 i += 1u;
Erick Tryzelaar012dec52012-02-26 00:39:32743 }
744
745 // Error out if we didn't parse 4 digits.
746 if i != 4u {
Kevin Cantu4fb675b2012-08-31 03:12:10747 return self.error(
748 ~"invalid \\u escape (not four digits)");
Erick Tryzelaar012dec52012-02-26 00:39:32749 }
750
Tim Chevalier5a8ba072012-10-11 21:12:50751 str::push_char(&mut res, n as char);
Erick Tryzelaar012dec52012-02-26 00:39:32752 }
Brian Anderson025d8662012-08-04 02:59:04753 _ => return self.error(~"invalid escape")
Erick Tryzelaar012dec52012-02-26 00:39:32754 }
755 escape = false;
756 } else if self.ch == '\\' {
757 escape = true;
758 } else {
759 if self.ch == '"' {
760 self.bump();
Erick Tryzelaar49d00b22012-09-24 16:55:42761 return Ok(res);
Erick Tryzelaar012dec52012-02-26 00:39:32762 }
Tim Chevalier5a8ba072012-10-11 21:12:50763 str::push_char(&mut res, self.ch);
Erick Tryzelaar012dec52012-02-26 00:39:32764 }
765 }
766
Michael Sullivan92743dc2012-07-14 05:57:48767 self.error(~"EOF while parsing string")
Erick Tryzelaar012dec52012-02-26 00:39:32768 }
769
Alex Crichton3136fba2013-03-24 16:41:19770 fn parse_list(&mut self) -> Result<Json, Error> {
Erick Tryzelaar012dec52012-02-26 00:39:32771 self.bump();
772 self.parse_whitespace();
773
Michael Sullivan98e161f2012-06-29 23:26:56774 let mut values = ~[];
Erick Tryzelaar012dec52012-02-26 00:39:32775
776 if self.ch == ']' {
777 self.bump();
Luqman Aden4cf51c22013-02-15 07:30:30778 return Ok(List(values));
Erick Tryzelaar012dec52012-02-26 00:39:32779 }
780
Tim Chevalier35400e12012-03-11 04:34:17781 loop {
Luqman Aden4cf51c22013-02-15 07:30:30782 match self.parse_value() {
783 Ok(v) => values.push(v),
784 Err(e) => return Err(e)
Erick Tryzelaar012dec52012-02-26 00:39:32785 }
786
787 self.parse_whitespace();
Tim Chevalier35400e12012-03-11 04:34:17788 if self.eof() {
Brian Andersonb3559362012-08-02 00:30:05789 return self.error(~"EOF while parsing list");
Tim Chevalier35400e12012-03-11 04:34:17790 }
Erick Tryzelaar012dec52012-02-26 00:39:32791
Brian Andersonecaf9e32012-08-06 19:34:08792 match self.ch {
Brian Anderson025d8662012-08-04 02:59:04793 ',' => self.bump(),
Luqman Aden4cf51c22013-02-15 07:30:30794 ']' => { self.bump(); return Ok(List(values)); }
Brian Anderson025d8662012-08-04 02:59:04795 _ => return self.error(~"expected `,` or `]`")
Erick Tryzelaar012dec52012-02-26 00:39:32796 }
Tim Chevalier35400e12012-03-11 04:34:17797 };
Erick Tryzelaar012dec52012-02-26 00:39:32798 }
799
Alex Crichton3136fba2013-03-24 16:41:19800 fn parse_object(&mut self) -> Result<Json, Error> {
Erick Tryzelaar012dec52012-02-26 00:39:32801 self.bump();
802 self.parse_whitespace();
803
Daniel Micaycc148b52013-04-03 13:28:36804 let mut values = ~HashMap::new();
Erick Tryzelaar012dec52012-02-26 00:39:32805
806 if self.ch == '}' {
807 self.bump();
Luqman Aden4cf51c22013-02-15 07:30:30808 return Ok(Object(values));
Erick Tryzelaar012dec52012-02-26 00:39:32809 }
810
811 while !self.eof() {
812 self.parse_whitespace();
813
814 if self.ch != '"' {
Brian Andersonb3559362012-08-02 00:30:05815 return self.error(~"key must be a string");
Erick Tryzelaar012dec52012-02-26 00:39:32816 }
817
Luqman Aden4cf51c22013-02-15 07:30:30818 let key = match self.parse_str() {
819 Ok(key) => key,
820 Err(e) => return Err(e)
Erick Tryzelaar012dec52012-02-26 00:39:32821 };
822
823 self.parse_whitespace();
824
825 if self.ch != ':' {
826 if self.eof() { break; }
Brian Andersonb3559362012-08-02 00:30:05827 return self.error(~"expected `:`");
Erick Tryzelaar012dec52012-02-26 00:39:32828 }
829 self.bump();
830
Luqman Aden4cf51c22013-02-15 07:30:30831 match self.parse_value() {
832 Ok(value) => { values.insert(key, value); }
833 Err(e) => return Err(e)
Erick Tryzelaar012dec52012-02-26 00:39:32834 }
835 self.parse_whitespace();
836
Brian Andersonecaf9e32012-08-06 19:34:08837 match self.ch {
Brian Anderson025d8662012-08-04 02:59:04838 ',' => self.bump(),
Luqman Aden4cf51c22013-02-15 07:30:30839 '}' => { self.bump(); return Ok(Object(values)); }
Brian Anderson025d8662012-08-04 02:59:04840 _ => {
Erick Tryzelaar012dec52012-02-26 00:39:32841 if self.eof() { break; }
Brian Andersonb3559362012-08-02 00:30:05842 return self.error(~"expected `,` or `}`");
Erick Tryzelaar012dec52012-02-26 00:39:32843 }
844 }
845 }
846
Brian Andersonb3559362012-08-02 00:30:05847 return self.error(~"EOF while parsing object");
Elly Jonesbd726262011-11-07 19:01:28848 }
849}
850
Patrick Waltonb1c69982013-03-12 20:00:50851/// Decodes a json value from an @io::Reader
852pub fn from_reader(rdr: @io::Reader) -> Result<Json, Error> {
Alex Crichton3136fba2013-03-24 16:41:19853 let mut parser = Parser(rdr);
854 parser.parse()
Elly Jonesbd726262011-11-07 19:01:28855}
856
Erick Tryzelaar8650c6f2012-12-18 03:31:04857/// Decodes a json value from a string
Erick Tryzelaar49d00b22012-09-24 16:55:42858pub fn from_str(s: &str) -> Result<Json, Error> {
859 do io::with_str_reader(s) |rdr| {
860 from_reader(rdr)
861 }
Erick Tryzelaar012dec52012-02-26 00:39:32862}
863
Alex Crichton39568502013-05-29 03:11:41864/// A structure to decode JSON to values in rust.
Patrick Waltonc7522412013-05-04 00:55:53865pub struct Decoder {
866 priv stack: ~[Json],
867}
868
Alex Crichton39568502013-05-29 03:11:41869/// Creates a new decoder instance for decoding the specified JSON value.
Erick Tryzelaar8650c6f2012-12-18 03:31:04870pub fn Decoder(json: Json) -> Decoder {
Patrick Waltondc5df612013-05-02 00:54:54871 Decoder {
872 stack: ~[json]
873 }
Elly Jonesbd726262011-11-07 19:01:28874}
Brian Anderson6e27b272012-01-18 03:05:07875
Patrick Waltondc5df612013-05-02 00:54:54876impl serialize::Decoder for Decoder {
877 fn read_nil(&mut self) -> () {
878 debug!("read_nil");
879 match self.stack.pop() {
880 Null => (),
Björn Steinbrinkbdc182c2013-05-05 22:18:51881 value => fail!("not a null: %?", value)
Patrick Waltondc5df612013-05-02 00:54:54882 }
883 }
884
885 fn read_u64(&mut self) -> u64 { self.read_float() as u64 }
886 fn read_u32(&mut self) -> u32 { self.read_float() as u32 }
887 fn read_u16(&mut self) -> u16 { self.read_float() as u16 }
888 fn read_u8 (&mut self) -> u8 { self.read_float() as u8 }
889 fn read_uint(&mut self) -> uint { self.read_float() as uint }
890
891 fn read_i64(&mut self) -> i64 { self.read_float() as i64 }
892 fn read_i32(&mut self) -> i32 { self.read_float() as i32 }
893 fn read_i16(&mut self) -> i16 { self.read_float() as i16 }
894 fn read_i8 (&mut self) -> i8 { self.read_float() as i8 }
895 fn read_int(&mut self) -> int { self.read_float() as int }
896
897 fn read_bool(&mut self) -> bool {
898 debug!("read_bool");
899 match self.stack.pop() {
900 Boolean(b) => b,
Björn Steinbrinkbdc182c2013-05-05 22:18:51901 value => fail!("not a boolean: %?", value)
Patrick Waltondc5df612013-05-02 00:54:54902 }
903 }
904
905 fn read_f64(&mut self) -> f64 { self.read_float() as f64 }
906 fn read_f32(&mut self) -> f32 { self.read_float() as f32 }
907 fn read_float(&mut self) -> float {
908 debug!("read_float");
909 match self.stack.pop() {
910 Number(f) => f,
Björn Steinbrinkbdc182c2013-05-05 22:18:51911 value => fail!("not a number: %?", value)
Patrick Waltondc5df612013-05-02 00:54:54912 }
913 }
914
915 fn read_char(&mut self) -> char {
916 let mut v = ~[];
Huon Wilson4b806b42013-06-08 12:04:46917 let s = self.read_str();
918 for s.iter().advance |c| { v.push(c) }
Björn Steinbrinkbdc182c2013-05-05 22:18:51919 if v.len() != 1 { fail!("string must have one character") }
Patrick Waltondc5df612013-05-02 00:54:54920 v[0]
921 }
922
923 fn read_str(&mut self) -> ~str {
924 debug!("read_str");
925 match self.stack.pop() {
926 String(s) => s,
Björn Steinbrinkbdc182c2013-05-05 22:18:51927 json => fail!("not a string: %?", json)
Patrick Waltondc5df612013-05-02 00:54:54928 }
929 }
930
931 fn read_enum<T>(&mut self, name: &str, f: &fn(&mut Decoder) -> T) -> T {
932 debug!("read_enum(%s)", name);
933 f(self)
934 }
935
936 fn read_enum_variant<T>(&mut self,
937 names: &[&str],
938 f: &fn(&mut Decoder, uint) -> T)
939 -> T {
940 debug!("read_enum_variant(names=%?)", names);
941 let name = match self.stack.pop() {
942 String(s) => s,
943 List(list) => {
944 do vec::consume_reverse(list) |_i, v| {
945 self.stack.push(v);
946 }
947 match self.stack.pop() {
948 String(s) => s,
Björn Steinbrinkbdc182c2013-05-05 22:18:51949 value => fail!("invalid variant name: %?", value),
Patrick Waltondc5df612013-05-02 00:54:54950 }
951 }
Björn Steinbrinkbdc182c2013-05-05 22:18:51952 ref json => fail!("invalid variant: %?", *json),
Patrick Waltondc5df612013-05-02 00:54:54953 };
954 let idx = match vec::position(names, |n| str::eq_slice(*n, name)) {
955 Some(idx) => idx,
Björn Steinbrinkbdc182c2013-05-05 22:18:51956 None => fail!("Unknown variant name: %?", name),
Patrick Waltondc5df612013-05-02 00:54:54957 };
958 f(self, idx)
959 }
960
961 fn read_enum_variant_arg<T>(&mut self,
962 idx: uint,
963 f: &fn(&mut Decoder) -> T)
964 -> T {
965 debug!("read_enum_variant_arg(idx=%u)", idx);
966 f(self)
967 }
968
969 fn read_enum_struct_variant<T>(&mut self,
970 names: &[&str],
971 f: &fn(&mut Decoder, uint) -> T)
972 -> T {
973 debug!("read_enum_struct_variant(names=%?)", names);
974 self.read_enum_variant(names, f)
975 }
976
977
978 fn read_enum_struct_variant_field<T>(&mut self,
979 name: &str,
980 idx: uint,
981 f: &fn(&mut Decoder) -> T)
982 -> T {
983 debug!("read_enum_struct_variant_field(name=%?, idx=%u)", name, idx);
984 self.read_enum_variant_arg(idx, f)
985 }
986
987 fn read_struct<T>(&mut self,
988 name: &str,
989 len: uint,
990 f: &fn(&mut Decoder) -> T)
991 -> T {
992 debug!("read_struct(name=%s, len=%u)", name, len);
993 let value = f(self);
994 self.stack.pop();
995 value
996 }
997
Patrick Waltondc5df612013-05-02 00:54:54998 fn read_struct_field<T>(&mut self,
999 name: &str,
1000 idx: uint,
1001 f: &fn(&mut Decoder) -> T)
1002 -> T {
1003 debug!("read_struct_field(name=%?, idx=%u)", name, idx);
1004 match self.stack.pop() {
1005 Object(obj) => {
1006 let mut obj = obj;
1007 let value = match obj.pop(&name.to_owned()) {
Björn Steinbrinkbdc182c2013-05-05 22:18:511008 None => fail!("no such field: %s", name),
Patrick Waltondc5df612013-05-02 00:54:541009 Some(json) => {
1010 self.stack.push(json);
1011 f(self)
1012 }
1013 };
1014 self.stack.push(Object(obj));
1015 value
1016 }
Björn Steinbrinkbdc182c2013-05-05 22:18:511017 value => fail!("not an object: %?", value)
Patrick Waltondc5df612013-05-02 00:54:541018 }
1019 }
1020
1021 fn read_tuple<T>(&mut self, f: &fn(&mut Decoder, uint) -> T) -> T {
1022 debug!("read_tuple()");
1023 self.read_seq(f)
1024 }
1025
1026 fn read_tuple_arg<T>(&mut self,
1027 idx: uint,
1028 f: &fn(&mut Decoder) -> T)
1029 -> T {
1030 debug!("read_tuple_arg(idx=%u)", idx);
1031 self.read_seq_elt(idx, f)
1032 }
1033
1034 fn read_tuple_struct<T>(&mut self,
1035 name: &str,
1036 f: &fn(&mut Decoder, uint) -> T)
1037 -> T {
1038 debug!("read_tuple_struct(name=%?)", name);
1039 self.read_tuple(f)
1040 }
1041
1042 fn read_tuple_struct_arg<T>(&mut self,
1043 idx: uint,
1044 f: &fn(&mut Decoder) -> T)
1045 -> T {
1046 debug!("read_tuple_struct_arg(idx=%u)", idx);
1047 self.read_tuple_arg(idx, f)
1048 }
1049
1050 fn read_option<T>(&mut self, f: &fn(&mut Decoder, bool) -> T) -> T {
1051 match self.stack.pop() {
1052 Null => f(self, false),
1053 value => { self.stack.push(value); f(self, true) }
1054 }
1055 }
1056
1057 fn read_seq<T>(&mut self, f: &fn(&mut Decoder, uint) -> T) -> T {
1058 debug!("read_seq()");
1059 let len = match self.stack.pop() {
1060 List(list) => {
1061 let len = list.len();
1062 do vec::consume_reverse(list) |_i, v| {
1063 self.stack.push(v);
1064 }
1065 len
1066 }
Björn Steinbrinkbdc182c2013-05-05 22:18:511067 _ => fail!("not a list"),
Patrick Waltondc5df612013-05-02 00:54:541068 };
1069 f(self, len)
1070 }
1071
1072 fn read_seq_elt<T>(&mut self, idx: uint, f: &fn(&mut Decoder) -> T) -> T {
1073 debug!("read_seq_elt(idx=%u)", idx);
1074 f(self)
1075 }
1076
1077 fn read_map<T>(&mut self, f: &fn(&mut Decoder, uint) -> T) -> T {
1078 debug!("read_map()");
1079 let len = match self.stack.pop() {
1080 Object(obj) => {
1081 let mut obj = obj;
1082 let len = obj.len();
1083 do obj.consume |key, value| {
1084 self.stack.push(value);
1085 self.stack.push(String(key));
1086 }
1087 len
1088 }
Björn Steinbrinkbdc182c2013-05-05 22:18:511089 json => fail!("not an object: %?", json),
Patrick Waltondc5df612013-05-02 00:54:541090 };
1091 f(self, len)
1092 }
1093
1094 fn read_map_elt_key<T>(&mut self,
1095 idx: uint,
1096 f: &fn(&mut Decoder) -> T)
1097 -> T {
1098 debug!("read_map_elt_key(idx=%u)", idx);
1099 f(self)
1100 }
1101
1102 fn read_map_elt_val<T>(&mut self, idx: uint, f: &fn(&mut Decoder) -> T)
1103 -> T {
1104 debug!("read_map_elt_val(idx=%u)", idx);
1105 f(self)
1106 }
1107}
1108
Patrick Walton91436882013-02-14 19:47:001109impl Eq for Json {
Patrick Waltonc1084092013-03-22 04:34:301110 fn eq(&self, other: &Json) -> bool {
Tim Chevalier3e7da962013-01-11 04:09:161111 match (self) {
1112 &Number(f0) =>
1113 match other { &Number(f1) => f0 == f1, _ => false },
1114 &String(ref s0) =>
1115 match other { &String(ref s1) => s0 == s1, _ => false },
1116 &Boolean(b0) =>
1117 match other { &Boolean(b1) => b0 == b1, _ => false },
1118 &Null =>
1119 match other { &Null => true, _ => false },
1120 &List(ref v0) =>
1121 match other { &List(ref v1) => v0 == v1, _ => false },
1122 &Object(ref d0) => {
1123 match other {
1124 &Object(ref d1) => {
Patrick Walton318e5342012-11-15 02:59:301125 if d0.len() == d1.len() {
1126 let mut equal = true;
Niko Matsakis5606fc02013-04-06 15:22:361127 for d0.each |k, v0| {
Daniel Micayee0a8c62013-01-23 16:47:431128 match d1.find(k) {
Patrick Walton318e5342012-11-15 02:59:301129 Some(v1) if v0 == v1 => { },
1130 _ => { equal = false; break }
1131 }
1132 };
1133 equal
1134 } else {
1135 false
1136 }
1137 }
1138 _ => false
1139 }
1140 }
1141 }
1142 }
Patrick Waltonc1084092013-03-22 04:34:301143 fn ne(&self, other: &Json) -> bool { !self.eq(other) }
Erick Tryzelaar49d00b22012-09-24 16:55:421144}
1145
Patrick Walton22b87572012-09-08 01:53:141146/// Test if two json values are less than one another
Patrick Walton91436882013-02-14 19:47:001147impl Ord for Json {
Patrick Waltonc1084092013-03-22 04:34:301148 fn lt(&self, other: &Json) -> bool {
Patrick Walton318e5342012-11-15 02:59:301149 match (*self) {
1150 Number(f0) => {
1151 match *other {
1152 Number(f1) => f0 < f1,
1153 String(_) | Boolean(_) | List(_) | Object(_) |
1154 Null => true
1155 }
1156 }
1157
1158 String(ref s0) => {
1159 match *other {
1160 Number(_) => false,
1161 String(ref s1) => s0 < s1,
1162 Boolean(_) | List(_) | Object(_) | Null => true
1163 }
1164 }
1165
1166 Boolean(b0) => {
1167 match *other {
1168 Number(_) | String(_) => false,
1169 Boolean(b1) => b0 < b1,
1170 List(_) | Object(_) | Null => true
1171 }
1172 }
1173
Patrick Walton98fdcb02012-12-08 03:34:571174 List(ref l0) => {
Patrick Walton318e5342012-11-15 02:59:301175 match *other {
1176 Number(_) | String(_) | Boolean(_) => false,
Patrick Walton98fdcb02012-12-08 03:34:571177 List(ref l1) => (*l0) < (*l1),
Patrick Walton318e5342012-11-15 02:59:301178 Object(_) | Null => true
1179 }
1180 }
1181
1182 Object(ref d0) => {
1183 match *other {
1184 Number(_) | String(_) | Boolean(_) | List(_) => false,
1185 Object(ref d1) => {
Alex Crichton255193c2013-04-08 20:50:341186 let mut d0_flat = ~[];
1187 let mut d1_flat = ~[];
Patrick Walton318e5342012-11-15 02:59:301188
Alex Crichton255193c2013-04-08 20:50:341189 // FIXME #4430: this is horribly inefficient...
Niko Matsakis5606fc02013-04-06 15:22:361190 for d0.each |k, v| {
Alex Crichton255193c2013-04-08 20:50:341191 d0_flat.push((@copy *k, @copy *v));
Patrick Walton318e5342012-11-15 02:59:301192 }
Alex Crichton255193c2013-04-08 20:50:341193 d0_flat.qsort();
1194
Niko Matsakis5606fc02013-04-06 15:22:361195 for d1.each |k, v| {
Alex Crichton255193c2013-04-08 20:50:341196 d1_flat.push((@copy *k, @copy *v));
1197 }
1198 d1_flat.qsort();
1199
1200 d0_flat < d1_flat
Patrick Walton318e5342012-11-15 02:59:301201 }
1202 Null => true
1203 }
1204 }
1205
1206 Null => {
1207 match *other {
1208 Number(_) | String(_) | Boolean(_) | List(_) |
1209 Object(_) =>
1210 false,
1211 Null => true
1212 }
1213 }
1214 }
1215 }
Patrick Waltonc1084092013-03-22 04:34:301216 fn le(&self, other: &Json) -> bool { !(*other).lt(&(*self)) }
1217 fn ge(&self, other: &Json) -> bool { !(*self).lt(other) }
1218 fn gt(&self, other: &Json) -> bool { (*other).lt(&(*self)) }
Patrick Walton22b87572012-09-08 01:53:141219}
1220
Alex Crichton39568502013-05-29 03:11:411221/// A trait for converting values to JSON
1222trait ToJson {
1223 /// Converts the value of `self` to an instance of JSON
1224 fn to_json(&self) -> Json;
1225}
Erick Tryzelaared5af702012-05-28 19:10:321226
Patrick Walton91436882013-02-14 19:47:001227impl ToJson for Json {
Ben Striegel0fed29c2013-03-08 02:11:091228 fn to_json(&self) -> Json { copy *self }
Erick Tryzelaared5af702012-05-28 19:10:321229}
1230
Patrick Walton91436882013-02-14 19:47:001231impl ToJson for @Json {
Ben Striegel0fed29c2013-03-08 02:11:091232 fn to_json(&self) -> Json { (**self).to_json() }
Erick Tryzelaar11a56c32012-06-13 15:30:541233}
1234
Patrick Walton91436882013-02-14 19:47:001235impl ToJson for int {
Ben Striegel0fed29c2013-03-08 02:11:091236 fn to_json(&self) -> Json { Number(*self as float) }
Erick Tryzelaar11a56c32012-06-13 15:30:541237}
1238
Patrick Walton91436882013-02-14 19:47:001239impl ToJson for i8 {
Ben Striegel0fed29c2013-03-08 02:11:091240 fn to_json(&self) -> Json { Number(*self as float) }
Erick Tryzelaared5af702012-05-28 19:10:321241}
1242
Patrick Walton91436882013-02-14 19:47:001243impl ToJson for i16 {
Ben Striegel0fed29c2013-03-08 02:11:091244 fn to_json(&self) -> Json { Number(*self as float) }
Erick Tryzelaared5af702012-05-28 19:10:321245}
1246
Patrick Walton91436882013-02-14 19:47:001247impl ToJson for i32 {
Ben Striegel0fed29c2013-03-08 02:11:091248 fn to_json(&self) -> Json { Number(*self as float) }
Erick Tryzelaared5af702012-05-28 19:10:321249}
1250
Patrick Walton91436882013-02-14 19:47:001251impl ToJson for i64 {
Ben Striegel0fed29c2013-03-08 02:11:091252 fn to_json(&self) -> Json { Number(*self as float) }
Erick Tryzelaared5af702012-05-28 19:10:321253}
1254
Patrick Walton91436882013-02-14 19:47:001255impl ToJson for uint {
Ben Striegel0fed29c2013-03-08 02:11:091256 fn to_json(&self) -> Json { Number(*self as float) }
Erick Tryzelaar11a56c32012-06-13 15:30:541257}
1258
Patrick Walton91436882013-02-14 19:47:001259impl ToJson for u8 {
Ben Striegel0fed29c2013-03-08 02:11:091260 fn to_json(&self) -> Json { Number(*self as float) }
Erick Tryzelaared5af702012-05-28 19:10:321261}
1262
Patrick Walton91436882013-02-14 19:47:001263impl ToJson for u16 {
Ben Striegel0fed29c2013-03-08 02:11:091264 fn to_json(&self) -> Json { Number(*self as float) }
Erick Tryzelaared5af702012-05-28 19:10:321265}
1266
Patrick Walton91436882013-02-14 19:47:001267impl ToJson for u32 {
Ben Striegel0fed29c2013-03-08 02:11:091268 fn to_json(&self) -> Json { Number(*self as float) }
Erick Tryzelaared5af702012-05-28 19:10:321269}
1270
Patrick Walton91436882013-02-14 19:47:001271impl ToJson for u64 {
Ben Striegel0fed29c2013-03-08 02:11:091272 fn to_json(&self) -> Json { Number(*self as float) }
Erick Tryzelaared5af702012-05-28 19:10:321273}
1274
Patrick Walton91436882013-02-14 19:47:001275impl ToJson for float {
Ben Striegel0fed29c2013-03-08 02:11:091276 fn to_json(&self) -> Json { Number(*self) }
Erick Tryzelaared5af702012-05-28 19:10:321277}
1278
Patrick Walton91436882013-02-14 19:47:001279impl ToJson for f32 {
Ben Striegel0fed29c2013-03-08 02:11:091280 fn to_json(&self) -> Json { Number(*self as float) }
Erick Tryzelaared5af702012-05-28 19:10:321281}
1282
Patrick Walton91436882013-02-14 19:47:001283impl ToJson for f64 {
Ben Striegel0fed29c2013-03-08 02:11:091284 fn to_json(&self) -> Json { Number(*self as float) }
Erick Tryzelaared5af702012-05-28 19:10:321285}
1286
Patrick Walton91436882013-02-14 19:47:001287impl ToJson for () {
Ben Striegel0fed29c2013-03-08 02:11:091288 fn to_json(&self) -> Json { Null }
Erick Tryzelaared5af702012-05-28 19:10:321289}
1290
Patrick Walton91436882013-02-14 19:47:001291impl ToJson for bool {
Ben Striegel0fed29c2013-03-08 02:11:091292 fn to_json(&self) -> Json { Boolean(*self) }
Erick Tryzelaared5af702012-05-28 19:10:321293}
1294
Patrick Walton91436882013-02-14 19:47:001295impl ToJson for ~str {
Ben Striegel0fed29c2013-03-08 02:11:091296 fn to_json(&self) -> Json { String(copy *self) }
Erick Tryzelaarb361f6c2012-06-13 00:20:511297}
1298
Patrick Walton91436882013-02-14 19:47:001299impl ToJson for @~str {
Ben Striegel0fed29c2013-03-08 02:11:091300 fn to_json(&self) -> Json { String(copy **self) }
Erick Tryzelaared5af702012-05-28 19:10:321301}
1302
Patrick Waltonbf2a2252013-02-21 01:07:171303impl<A:ToJson,B:ToJson> ToJson for (A, B) {
Ben Striegel0fed29c2013-03-08 02:11:091304 fn to_json(&self) -> Json {
1305 match *self {
Brian Andersonbc9efaa2012-09-28 07:22:181306 (ref a, ref b) => {
Erick Tryzelaar49d00b22012-09-24 16:55:421307 List(~[a.to_json(), b.to_json()])
Niko Matsakis97452c02012-08-02 22:42:561308 }
1309 }
Erick Tryzelaared5af702012-05-28 19:10:321310 }
1311}
1312
Patrick Waltonbf2a2252013-02-21 01:07:171313impl<A:ToJson,B:ToJson,C:ToJson> ToJson for (A, B, C) {
Ben Striegel0fed29c2013-03-08 02:11:091314 fn to_json(&self) -> Json {
1315 match *self {
Brian Andersonbc9efaa2012-09-28 07:22:181316 (ref a, ref b, ref c) => {
Erick Tryzelaar49d00b22012-09-24 16:55:421317 List(~[a.to_json(), b.to_json(), c.to_json()])
Niko Matsakis97452c02012-08-02 22:42:561318 }
1319 }
Erick Tryzelaared5af702012-05-28 19:10:321320 }
1321}
1322
Patrick Waltonbf2a2252013-02-21 01:07:171323impl<A:ToJson> ToJson for ~[A] {
Ben Striegel0fed29c2013-03-08 02:11:091324 fn to_json(&self) -> Json { List(self.map(|elt| elt.to_json())) }
Erick Tryzelaared5af702012-05-28 19:10:321325}
1326
Daniel Micaycc148b52013-04-03 13:28:361327impl<A:ToJson + Copy> ToJson for HashMap<~str, A> {
Ben Striegel0fed29c2013-03-08 02:11:091328 fn to_json(&self) -> Json {
Daniel Micaycc148b52013-04-03 13:28:361329 let mut d = HashMap::new();
Niko Matsakis5606fc02013-04-06 15:22:361330 for self.each |key, value| {
Erick Tryzelaar49d00b22012-09-24 16:55:421331 d.insert(copy *key, value.to_json());
Erick Tryzelaared5af702012-05-28 19:10:321332 }
Erick Tryzelaar49d00b22012-09-24 16:55:421333 Object(~d)
Erick Tryzelaared5af702012-05-28 19:10:321334 }
1335}
1336
Patrick Waltonbf2a2252013-02-21 01:07:171337impl<A:ToJson> ToJson for Option<A> {
Ben Striegel0fed29c2013-03-08 02:11:091338 fn to_json(&self) -> Json {
1339 match *self {
Ben Striegela605fd02012-08-11 14:08:421340 None => Null,
Brian Andersonbc9efaa2012-09-28 07:22:181341 Some(ref value) => value.to_json()
Erick Tryzelaared5af702012-05-28 19:10:321342 }
1343 }
1344}
1345
Patrick Walton91436882013-02-14 19:47:001346impl to_str::ToStr for Json {
Patrick Waltonc1084092013-03-22 04:34:301347 fn to_str(&self) -> ~str { to_str(self) }
Erick Tryzelaared5af702012-05-28 19:10:321348}
1349
Patrick Walton91436882013-02-14 19:47:001350impl to_str::ToStr for Error {
Patrick Waltonc1084092013-03-22 04:34:301351 fn to_str(&self) -> ~str {
Paul Stansifer29f32b42012-08-23 00:24:521352 fmt!("%u:%u: %s", self.line, self.col, *self.msg)
Erick Tryzelaara8161762012-06-11 15:32:381353 }
1354}
1355
Brian Anderson6e27b272012-01-18 03:05:071356#[cfg(test)]
1357mod tests {
Patrick Waltonee528652013-05-22 00:24:311358 use core::prelude::*;
1359
Erick Tryzelaarb2908632013-03-27 00:46:291360 use super::*;
1361
Daniel Micaycc148b52013-04-03 13:28:361362 use core::hashmap::HashMap;
Patrick Walton206ab892013-05-25 02:35:291363 use core::io;
1364 use core::result;
John Clementsf91160b2013-02-08 01:06:261365
Erick Tryzelaarb10b8c32013-03-27 07:13:011366 use std::serialize::Decodable;
1367
Huon Wilson5dc5efe2013-05-15 22:55:571368 #[deriving(Eq, Encodable, Decodable)]
Erick Tryzelaar9bbf3842013-03-30 18:08:571369 enum Animal {
1370 Dog,
1371 Frog(~str, int)
1372 }
1373
Huon Wilson5dc5efe2013-05-15 22:55:571374 #[deriving(Eq, Encodable, Decodable)]
Erick Tryzelaar5b7d6082013-03-30 20:31:031375 struct Inner {
1376 a: (),
1377 b: uint,
1378 c: ~[~str],
1379 }
1380
Huon Wilson5dc5efe2013-05-15 22:55:571381 #[deriving(Eq, Encodable, Decodable)]
Erick Tryzelaar5b7d6082013-03-30 20:31:031382 struct Outer {
1383 inner: ~[Inner],
1384 }
1385
Erick Tryzelaar49d00b22012-09-24 16:55:421386 fn mk_object(items: &[(~str, Json)]) -> Json {
Daniel Micaycc148b52013-04-03 13:28:361387 let mut d = ~HashMap::new();
Erick Tryzelaar012dec52012-02-26 00:39:321388
Erick Tryzelaar49d00b22012-09-24 16:55:421389 for items.each |item| {
1390 match *item {
Niko Matsakis7a1a4082013-05-29 23:59:331391 (ref key, ref value) => { d.insert(copy *key, copy *value); },
Erick Tryzelaar49d00b22012-09-24 16:55:421392 }
Erick Tryzelaar012dec52012-02-26 00:39:321393 };
1394
Luqman Aden4cf51c22013-02-15 07:30:301395 Object(d)
Brian Anderson6e27b272012-01-18 03:05:071396 }
1397
1398 #[test]
Erick Tryzelaar012dec52012-02-26 00:39:321399 fn test_write_null() {
Erick Tryzelaar6cf99fa2013-03-27 00:23:001400 assert_eq!(to_str(&Null), ~"null");
Erick Tryzelaar9bbf3842013-03-30 18:08:571401 assert_eq!(to_pretty_str(&Null), ~"null");
Brian Anderson6e27b272012-01-18 03:05:071402 }
1403
Erick Tryzelaar9bbf3842013-03-30 18:08:571404
Brian Anderson6e27b272012-01-18 03:05:071405 #[test]
Erick Tryzelaar49d00b22012-09-24 16:55:421406 fn test_write_number() {
Erick Tryzelaar6cf99fa2013-03-27 00:23:001407 assert_eq!(to_str(&Number(3f)), ~"3");
Erick Tryzelaar9bbf3842013-03-30 18:08:571408 assert_eq!(to_pretty_str(&Number(3f)), ~"3");
1409
Erick Tryzelaar6cf99fa2013-03-27 00:23:001410 assert_eq!(to_str(&Number(3.1f)), ~"3.1");
Erick Tryzelaar9bbf3842013-03-30 18:08:571411 assert_eq!(to_pretty_str(&Number(3.1f)), ~"3.1");
1412
Erick Tryzelaar6cf99fa2013-03-27 00:23:001413 assert_eq!(to_str(&Number(-1.5f)), ~"-1.5");
Erick Tryzelaar9bbf3842013-03-30 18:08:571414 assert_eq!(to_pretty_str(&Number(-1.5f)), ~"-1.5");
1415
Erick Tryzelaar6cf99fa2013-03-27 00:23:001416 assert_eq!(to_str(&Number(0.5f)), ~"0.5");
Erick Tryzelaar9bbf3842013-03-30 18:08:571417 assert_eq!(to_pretty_str(&Number(0.5f)), ~"0.5");
Brian Anderson6e27b272012-01-18 03:05:071418 }
1419
1420 #[test]
Erick Tryzelaar012dec52012-02-26 00:39:321421 fn test_write_str() {
Erick Tryzelaar6cf99fa2013-03-27 00:23:001422 assert_eq!(to_str(&String(~"")), ~"\"\"");
Erick Tryzelaar9bbf3842013-03-30 18:08:571423 assert_eq!(to_pretty_str(&String(~"")), ~"\"\"");
1424
Erick Tryzelaar6cf99fa2013-03-27 00:23:001425 assert_eq!(to_str(&String(~"foo")), ~"\"foo\"");
Erick Tryzelaar9bbf3842013-03-30 18:08:571426 assert_eq!(to_pretty_str(&String(~"foo")), ~"\"foo\"");
Brian Anderson6e27b272012-01-18 03:05:071427 }
1428
1429 #[test]
Erick Tryzelaar012dec52012-02-26 00:39:321430 fn test_write_bool() {
Erick Tryzelaar6cf99fa2013-03-27 00:23:001431 assert_eq!(to_str(&Boolean(true)), ~"true");
Erick Tryzelaar9bbf3842013-03-30 18:08:571432 assert_eq!(to_pretty_str(&Boolean(true)), ~"true");
1433
Erick Tryzelaar6cf99fa2013-03-27 00:23:001434 assert_eq!(to_str(&Boolean(false)), ~"false");
Erick Tryzelaar9bbf3842013-03-30 18:08:571435 assert_eq!(to_pretty_str(&Boolean(false)), ~"false");
Brian Anderson6e27b272012-01-18 03:05:071436 }
1437
1438 #[test]
Erick Tryzelaar012dec52012-02-26 00:39:321439 fn test_write_list() {
Erick Tryzelaar6cf99fa2013-03-27 00:23:001440 assert_eq!(to_str(&List(~[])), ~"[]");
Erick Tryzelaarc9188c82013-03-27 00:34:491441 assert_eq!(to_pretty_str(&List(~[])), ~"[]");
Erick Tryzelaar9bbf3842013-03-30 18:08:571442
1443 assert_eq!(to_str(&List(~[Boolean(true)])), ~"[true]");
Erick Tryzelaarc9188c82013-03-27 00:34:491444 assert_eq!(
1445 to_pretty_str(&List(~[Boolean(true)])),
1446 ~"\
1447 [\n \
1448 true\n\
1449 ]"
1450 );
Erick Tryzelaar9bbf3842013-03-30 18:08:571451
1452 assert_eq!(to_str(&List(~[
1453 Boolean(false),
1454 Null,
1455 List(~[String(~"foo\nbar"), Number(3.5f)])
1456 ])), ~"[false,null,[\"foo\\nbar\",3.5]]");
Erick Tryzelaarc9188c82013-03-27 00:34:491457 assert_eq!(
1458 to_pretty_str(&List(~[
1459 Boolean(false),
1460 Null,
1461 List(~[String(~"foo\nbar"), Number(3.5f)])
1462 ])),
1463 ~"\
1464 [\n \
1465 false,\n \
1466 null,\n \
1467 [\n \
1468 \"foo\\nbar\",\n \
1469 3.5\n \
1470 ]\n\
1471 ]"
1472 );
1473 }
1474
1475 #[test]
Erick Tryzelaar49d00b22012-09-24 16:55:421476 fn test_write_object() {
Erick Tryzelaar609a9e62013-05-23 16:39:001477 assert_eq!(to_str(&mk_object([])), ~"{}");
1478 assert_eq!(to_pretty_str(&mk_object([])), ~"{}");
Erick Tryzelaar9bbf3842013-03-30 18:08:571479
Erick Tryzelaar6cf99fa2013-03-27 00:23:001480 assert_eq!(
Erick Tryzelaar609a9e62013-05-23 16:39:001481 to_str(&mk_object([(~"a", Boolean(true))])),
Erick Tryzelaar6cf99fa2013-03-27 00:23:001482 ~"{\"a\":true}"
1483 );
Erick Tryzelaarc9188c82013-03-27 00:34:491484 assert_eq!(
Erick Tryzelaar609a9e62013-05-23 16:39:001485 to_pretty_str(&mk_object([(~"a", Boolean(true))])),
Erick Tryzelaar9bbf3842013-03-30 18:08:571486 ~"\
1487 {\n \
1488 \"a\": true\n\
1489 }"
1490 );
1491
1492 assert_eq!(
Erick Tryzelaar609a9e62013-05-23 16:39:001493 to_str(&mk_object([
Erick Tryzelaarc9188c82013-03-27 00:34:491494 (~"b", List(~[
Erick Tryzelaar609a9e62013-05-23 16:39:001495 mk_object([(~"c", String(~"\x0c\r"))]),
1496 mk_object([(~"d", String(~""))])
Erick Tryzelaarc9188c82013-03-27 00:34:491497 ]))
1498 ])),
1499 ~"{\
1500 \"b\":[\
1501 {\"c\":\"\\f\\r\"},\
1502 {\"d\":\"\"}\
1503 ]\
1504 }"
1505 );
Erick Tryzelaarc9188c82013-03-27 00:34:491506 assert_eq!(
Erick Tryzelaar609a9e62013-05-23 16:39:001507 to_pretty_str(&mk_object([
Erick Tryzelaarc9188c82013-03-27 00:34:491508 (~"b", List(~[
Erick Tryzelaar609a9e62013-05-23 16:39:001509 mk_object([(~"c", String(~"\x0c\r"))]),
1510 mk_object([(~"d", String(~""))])
Erick Tryzelaarc9188c82013-03-27 00:34:491511 ]))
1512 ])),
1513 ~"\
1514 {\n \
1515 \"b\": [\n \
1516 {\n \
1517 \"c\": \"\\f\\r\"\n \
1518 },\n \
1519 {\n \
1520 \"d\": \"\"\n \
1521 }\n \
1522 ]\n\
1523 }"
1524 );
Erick Tryzelaar9bbf3842013-03-30 18:08:571525
Erick Tryzelaar609a9e62013-05-23 16:39:001526 let a = mk_object([
Erick Tryzelaarc9188c82013-03-27 00:34:491527 (~"a", Boolean(true)),
1528 (~"b", List(~[
Erick Tryzelaar609a9e62013-05-23 16:39:001529 mk_object([(~"c", String(~"\x0c\r"))]),
1530 mk_object([(~"d", String(~""))])
Erick Tryzelaarc9188c82013-03-27 00:34:491531 ]))
1532 ]);
Erick Tryzelaar9bbf3842013-03-30 18:08:571533
Erick Tryzelaarc9188c82013-03-27 00:34:491534 // We can't compare the strings directly because the object fields be
1535 // printed in a different order.
Erick Tryzelaar9bbf3842013-03-30 18:08:571536 assert_eq!(copy a, from_str(to_str(&a)).unwrap());
1537 assert_eq!(copy a, from_str(to_pretty_str(&a)).unwrap());
Erick Tryzelaarc9188c82013-03-27 00:34:491538 }
1539
1540 #[test]
Erick Tryzelaar9bbf3842013-03-30 18:08:571541 fn test_write_enum() {
Erick Tryzelaarc9188c82013-03-27 00:34:491542 let animal = Dog;
Erick Tryzelaarc9188c82013-03-27 00:34:491543 assert_eq!(
Erick Tryzelaar9bbf3842013-03-30 18:08:571544 do io::with_str_writer |wr| {
Patrick Waltondc5df612013-05-02 00:54:541545 let mut encoder = Encoder(wr);
1546 animal.encode(&mut encoder);
Erick Tryzelaar9bbf3842013-03-30 18:08:571547 },
1548 ~"\"Dog\""
1549 );
1550 assert_eq!(
1551 do io::with_str_writer |wr| {
Patrick Waltondc5df612013-05-02 00:54:541552 let mut encoder = PrettyEncoder(wr);
1553 animal.encode(&mut encoder);
Erick Tryzelaar9bbf3842013-03-30 18:08:571554 },
1555 ~"\"Dog\""
1556 );
1557
1558 let animal = Frog(~"Henry", 349);
1559 assert_eq!(
1560 do io::with_str_writer |wr| {
Patrick Waltondc5df612013-05-02 00:54:541561 let mut encoder = Encoder(wr);
1562 animal.encode(&mut encoder);
Erick Tryzelaar9bbf3842013-03-30 18:08:571563 },
1564 ~"[\"Frog\",\"Henry\",349]"
1565 );
1566 assert_eq!(
1567 do io::with_str_writer |wr| {
Patrick Waltondc5df612013-05-02 00:54:541568 let mut encoder = PrettyEncoder(wr);
1569 animal.encode(&mut encoder);
Erick Tryzelaar9bbf3842013-03-30 18:08:571570 },
Erick Tryzelaarc9188c82013-03-27 00:34:491571 ~"\
1572 [\n \
1573 \"Frog\",\n \
Erick Tryzelaar4d995e62013-03-27 07:14:521574 \"Henry\",\n \
1575 349\n\
Erick Tryzelaarc9188c82013-03-27 00:34:491576 ]"
1577 );
John Clementsc952c042013-02-08 23:36:401578 }
1579
1580 #[test]
Erick Tryzelaar6cf99fa2013-03-27 00:23:001581 fn test_write_some() {
1582 let value = Some(~"jodhpurs");
1583 let s = do io::with_str_writer |wr| {
Patrick Waltondc5df612013-05-02 00:54:541584 let mut encoder = Encoder(wr);
1585 value.encode(&mut encoder);
Erick Tryzelaar6cf99fa2013-03-27 00:23:001586 };
1587 assert_eq!(s, ~"\"jodhpurs\"");
John Clementsc952c042013-02-08 23:36:401588
Erick Tryzelaarc9188c82013-03-27 00:34:491589 let value = Some(~"jodhpurs");
1590 let s = do io::with_str_writer |wr| {
Patrick Waltondc5df612013-05-02 00:54:541591 let mut encoder = PrettyEncoder(wr);
1592 value.encode(&mut encoder);
Erick Tryzelaarc9188c82013-03-27 00:34:491593 };
1594 assert_eq!(s, ~"\"jodhpurs\"");
1595 }
1596
1597 #[test]
Erick Tryzelaar6cf99fa2013-03-27 00:23:001598 fn test_write_none() {
1599 let value: Option<~str> = None;
1600 let s = do io::with_str_writer |wr| {
Patrick Waltondc5df612013-05-02 00:54:541601 let mut encoder = Encoder(wr);
1602 value.encode(&mut encoder);
Erick Tryzelaar6cf99fa2013-03-27 00:23:001603 };
1604 assert_eq!(s, ~"null");
John Clementsf91160b2013-02-08 01:06:261605
Erick Tryzelaarc9188c82013-03-27 00:34:491606 let s = do io::with_str_writer |wr| {
Patrick Waltondc5df612013-05-02 00:54:541607 let mut encoder = Encoder(wr);
1608 value.encode(&mut encoder);
Erick Tryzelaarc9188c82013-03-27 00:34:491609 };
1610 assert_eq!(s, ~"null");
1611 }
1612
1613 #[test]
Erick Tryzelaar012dec52012-02-26 00:39:321614 fn test_trailing_characters() {
Erick Tryzelaar609a9e62013-05-23 16:39:001615 assert_eq!(from_str("nulla"),
Patrick Waltond7e74b52013-03-06 21:58:021616 Err(Error {line: 1u, col: 5u, msg: @~"trailing characters"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001617 assert_eq!(from_str("truea"),
Patrick Waltond7e74b52013-03-06 21:58:021618 Err(Error {line: 1u, col: 5u, msg: @~"trailing characters"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001619 assert_eq!(from_str("falsea"),
Patrick Waltond7e74b52013-03-06 21:58:021620 Err(Error {line: 1u, col: 6u, msg: @~"trailing characters"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001621 assert_eq!(from_str("1a"),
Patrick Waltond7e74b52013-03-06 21:58:021622 Err(Error {line: 1u, col: 2u, msg: @~"trailing characters"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001623 assert_eq!(from_str("[]a"),
Patrick Waltond7e74b52013-03-06 21:58:021624 Err(Error {line: 1u, col: 3u, msg: @~"trailing characters"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001625 assert_eq!(from_str("{}a"),
Patrick Waltond7e74b52013-03-06 21:58:021626 Err(Error {line: 1u, col: 3u, msg: @~"trailing characters"}));
Erick Tryzelaar012dec52012-02-26 00:39:321627 }
1628
1629 #[test]
1630 fn test_read_identifiers() {
Erick Tryzelaar609a9e62013-05-23 16:39:001631 assert_eq!(from_str("n"),
Patrick Waltond7e74b52013-03-06 21:58:021632 Err(Error {line: 1u, col: 2u, msg: @~"invalid syntax"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001633 assert_eq!(from_str("nul"),
Patrick Waltond7e74b52013-03-06 21:58:021634 Err(Error {line: 1u, col: 4u, msg: @~"invalid syntax"}));
Erick Tryzelaar012dec52012-02-26 00:39:321635
Erick Tryzelaar609a9e62013-05-23 16:39:001636 assert_eq!(from_str("t"),
Patrick Waltond7e74b52013-03-06 21:58:021637 Err(Error {line: 1u, col: 2u, msg: @~"invalid syntax"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001638 assert_eq!(from_str("truz"),
Patrick Waltond7e74b52013-03-06 21:58:021639 Err(Error {line: 1u, col: 4u, msg: @~"invalid syntax"}));
Erick Tryzelaar012dec52012-02-26 00:39:321640
Erick Tryzelaar609a9e62013-05-23 16:39:001641 assert_eq!(from_str("f"),
Patrick Waltond7e74b52013-03-06 21:58:021642 Err(Error {line: 1u, col: 2u, msg: @~"invalid syntax"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001643 assert_eq!(from_str("faz"),
Patrick Waltond7e74b52013-03-06 21:58:021644 Err(Error {line: 1u, col: 3u, msg: @~"invalid syntax"}));
Erick Tryzelaar012dec52012-02-26 00:39:321645
Erick Tryzelaar609a9e62013-05-23 16:39:001646 assert_eq!(from_str("null"), Ok(Null));
1647 assert_eq!(from_str("true"), Ok(Boolean(true)));
1648 assert_eq!(from_str("false"), Ok(Boolean(false)));
1649 assert_eq!(from_str(" null "), Ok(Null));
1650 assert_eq!(from_str(" true "), Ok(Boolean(true)));
1651 assert_eq!(from_str(" false "), Ok(Boolean(false)));
Erick Tryzelaar012dec52012-02-26 00:39:321652 }
1653
1654 #[test]
Erick Tryzelaar5b7d6082013-03-30 20:31:031655 fn test_decode_identifiers() {
Erick Tryzelaar609a9e62013-05-23 16:39:001656 let mut decoder = Decoder(from_str("null").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541657 let v: () = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031658 assert_eq!(v, ());
1659
Erick Tryzelaar609a9e62013-05-23 16:39:001660 let mut decoder = Decoder(from_str("true").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541661 let v: bool = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031662 assert_eq!(v, true);
1663
Erick Tryzelaar609a9e62013-05-23 16:39:001664 let mut decoder = Decoder(from_str("false").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541665 let v: bool = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031666 assert_eq!(v, false);
1667 }
1668
1669 #[test]
Erick Tryzelaar49d00b22012-09-24 16:55:421670 fn test_read_number() {
Erick Tryzelaar609a9e62013-05-23 16:39:001671 assert_eq!(from_str("+"),
Patrick Waltond7e74b52013-03-06 21:58:021672 Err(Error {line: 1u, col: 1u, msg: @~"invalid syntax"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001673 assert_eq!(from_str("."),
Patrick Waltond7e74b52013-03-06 21:58:021674 Err(Error {line: 1u, col: 1u, msg: @~"invalid syntax"}));
Erick Tryzelaar012dec52012-02-26 00:39:321675
Erick Tryzelaar609a9e62013-05-23 16:39:001676 assert_eq!(from_str("-"),
Patrick Waltond7e74b52013-03-06 21:58:021677 Err(Error {line: 1u, col: 2u, msg: @~"invalid number"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001678 assert_eq!(from_str("00"),
Patrick Waltond7e74b52013-03-06 21:58:021679 Err(Error {line: 1u, col: 2u, msg: @~"invalid number"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001680 assert_eq!(from_str("1."),
Patrick Waltond7e74b52013-03-06 21:58:021681 Err(Error {line: 1u, col: 3u, msg: @~"invalid number"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001682 assert_eq!(from_str("1e"),
Patrick Waltond7e74b52013-03-06 21:58:021683 Err(Error {line: 1u, col: 3u, msg: @~"invalid number"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001684 assert_eq!(from_str("1e+"),
Patrick Waltond7e74b52013-03-06 21:58:021685 Err(Error {line: 1u, col: 4u, msg: @~"invalid number"}));
Erick Tryzelaar012dec52012-02-26 00:39:321686
Erick Tryzelaar609a9e62013-05-23 16:39:001687 assert_eq!(from_str("3"), Ok(Number(3f)));
1688 assert_eq!(from_str("3.1"), Ok(Number(3.1f)));
1689 assert_eq!(from_str("-1.2"), Ok(Number(-1.2f)));
1690 assert_eq!(from_str("0.4"), Ok(Number(0.4f)));
1691 assert_eq!(from_str("0.4e5"), Ok(Number(0.4e5f)));
1692 assert_eq!(from_str("0.4e+15"), Ok(Number(0.4e15f)));
1693 assert_eq!(from_str("0.4e-01"), Ok(Number(0.4e-01f)));
1694 assert_eq!(from_str(" 3 "), Ok(Number(3f)));
Erick Tryzelaar012dec52012-02-26 00:39:321695 }
1696
1697 #[test]
Erick Tryzelaar5b7d6082013-03-30 20:31:031698 fn test_decode_numbers() {
Erick Tryzelaar609a9e62013-05-23 16:39:001699 let mut decoder = Decoder(from_str("3").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541700 let v: float = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031701 assert_eq!(v, 3f);
1702
Erick Tryzelaar609a9e62013-05-23 16:39:001703 let mut decoder = Decoder(from_str("3.1").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541704 let v: float = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031705 assert_eq!(v, 3.1f);
1706
Erick Tryzelaar609a9e62013-05-23 16:39:001707 let mut decoder = Decoder(from_str("-1.2").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541708 let v: float = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031709 assert_eq!(v, -1.2f);
1710
Erick Tryzelaar609a9e62013-05-23 16:39:001711 let mut decoder = Decoder(from_str("0.4").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541712 let v: float = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031713 assert_eq!(v, 0.4f);
1714
Erick Tryzelaar609a9e62013-05-23 16:39:001715 let mut decoder = Decoder(from_str("0.4e5").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541716 let v: float = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031717 assert_eq!(v, 0.4e5f);
1718
Erick Tryzelaar609a9e62013-05-23 16:39:001719 let mut decoder = Decoder(from_str("0.4e15").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541720 let v: float = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031721 assert_eq!(v, 0.4e15f);
1722
Erick Tryzelaar609a9e62013-05-23 16:39:001723 let mut decoder = Decoder(from_str("0.4e-01").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541724 let v: float = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031725 assert_eq!(v, 0.4e-01f);
1726 }
1727
1728 #[test]
Erick Tryzelaar012dec52012-02-26 00:39:321729 fn test_read_str() {
Erick Tryzelaar609a9e62013-05-23 16:39:001730 assert_eq!(from_str("\""),
Patrick Waltond7e74b52013-03-06 21:58:021731 Err(Error {line: 1u, col: 2u, msg: @~"EOF while parsing string"
1732 }));
Erick Tryzelaar609a9e62013-05-23 16:39:001733 assert_eq!(from_str("\"lol"),
Patrick Waltond7e74b52013-03-06 21:58:021734 Err(Error {line: 1u, col: 5u, msg: @~"EOF while parsing string"
1735 }));
Erick Tryzelaar012dec52012-02-26 00:39:321736
Erick Tryzelaar609a9e62013-05-23 16:39:001737 assert_eq!(from_str("\"\""), Ok(String(~"")));
1738 assert_eq!(from_str("\"foo\""), Ok(String(~"foo")));
1739 assert_eq!(from_str("\"\\\"\""), Ok(String(~"\"")));
1740 assert_eq!(from_str("\"\\b\""), Ok(String(~"\x08")));
1741 assert_eq!(from_str("\"\\n\""), Ok(String(~"\n")));
1742 assert_eq!(from_str("\"\\r\""), Ok(String(~"\r")));
1743 assert_eq!(from_str("\"\\t\""), Ok(String(~"\t")));
1744 assert_eq!(from_str(" \"foo\" "), Ok(String(~"foo")));
1745 assert_eq!(from_str("\"\\u12ab\""), Ok(String(~"\u12ab")));
1746 assert_eq!(from_str("\"\\uAB12\""), Ok(String(~"\uAB12")));
Erick Tryzelaar012dec52012-02-26 00:39:321747 }
1748
1749 #[test]
Erick Tryzelaar5b7d6082013-03-30 20:31:031750 fn test_decode_str() {
Erick Tryzelaar609a9e62013-05-23 16:39:001751 let mut decoder = Decoder(from_str("\"\"").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541752 let v: ~str = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031753 assert_eq!(v, ~"");
1754
Erick Tryzelaar609a9e62013-05-23 16:39:001755 let mut decoder = Decoder(from_str("\"foo\"").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541756 let v: ~str = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031757 assert_eq!(v, ~"foo");
1758
Erick Tryzelaar609a9e62013-05-23 16:39:001759 let mut decoder = Decoder(from_str("\"\\\"\"").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541760 let v: ~str = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031761 assert_eq!(v, ~"\"");
1762
Erick Tryzelaar609a9e62013-05-23 16:39:001763 let mut decoder = Decoder(from_str("\"\\b\"").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541764 let v: ~str = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031765 assert_eq!(v, ~"\x08");
1766
Erick Tryzelaar609a9e62013-05-23 16:39:001767 let mut decoder = Decoder(from_str("\"\\n\"").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541768 let v: ~str = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031769 assert_eq!(v, ~"\n");
1770
Erick Tryzelaar609a9e62013-05-23 16:39:001771 let mut decoder = Decoder(from_str("\"\\r\"").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541772 let v: ~str = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031773 assert_eq!(v, ~"\r");
1774
Erick Tryzelaar609a9e62013-05-23 16:39:001775 let mut decoder = Decoder(from_str("\"\\t\"").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541776 let v: ~str = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031777 assert_eq!(v, ~"\t");
1778
Erick Tryzelaar609a9e62013-05-23 16:39:001779 let mut decoder = Decoder(from_str("\"\\u12ab\"").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541780 let v: ~str = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031781 assert_eq!(v, ~"\u12ab");
1782
Erick Tryzelaar609a9e62013-05-23 16:39:001783 let mut decoder = Decoder(from_str("\"\\uAB12\"").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541784 let v: ~str = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031785 assert_eq!(v, ~"\uAB12");
Kevin Cantucf386182012-08-31 04:03:191786 }
1787
1788 #[test]
Erick Tryzelaar012dec52012-02-26 00:39:321789 fn test_read_list() {
Erick Tryzelaar609a9e62013-05-23 16:39:001790 assert_eq!(from_str("["),
Patrick Waltond7e74b52013-03-06 21:58:021791 Err(Error {line: 1u, col: 2u, msg: @~"EOF while parsing value"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001792 assert_eq!(from_str("[1"),
Patrick Waltond7e74b52013-03-06 21:58:021793 Err(Error {line: 1u, col: 3u, msg: @~"EOF while parsing list"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001794 assert_eq!(from_str("[1,"),
Patrick Waltond7e74b52013-03-06 21:58:021795 Err(Error {line: 1u, col: 4u, msg: @~"EOF while parsing value"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001796 assert_eq!(from_str("[1,]"),
Patrick Waltond7e74b52013-03-06 21:58:021797 Err(Error {line: 1u, col: 4u, msg: @~"invalid syntax"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001798 assert_eq!(from_str("[6 7]"),
Patrick Waltond7e74b52013-03-06 21:58:021799 Err(Error {line: 1u, col: 4u, msg: @~"expected `,` or `]`"}));
Erick Tryzelaar012dec52012-02-26 00:39:321800
Erick Tryzelaar609a9e62013-05-23 16:39:001801 assert_eq!(from_str("[]"), Ok(List(~[])));
1802 assert_eq!(from_str("[ ]"), Ok(List(~[])));
1803 assert_eq!(from_str("[true]"), Ok(List(~[Boolean(true)])));
1804 assert_eq!(from_str("[ false ]"), Ok(List(~[Boolean(false)])));
1805 assert_eq!(from_str("[null]"), Ok(List(~[Null])));
1806 assert_eq!(from_str("[3, 1]"),
Patrick Waltond7e74b52013-03-06 21:58:021807 Ok(List(~[Number(3f), Number(1f)])));
Erick Tryzelaar609a9e62013-05-23 16:39:001808 assert_eq!(from_str("\n[3, 2]\n"),
Patrick Waltond7e74b52013-03-06 21:58:021809 Ok(List(~[Number(3f), Number(2f)])));
Erick Tryzelaar609a9e62013-05-23 16:39:001810 assert_eq!(from_str("[2, [4, 1]]"),
Patrick Waltond7e74b52013-03-06 21:58:021811 Ok(List(~[Number(2f), List(~[Number(4f), Number(1f)])])));
Erick Tryzelaar012dec52012-02-26 00:39:321812 }
1813
1814 #[test]
Erick Tryzelaar5b7d6082013-03-30 20:31:031815 fn test_decode_list() {
Erick Tryzelaar609a9e62013-05-23 16:39:001816 let mut decoder = Decoder(from_str("[]").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541817 let v: ~[()] = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031818 assert_eq!(v, ~[]);
1819
Erick Tryzelaar609a9e62013-05-23 16:39:001820 let mut decoder = Decoder(from_str("[null]").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541821 let v: ~[()] = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031822 assert_eq!(v, ~[()]);
1823
Erick Tryzelaar609a9e62013-05-23 16:39:001824 let mut decoder = Decoder(from_str("[true]").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541825 let v: ~[bool] = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031826 assert_eq!(v, ~[true]);
1827
Erick Tryzelaar609a9e62013-05-23 16:39:001828 let mut decoder = Decoder(from_str("[true]").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541829 let v: ~[bool] = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031830 assert_eq!(v, ~[true]);
1831
Erick Tryzelaar609a9e62013-05-23 16:39:001832 let mut decoder = Decoder(from_str("[3, 1]").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541833 let v: ~[int] = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031834 assert_eq!(v, ~[3, 1]);
1835
Erick Tryzelaar609a9e62013-05-23 16:39:001836 let mut decoder = Decoder(from_str("[[3], [1, 2]]").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541837 let v: ~[~[uint]] = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031838 assert_eq!(v, ~[~[3], ~[1, 2]]);
1839 }
1840
1841 #[test]
Erick Tryzelaar49d00b22012-09-24 16:55:421842 fn test_read_object() {
Erick Tryzelaar609a9e62013-05-23 16:39:001843 assert_eq!(from_str("{"),
Patrick Waltond7e74b52013-03-06 21:58:021844 Err(Error {
1845 line: 1u,
1846 col: 2u,
1847 msg: @~"EOF while parsing object"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001848 assert_eq!(from_str("{ "),
Patrick Waltond7e74b52013-03-06 21:58:021849 Err(Error {
1850 line: 1u,
1851 col: 3u,
1852 msg: @~"EOF while parsing object"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001853 assert_eq!(from_str("{1"),
Patrick Waltond7e74b52013-03-06 21:58:021854 Err(Error {
1855 line: 1u,
1856 col: 2u,
1857 msg: @~"key must be a string"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001858 assert_eq!(from_str("{ \"a\""),
Patrick Waltond7e74b52013-03-06 21:58:021859 Err(Error {
1860 line: 1u,
1861 col: 6u,
1862 msg: @~"EOF while parsing object"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001863 assert_eq!(from_str("{\"a\""),
Patrick Waltond7e74b52013-03-06 21:58:021864 Err(Error {
1865 line: 1u,
1866 col: 5u,
1867 msg: @~"EOF while parsing object"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001868 assert_eq!(from_str("{\"a\" "),
Patrick Waltond7e74b52013-03-06 21:58:021869 Err(Error {
1870 line: 1u,
1871 col: 6u,
1872 msg: @~"EOF while parsing object"}));
Erick Tryzelaar012dec52012-02-26 00:39:321873
Erick Tryzelaar609a9e62013-05-23 16:39:001874 assert_eq!(from_str("{\"a\" 1"),
Patrick Waltond7e74b52013-03-06 21:58:021875 Err(Error {line: 1u, col: 6u, msg: @~"expected `:`"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001876 assert_eq!(from_str("{\"a\":"),
Patrick Waltond7e74b52013-03-06 21:58:021877 Err(Error {line: 1u, col: 6u, msg: @~"EOF while parsing value"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001878 assert_eq!(from_str("{\"a\":1"),
Patrick Waltond7e74b52013-03-06 21:58:021879 Err(Error {
1880 line: 1u,
1881 col: 7u,
1882 msg: @~"EOF while parsing object"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001883 assert_eq!(from_str("{\"a\":1 1"),
Patrick Waltond7e74b52013-03-06 21:58:021884 Err(Error {line: 1u, col: 8u, msg: @~"expected `,` or `}`"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001885 assert_eq!(from_str("{\"a\":1,"),
Patrick Waltond7e74b52013-03-06 21:58:021886 Err(Error {
1887 line: 1u,
1888 col: 8u,
1889 msg: @~"EOF while parsing object"}));
Erick Tryzelaar012dec52012-02-26 00:39:321890
Erick Tryzelaar609a9e62013-05-23 16:39:001891 assert_eq!(result::unwrap(from_str("{}")), mk_object([]));
1892 assert_eq!(result::unwrap(from_str("{\"a\": 3}")),
1893 mk_object([(~"a", Number(3.0f))]));
Erick Tryzelaar012dec52012-02-26 00:39:321894
Erick Tryzelaar6cf99fa2013-03-27 00:23:001895 assert_eq!(result::unwrap(from_str(
Erick Tryzelaar609a9e62013-05-23 16:39:001896 "{ \"a\": null, \"b\" : true }")),
1897 mk_object([
Ben Striegela605fd02012-08-11 14:08:421898 (~"a", Null),
Patrick Waltond7e74b52013-03-06 21:58:021899 (~"b", Boolean(true))]));
Erick Tryzelaar6cf99fa2013-03-27 00:23:001900 assert_eq!(result::unwrap(
Erick Tryzelaar609a9e62013-05-23 16:39:001901 from_str("\n{ \"a\": null, \"b\" : true }\n")),
1902 mk_object([
Ben Striegela605fd02012-08-11 14:08:421903 (~"a", Null),
Patrick Waltond7e74b52013-03-06 21:58:021904 (~"b", Boolean(true))]));
Erick Tryzelaar6cf99fa2013-03-27 00:23:001905 assert_eq!(result::unwrap(from_str(
Erick Tryzelaar609a9e62013-05-23 16:39:001906 "{\"a\" : 1.0 ,\"b\": [ true ]}")),
1907 mk_object([
Erick Tryzelaar49d00b22012-09-24 16:55:421908 (~"a", Number(1.0)),
1909 (~"b", List(~[Boolean(true)]))
Patrick Waltond7e74b52013-03-06 21:58:021910 ]));
Erick Tryzelaar6cf99fa2013-03-27 00:23:001911 assert_eq!(result::unwrap(from_str(
Michael Sullivan92743dc2012-07-14 05:57:481912 ~"{" +
Alex Crichtonb04c40b2013-05-27 23:04:001913 "\"a\": 1.0, " +
1914 "\"b\": [" +
1915 "true," +
1916 "\"foo\\nbar\", " +
1917 "{ \"c\": {\"d\": null} } " +
1918 "]" +
1919 "}")),
Erick Tryzelaar609a9e62013-05-23 16:39:001920 mk_object([
Erick Tryzelaar49d00b22012-09-24 16:55:421921 (~"a", Number(1.0f)),
1922 (~"b", List(~[
Ben Striegela605fd02012-08-11 14:08:421923 Boolean(true),
Erick Tryzelaar49d00b22012-09-24 16:55:421924 String(~"foo\nbar"),
Erick Tryzelaar609a9e62013-05-23 16:39:001925 mk_object([
1926 (~"c", mk_object([(~"d", Null)]))
Michael Sullivan98e161f2012-06-29 23:26:561927 ])
1928 ]))
Patrick Waltond7e74b52013-03-06 21:58:021929 ]));
Erick Tryzelaar012dec52012-02-26 00:39:321930 }
1931
1932 #[test]
Erick Tryzelaar5b7d6082013-03-30 20:31:031933 fn test_decode_struct() {
1934 let s = ~"{
1935 \"inner\": [
1936 { \"a\": null, \"b\": 2, \"c\": [\"abc\", \"xyz\"] }
1937 ]
1938 }";
Patrick Waltondc5df612013-05-02 00:54:541939 let mut decoder = Decoder(from_str(s).unwrap());
1940 let v: Outer = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031941 assert_eq!(
1942 v,
1943 Outer {
1944 inner: ~[
1945 Inner { a: (), b: 2, c: ~[~"abc", ~"xyz"] }
1946 ]
1947 }
1948 );
Erick Tryzelaarb10b8c32013-03-27 07:13:011949 }
1950
1951 #[test]
Erick Tryzelaar5b7d6082013-03-30 20:31:031952 fn test_decode_option() {
Erick Tryzelaar609a9e62013-05-23 16:39:001953 let mut decoder = Decoder(from_str("null").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541954 let value: Option<~str> = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031955 assert_eq!(value, None);
1956
Erick Tryzelaar609a9e62013-05-23 16:39:001957 let mut decoder = Decoder(from_str("\"jodhpurs\"").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541958 let value: Option<~str> = Decodable::decode(&mut decoder);
Erick Tryzelaarb10b8c32013-03-27 07:13:011959 assert_eq!(value, Some(~"jodhpurs"));
1960 }
1961
1962 #[test]
Erick Tryzelaar5b7d6082013-03-30 20:31:031963 fn test_decode_enum() {
Erick Tryzelaar609a9e62013-05-23 16:39:001964 let mut decoder = Decoder(from_str("\"Dog\"").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541965 let value: Animal = Decodable::decode(&mut decoder);
Erick Tryzelaar4e9a63f2013-03-27 00:42:011966 assert_eq!(value, Dog);
Erick Tryzelaar4e9a63f2013-03-27 00:42:011967
Patrick Waltondc5df612013-05-02 00:54:541968 let mut decoder =
Erick Tryzelaar609a9e62013-05-23 16:39:001969 Decoder(from_str("[\"Frog\",\"Henry\",349]").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541970 let value: Animal = Decodable::decode(&mut decoder);
Erick Tryzelaar4e9a63f2013-03-27 00:42:011971 assert_eq!(value, Frog(~"Henry", 349));
1972 }
1973
1974 #[test]
Erick Tryzelaar5b7d6082013-03-30 20:31:031975 fn test_decode_map() {
Erick Tryzelaard1a83e62013-03-29 16:04:351976 let s = ~"{\"a\": \"Dog\", \"b\": [\"Frog\", \"Henry\", 349]}";
Patrick Waltondc5df612013-05-02 00:54:541977 let mut decoder = Decoder(from_str(s).unwrap());
1978 let mut map: HashMap<~str, Animal> = Decodable::decode(&mut decoder);
Erick Tryzelaard1a83e62013-03-29 16:04:351979
Erick Tryzelaarbdef3f12013-03-29 16:10:311980 assert_eq!(map.pop(&~"a"), Some(Dog));
1981 assert_eq!(map.pop(&~"b"), Some(Frog(~"Henry", 349)));
Erick Tryzelaard1a83e62013-03-29 16:04:351982 }
1983
1984 #[test]
Erick Tryzelaar012dec52012-02-26 00:39:321985 fn test_multiline_errors() {
Erick Tryzelaar609a9e62013-05-23 16:39:001986 assert_eq!(from_str("{\n \"foo\":\n \"bar\""),
Patrick Waltond7e74b52013-03-06 21:58:021987 Err(Error {
1988 line: 3u,
1989 col: 8u,
1990 msg: @~"EOF while parsing object"}));
Brian Anderson6e27b272012-01-18 03:05:071991 }
1992}