blob: 15553b035f65e7dadcae1c5c464b7992c15874cb [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
Patrick Walton206ab892013-05-25 02:35:2921use core::char;
22use core::float;
Daniel Micaycc148b52013-04-03 13:28:3623use core::hashmap::HashMap;
Patrick Walton206ab892013-05-25 02:35:2924use core::io::{WriterUtil, ReaderUtil};
25use core::io;
26use core::str;
27use core::to_str;
28use core::vec;
Erick Tryzelaarcefecd82013-03-13 18:29:0529
Patrick Waltoneb4d39e2013-01-26 00:57:3930use serialize::Encodable;
Patrick Walton57c59992012-12-23 22:41:3731use serialize;
Patrick Walton22b87572012-09-08 01:53:1432use sort::Sort;
Elly Jonesbd726262011-11-07 19:01:2833
Gareth Daniel Smithbe014162012-07-04 21:53:1234/// Represents a json value
Erick Tryzelaar49d00b22012-09-24 16:55:4235pub enum Json {
36 Number(float),
37 String(~str),
Ben Striegela605fd02012-08-11 14:08:4238 Boolean(bool),
Erick Tryzelaar49d00b22012-09-24 16:55:4239 List(List),
40 Object(~Object),
Ben Striegela605fd02012-08-11 14:08:4241 Null,
Elly Jonesbd726262011-11-07 19:01:2842}
43
Erick Tryzelaar49d00b22012-09-24 16:55:4244pub type List = ~[Json];
Daniel Micaycc148b52013-04-03 13:28:3645pub type Object = HashMap<~str, Json>;
Erick Tryzelaar49d00b22012-09-24 16:55:4246
Andrew Paseltiner45677ee2013-03-22 20:09:2047#[deriving(Eq)]
Alex Crichton39568502013-05-29 03:11:4148/// If an error occurs while parsing some JSON, this is the structure which is
49/// returned
Erick Tryzelaar49d00b22012-09-24 16:55:4250pub struct Error {
Alex Crichton39568502013-05-29 03:11:4151 /// The line number at which the error occurred
Erick Tryzelaar012dec52012-02-26 00:39:3252 line: uint,
Alex Crichton39568502013-05-29 03:11:4153 /// The column number at which the error occurred
Erick Tryzelaar012dec52012-02-26 00:39:3254 col: uint,
Alex Crichton39568502013-05-29 03:11:4155 /// A message describing the type of the error
Michael Sullivan92743dc2012-07-14 05:57:4856 msg: @~str,
Kevin Cantud47cb102012-08-30 23:39:5657}
58
Kevin Cantuc43426e2012-09-13 05:09:5559fn escape_str(s: &str) -> ~str {
Michael Sullivan92743dc2012-07-14 05:57:4860 let mut escaped = ~"\"";
Huon Wilson4b806b42013-06-08 12:04:4661 for s.iter().advance |c| {
Brian Andersonecaf9e32012-08-06 19:34:0862 match c {
Seo Sanghyeon8f803232013-05-23 16:09:1163 '"' => escaped += "\\\"",
64 '\\' => escaped += "\\\\",
65 '\x08' => escaped += "\\b",
66 '\x0c' => escaped += "\\f",
67 '\n' => escaped += "\\n",
68 '\r' => escaped += "\\r",
69 '\t' => escaped += "\\t",
Brian Anderson025d8662012-08-04 02:59:0470 _ => escaped += str::from_char(c)
Erick Tryzelaarb361f6c2012-06-13 00:20:5171 }
72 };
73
Seo Sanghyeon8f803232013-05-23 16:09:1174 escaped += "\"";
Erick Tryzelaarb361f6c2012-06-13 00:20:5175
76 escaped
77}
78
Erick Tryzelaar49d00b22012-09-24 16:55:4279fn spaces(n: uint) -> ~str {
80 let mut ss = ~"";
Huon Wilson15538742013-06-10 07:42:2481 for n.times { ss.push_str(" "); }
Erick Tryzelaar49d00b22012-09-24 16:55:4282 return ss;
83}
84
Alex Crichton39568502013-05-29 03:11:4185/// A structure for implementing serialization to JSON.
Erick Tryzelaar8650c6f2012-12-18 03:31:0486pub struct Encoder {
Patrick Waltonb1c69982013-03-12 20:00:5087 priv wr: @io::Writer,
Erick Tryzelaar49d00b22012-09-24 16:55:4288}
89
Alex Crichton39568502013-05-29 03:11:4190/// Creates a new JSON encoder whose output will be written to the writer
91/// specified.
Patrick Waltonb1c69982013-03-12 20:00:5092pub fn Encoder(wr: @io::Writer) -> Encoder {
Patrick Waltondc5df612013-05-02 00:54:5493 Encoder {
94 wr: wr
95 }
Erick Tryzelaar49d00b22012-09-24 16:55:4296}
97
Patrick Waltondc5df612013-05-02 00:54:5498impl serialize::Encoder for Encoder {
99 fn emit_nil(&mut self) { self.wr.write_str("null") }
100
101 fn emit_uint(&mut self, v: uint) { self.emit_float(v as float); }
102 fn emit_u64(&mut self, v: u64) { self.emit_float(v as float); }
103 fn emit_u32(&mut self, v: u32) { self.emit_float(v as float); }
104 fn emit_u16(&mut self, v: u16) { self.emit_float(v as float); }
105 fn emit_u8(&mut self, v: u8) { self.emit_float(v as float); }
106
107 fn emit_int(&mut self, v: int) { self.emit_float(v as float); }
108 fn emit_i64(&mut self, v: i64) { self.emit_float(v as float); }
109 fn emit_i32(&mut self, v: i32) { self.emit_float(v as float); }
110 fn emit_i16(&mut self, v: i16) { self.emit_float(v as float); }
111 fn emit_i8(&mut self, v: i8) { self.emit_float(v as float); }
112
113 fn emit_bool(&mut self, v: bool) {
114 if v {
115 self.wr.write_str("true");
116 } else {
117 self.wr.write_str("false");
118 }
119 }
120
121 fn emit_f64(&mut self, v: f64) { self.emit_float(v as float); }
122 fn emit_f32(&mut self, v: f32) { self.emit_float(v as float); }
123 fn emit_float(&mut self, v: float) {
124 self.wr.write_str(float::to_str_digits(v, 6u));
125 }
126
127 fn emit_char(&mut self, v: char) { self.emit_str(str::from_char(v)) }
128 fn emit_str(&mut self, v: &str) { self.wr.write_str(escape_str(v)) }
129
130 fn emit_enum(&mut self, _name: &str, f: &fn(&mut Encoder)) { f(self) }
131
132 fn emit_enum_variant(&mut self,
133 name: &str,
134 _id: uint,
135 cnt: uint,
136 f: &fn(&mut Encoder)) {
137 // enums are encoded as strings or vectors:
138 // Bunny => "Bunny"
139 // Kangaroo(34,"William") => ["Kangaroo",[34,"William"]]
140
141 if cnt == 0 {
142 self.wr.write_str(escape_str(name));
143 } else {
144 self.wr.write_char('[');
145 self.wr.write_str(escape_str(name));
146 self.wr.write_char(',');
147 f(self);
148 self.wr.write_char(']');
149 }
150 }
151
152 fn emit_enum_variant_arg(&mut self, idx: uint, f: &fn(&mut Encoder)) {
153 if idx != 0 {
154 self.wr.write_char(',');
155 }
156 f(self);
157 }
158
159 fn emit_enum_struct_variant(&mut self,
160 name: &str,
161 id: uint,
162 cnt: uint,
163 f: &fn(&mut Encoder)) {
164 self.emit_enum_variant(name, id, cnt, f)
165 }
166
167 fn emit_enum_struct_variant_field(&mut self,
168 _: &str,
169 idx: uint,
170 f: &fn(&mut Encoder)) {
171 self.emit_enum_variant_arg(idx, f)
172 }
173
174 fn emit_struct(&mut self, _: &str, _: uint, f: &fn(&mut Encoder)) {
175 self.wr.write_char('{');
176 f(self);
177 self.wr.write_char('}');
178 }
179
180 fn emit_struct_field(&mut self,
181 name: &str,
182 idx: uint,
183 f: &fn(&mut Encoder)) {
184 if idx != 0 { self.wr.write_char(','); }
185 self.wr.write_str(escape_str(name));
186 self.wr.write_char(':');
187 f(self);
188 }
189
190 fn emit_tuple(&mut self, len: uint, f: &fn(&mut Encoder)) {
191 self.emit_seq(len, f)
192 }
193 fn emit_tuple_arg(&mut self, idx: uint, f: &fn(&mut Encoder)) {
194 self.emit_seq_elt(idx, f)
195 }
196
197 fn emit_tuple_struct(&mut self,
198 _name: &str,
199 len: uint,
200 f: &fn(&mut Encoder)) {
201 self.emit_seq(len, f)
202 }
203 fn emit_tuple_struct_arg(&mut self, idx: uint, f: &fn(&mut Encoder)) {
204 self.emit_seq_elt(idx, f)
205 }
206
207 fn emit_option(&mut self, f: &fn(&mut Encoder)) { f(self); }
208 fn emit_option_none(&mut self) { self.emit_nil(); }
209 fn emit_option_some(&mut self, f: &fn(&mut Encoder)) { f(self); }
210
211 fn emit_seq(&mut self, _len: uint, f: &fn(&mut Encoder)) {
212 self.wr.write_char('[');
213 f(self);
214 self.wr.write_char(']');
215 }
216
217 fn emit_seq_elt(&mut self, idx: uint, f: &fn(&mut Encoder)) {
218 if idx != 0 {
219 self.wr.write_char(',');
220 }
221 f(self)
222 }
223
224 fn emit_map(&mut self, _len: uint, f: &fn(&mut Encoder)) {
225 self.wr.write_char('{');
226 f(self);
227 self.wr.write_char('}');
228 }
229
230 fn emit_map_elt_key(&mut self, idx: uint, f: &fn(&mut Encoder)) {
231 if idx != 0 { self.wr.write_char(','); }
232 f(self)
233 }
234
235 fn emit_map_elt_val(&mut self, _idx: uint, f: &fn(&mut Encoder)) {
236 self.wr.write_char(':');
237 f(self)
238 }
239}
240
Alex Crichton39568502013-05-29 03:11:41241/// Another encoder for JSON, but prints out human-readable JSON instead of
242/// compact data
Patrick Waltonc7522412013-05-04 00:55:53243pub struct PrettyEncoder {
244 priv wr: @io::Writer,
245 priv indent: uint,
246}
247
Alex Crichton39568502013-05-29 03:11:41248/// Creates a new encoder whose output will be written to the specified writer
Patrick Waltonb1c69982013-03-12 20:00:50249pub fn PrettyEncoder(wr: @io::Writer) -> PrettyEncoder {
Patrick Waltondc5df612013-05-02 00:54:54250 PrettyEncoder {
251 wr: wr,
252 indent: 0,
253 }
Erick Tryzelaar49d00b22012-09-24 16:55:42254}
255
Patrick Waltondc5df612013-05-02 00:54:54256impl serialize::Encoder for PrettyEncoder {
257 fn emit_nil(&mut self) { self.wr.write_str("null") }
258
259 fn emit_uint(&mut self, v: uint) { self.emit_float(v as float); }
260 fn emit_u64(&mut self, v: u64) { self.emit_float(v as float); }
261 fn emit_u32(&mut self, v: u32) { self.emit_float(v as float); }
262 fn emit_u16(&mut self, v: u16) { self.emit_float(v as float); }
263 fn emit_u8(&mut self, v: u8) { self.emit_float(v as float); }
264
265 fn emit_int(&mut self, v: int) { self.emit_float(v as float); }
266 fn emit_i64(&mut self, v: i64) { self.emit_float(v as float); }
267 fn emit_i32(&mut self, v: i32) { self.emit_float(v as float); }
268 fn emit_i16(&mut self, v: i16) { self.emit_float(v as float); }
269 fn emit_i8(&mut self, v: i8) { self.emit_float(v as float); }
270
271 fn emit_bool(&mut self, v: bool) {
272 if v {
273 self.wr.write_str("true");
274 } else {
275 self.wr.write_str("false");
276 }
277 }
278
279 fn emit_f64(&mut self, v: f64) { self.emit_float(v as float); }
280 fn emit_f32(&mut self, v: f32) { self.emit_float(v as float); }
281 fn emit_float(&mut self, v: float) {
282 self.wr.write_str(float::to_str_digits(v, 6u));
283 }
284
285 fn emit_char(&mut self, v: char) { self.emit_str(str::from_char(v)) }
286 fn emit_str(&mut self, v: &str) { self.wr.write_str(escape_str(v)); }
287
288 fn emit_enum(&mut self, _name: &str, f: &fn(&mut PrettyEncoder)) {
289 f(self)
290 }
291
292 fn emit_enum_variant(&mut self,
293 name: &str,
294 _: uint,
295 cnt: uint,
296 f: &fn(&mut PrettyEncoder)) {
297 if cnt == 0 {
298 self.wr.write_str(escape_str(name));
299 } else {
300 self.wr.write_char('[');
301 self.indent += 2;
302 self.wr.write_char('\n');
303 self.wr.write_str(spaces(self.indent));
304 self.wr.write_str(escape_str(name));
305 self.wr.write_str(",\n");
306 f(self);
307 self.wr.write_char('\n');
308 self.indent -= 2;
309 self.wr.write_str(spaces(self.indent));
310 self.wr.write_char(']');
311 }
312 }
313
314 fn emit_enum_variant_arg(&mut self,
315 idx: uint,
316 f: &fn(&mut PrettyEncoder)) {
317 if idx != 0 {
318 self.wr.write_str(",\n");
319 }
320 self.wr.write_str(spaces(self.indent));
321 f(self)
322 }
323
324 fn emit_enum_struct_variant(&mut self,
325 name: &str,
326 id: uint,
327 cnt: uint,
328 f: &fn(&mut PrettyEncoder)) {
329 self.emit_enum_variant(name, id, cnt, f)
330 }
331
332 fn emit_enum_struct_variant_field(&mut self,
333 _: &str,
334 idx: uint,
335 f: &fn(&mut PrettyEncoder)) {
336 self.emit_enum_variant_arg(idx, f)
337 }
338
339
340 fn emit_struct(&mut self,
341 _: &str,
342 len: uint,
343 f: &fn(&mut PrettyEncoder)) {
344 if len == 0 {
345 self.wr.write_str("{}");
346 } else {
347 self.wr.write_char('{');
348 self.indent += 2;
349 f(self);
350 self.wr.write_char('\n');
351 self.indent -= 2;
352 self.wr.write_str(spaces(self.indent));
353 self.wr.write_char('}');
354 }
355 }
356
357 fn emit_struct_field(&mut self,
358 name: &str,
359 idx: uint,
360 f: &fn(&mut PrettyEncoder)) {
361 if idx == 0 {
362 self.wr.write_char('\n');
363 } else {
364 self.wr.write_str(",\n");
365 }
366 self.wr.write_str(spaces(self.indent));
367 self.wr.write_str(escape_str(name));
368 self.wr.write_str(": ");
369 f(self);
370 }
371
372 fn emit_tuple(&mut self, len: uint, f: &fn(&mut PrettyEncoder)) {
373 self.emit_seq(len, f)
374 }
375 fn emit_tuple_arg(&mut self, idx: uint, f: &fn(&mut PrettyEncoder)) {
376 self.emit_seq_elt(idx, f)
377 }
378
379 fn emit_tuple_struct(&mut self,
380 _: &str,
381 len: uint,
382 f: &fn(&mut PrettyEncoder)) {
383 self.emit_seq(len, f)
384 }
385 fn emit_tuple_struct_arg(&mut self,
386 idx: uint,
387 f: &fn(&mut PrettyEncoder)) {
388 self.emit_seq_elt(idx, f)
389 }
390
391 fn emit_option(&mut self, f: &fn(&mut PrettyEncoder)) { f(self); }
392 fn emit_option_none(&mut self) { self.emit_nil(); }
393 fn emit_option_some(&mut self, f: &fn(&mut PrettyEncoder)) { f(self); }
394
395 fn emit_seq(&mut self, len: uint, f: &fn(&mut PrettyEncoder)) {
396 if len == 0 {
397 self.wr.write_str("[]");
398 } else {
399 self.wr.write_char('[');
400 self.indent += 2;
401 f(self);
402 self.wr.write_char('\n');
403 self.indent -= 2;
404 self.wr.write_str(spaces(self.indent));
405 self.wr.write_char(']');
406 }
407 }
408
409 fn emit_seq_elt(&mut self, idx: uint, f: &fn(&mut PrettyEncoder)) {
410 if idx == 0 {
411 self.wr.write_char('\n');
412 } else {
413 self.wr.write_str(",\n");
414 }
415 self.wr.write_str(spaces(self.indent));
416 f(self)
417 }
418
419 fn emit_map(&mut self, len: uint, f: &fn(&mut PrettyEncoder)) {
420 if len == 0 {
421 self.wr.write_str("{}");
422 } else {
423 self.wr.write_char('{');
424 self.indent += 2;
425 f(self);
426 self.wr.write_char('\n');
427 self.indent -= 2;
428 self.wr.write_str(spaces(self.indent));
429 self.wr.write_char('}');
430 }
431 }
432
433 fn emit_map_elt_key(&mut self, idx: uint, f: &fn(&mut PrettyEncoder)) {
434 if idx == 0 {
435 self.wr.write_char('\n');
436 } else {
437 self.wr.write_str(",\n");
438 }
439 self.wr.write_str(spaces(self.indent));
440 f(self);
441 }
442
443 fn emit_map_elt_val(&mut self, _idx: uint, f: &fn(&mut PrettyEncoder)) {
444 self.wr.write_str(": ");
445 f(self);
446 }
447}
448
Patrick Waltondc5df612013-05-02 00:54:54449impl<E: serialize::Encoder> serialize::Encodable<E> for Json {
450 fn encode(&self, e: &mut E) {
451 match *self {
452 Number(v) => v.encode(e),
453 String(ref v) => v.encode(e),
454 Boolean(v) => v.encode(e),
455 List(ref v) => v.encode(e),
456 Object(ref v) => v.encode(e),
457 Null => e.emit_nil(),
458 }
459 }
460}
461
Erick Tryzelaar8650c6f2012-12-18 03:31:04462/// Encodes a json value into a io::writer
Patrick Waltondc5df612013-05-02 00:54:54463pub fn to_writer(wr: @io::Writer, json: &Json) {
464 let mut encoder = Encoder(wr);
465 json.encode(&mut encoder)
Erick Tryzelaar49d00b22012-09-24 16:55:42466}
467
Erick Tryzelaar8650c6f2012-12-18 03:31:04468/// Encodes a json value into a string
Patrick Waltonc1084092013-03-22 04:34:30469pub fn to_str(json: &Json) -> ~str {
Alex Crichton255193c2013-04-08 20:50:34470 io::with_str_writer(|wr| to_writer(wr, json))
Elly Jonesbd726262011-11-07 19:01:28471}
472
Erick Tryzelaar8650c6f2012-12-18 03:31:04473/// Encodes a json value into a io::writer
Patrick Waltondc5df612013-05-02 00:54:54474pub fn to_pretty_writer(wr: @io::Writer, json: &Json) {
475 let mut encoder = PrettyEncoder(wr);
476 json.encode(&mut encoder)
Kevin Cantud47cb102012-08-30 23:39:56477}
478
Erick Tryzelaar8650c6f2012-12-18 03:31:04479/// Encodes a json value into a string
Erick Tryzelaar49d00b22012-09-24 16:55:42480pub fn to_pretty_str(json: &Json) -> ~str {
481 io::with_str_writer(|wr| to_pretty_writer(wr, json))
Patrick Waltondb020ab2012-07-11 22:00:40482}
483
Alex Crichton39568502013-05-29 03:11:41484#[allow(missing_doc)]
Erick Tryzelaar49d00b22012-09-24 16:55:42485pub struct Parser {
Patrick Waltonb1c69982013-03-12 20:00:50486 priv rdr: @io::Reader,
Alex Crichton3136fba2013-03-24 16:41:19487 priv ch: char,
488 priv line: uint,
489 priv col: uint,
Erick Tryzelaar49d00b22012-09-24 16:55:42490}
491
Erick Tryzelaar8650c6f2012-12-18 03:31:04492/// Decode a json value from an io::reader
Patrick Waltonb1c69982013-03-12 20:00:50493pub fn Parser(rdr: @io::Reader) -> Parser {
Erick Tryzelaar49d00b22012-09-24 16:55:42494 Parser {
495 rdr: rdr,
496 ch: rdr.read_char(),
Tim Chevalier90d06b82012-09-19 05:35:42497 line: 1,
498 col: 1,
Erick Tryzelaar49d00b22012-09-24 16:55:42499 }
500}
501
Patrick Walton5fb25462013-05-31 22:17:22502impl Parser {
503 pub fn parse(&mut self) -> Result<Json, Error> {
Luqman Aden4cf51c22013-02-15 07:30:30504 match self.parse_value() {
505 Ok(value) => {
Erick Tryzelaar49d00b22012-09-24 16:55:42506 // Skip trailing whitespaces.
507 self.parse_whitespace();
508 // Make sure there is no trailing characters.
509 if self.eof() {
Luqman Aden4cf51c22013-02-15 07:30:30510 Ok(value)
Erick Tryzelaar49d00b22012-09-24 16:55:42511 } else {
512 self.error(~"trailing characters")
513 }
514 }
Luqman Aden4cf51c22013-02-15 07:30:30515 Err(e) => Err(e)
Erick Tryzelaar49d00b22012-09-24 16:55:42516 }
517 }
518}
519
Patrick Walton5fb25462013-05-31 22:17:22520impl Parser {
Ben Striegel0fed29c2013-03-08 02:11:09521 fn eof(&self) -> bool { self.ch == -1 as char }
Elly Jonesbd726262011-11-07 19:01:28522
Alex Crichton3136fba2013-03-24 16:41:19523 fn bump(&mut self) {
Erick Tryzelaar012dec52012-02-26 00:39:32524 self.ch = self.rdr.read_char();
525
526 if self.ch == '\n' {
527 self.line += 1u;
528 self.col = 1u;
529 } else {
530 self.col += 1u;
531 }
Elly Jonesbd726262011-11-07 19:01:28532 }
533
Alex Crichton3136fba2013-03-24 16:41:19534 fn next_char(&mut self) -> char {
Erick Tryzelaar012dec52012-02-26 00:39:32535 self.bump();
536 self.ch
Elly Jonesbd726262011-11-07 19:01:28537 }
538
Ben Striegel0fed29c2013-03-08 02:11:09539 fn error<T>(&self, msg: ~str) -> Result<T, Error> {
Erick Tryzelaar49d00b22012-09-24 16:55:42540 Err(Error { line: self.line, col: self.col, msg: @msg })
Elly Jonesbd726262011-11-07 19:01:28541 }
Elly Jonesbd726262011-11-07 19:01:28542
Alex Crichton3136fba2013-03-24 16:41:19543 fn parse_value(&mut self) -> Result<Json, Error> {
Erick Tryzelaar012dec52012-02-26 00:39:32544 self.parse_whitespace();
Elly Jonesbd726262011-11-07 19:01:28545
Brian Andersonb3559362012-08-02 00:30:05546 if self.eof() { return self.error(~"EOF while parsing value"); }
Erick Tryzelaar012dec52012-02-26 00:39:32547
Brian Andersonecaf9e32012-08-06 19:34:08548 match self.ch {
Alex Crichton82fa0012013-05-19 05:07:44549 'n' => self.parse_ident("ull", Null),
550 't' => self.parse_ident("rue", Boolean(true)),
551 'f' => self.parse_ident("alse", Boolean(false)),
Brian Anderson80c4f742012-09-02 01:38:05552 '0' .. '9' | '-' => self.parse_number(),
Erick Tryzelaar49d00b22012-09-24 16:55:42553 '"' =>
Luqman Aden4cf51c22013-02-15 07:30:30554 match self.parse_str() {
555 Ok(s) => Ok(String(s)),
556 Err(e) => Err(e),
Erick Tryzelaar49d00b22012-09-24 16:55:42557 },
Brian Anderson025d8662012-08-04 02:59:04558 '[' => self.parse_list(),
559 '{' => self.parse_object(),
560 _ => self.error(~"invalid syntax")
Erick Tryzelaar012dec52012-02-26 00:39:32561 }
562 }
563
Alex Crichton3136fba2013-03-24 16:41:19564 fn parse_whitespace(&mut self) {
Erick Tryzelaar012dec52012-02-26 00:39:32565 while char::is_whitespace(self.ch) { self.bump(); }
566 }
567
Alex Crichton3136fba2013-03-24 16:41:19568 fn parse_ident(&mut self, ident: &str, value: Json) -> Result<Json, Error> {
Huon Wilsonb29cd222013-06-09 14:34:23569 if ident.iter().all(|c| c == self.next_char()) {
Erick Tryzelaar012dec52012-02-26 00:39:32570 self.bump();
Luqman Aden4cf51c22013-02-15 07:30:30571 Ok(value)
Erick Tryzelaar012dec52012-02-26 00:39:32572 } else {
Michael Sullivan92743dc2012-07-14 05:57:48573 self.error(~"invalid syntax")
Erick Tryzelaar012dec52012-02-26 00:39:32574 }
575 }
576
Alex Crichton3136fba2013-03-24 16:41:19577 fn parse_number(&mut self) -> Result<Json, Error> {
Niko Matsakis6b358752012-03-14 18:03:56578 let mut neg = 1f;
Erick Tryzelaar012dec52012-02-26 00:39:32579
580 if self.ch == '-' {
581 self.bump();
Marijn Haverbeke4f826d82011-12-16 09:11:00582 neg = -1f;
Elly Jonesbd726262011-11-07 19:01:28583 }
Elly Jonesbd726262011-11-07 19:01:28584
Brian Andersonecaf9e32012-08-06 19:34:08585 let mut res = match self.parse_integer() {
Brian Anderson0c6e4702012-08-26 23:54:31586 Ok(res) => res,
587 Err(e) => return Err(e)
Erick Tryzelaar012dec52012-02-26 00:39:32588 };
589
590 if self.ch == '.' {
Brian Andersonecaf9e32012-08-06 19:34:08591 match self.parse_decimal(res) {
Brian Anderson0c6e4702012-08-26 23:54:31592 Ok(r) => res = r,
593 Err(e) => return Err(e)
Elly Jonesbd726262011-11-07 19:01:28594 }
Elly Jonesbd726262011-11-07 19:01:28595 }
Erick Tryzelaar012dec52012-02-26 00:39:32596
597 if self.ch == 'e' || self.ch == 'E' {
Brian Andersonecaf9e32012-08-06 19:34:08598 match self.parse_exponent(res) {
Brian Anderson0c6e4702012-08-26 23:54:31599 Ok(r) => res = r,
600 Err(e) => return Err(e)
Erick Tryzelaar012dec52012-02-26 00:39:32601 }
602 }
603
Erick Tryzelaar49d00b22012-09-24 16:55:42604 Ok(Number(neg * res))
Elly Jonesbd726262011-11-07 19:01:28605 }
606
Alex Crichton3136fba2013-03-24 16:41:19607 fn parse_integer(&mut self) -> Result<float, Error> {
Niko Matsakis6b358752012-03-14 18:03:56608 let mut res = 0f;
Erick Tryzelaar012dec52012-02-26 00:39:32609
Brian Andersonecaf9e32012-08-06 19:34:08610 match self.ch {
Brian Anderson025d8662012-08-04 02:59:04611 '0' => {
Erick Tryzelaar012dec52012-02-26 00:39:32612 self.bump();
613
614 // There can be only one leading '0'.
Brian Andersonecaf9e32012-08-06 19:34:08615 match self.ch {
Brian Anderson80c4f742012-09-02 01:38:05616 '0' .. '9' => return self.error(~"invalid number"),
Brian Anderson025d8662012-08-04 02:59:04617 _ => ()
Erick Tryzelaar012dec52012-02-26 00:39:32618 }
619 }
Brian Anderson80c4f742012-09-02 01:38:05620 '1' .. '9' => {
Erick Tryzelaar012dec52012-02-26 00:39:32621 while !self.eof() {
Brian Andersonecaf9e32012-08-06 19:34:08622 match self.ch {
Brian Anderson80c4f742012-09-02 01:38:05623 '0' .. '9' => {
Erick Tryzelaar012dec52012-02-26 00:39:32624 res *= 10f;
625 res += ((self.ch as int) - ('0' as int)) as float;
626
627 self.bump();
628 }
Brian Anderson025d8662012-08-04 02:59:04629 _ => break
Erick Tryzelaar012dec52012-02-26 00:39:32630 }
631 }
632 }
Brian Anderson025d8662012-08-04 02:59:04633 _ => return self.error(~"invalid number")
Erick Tryzelaar012dec52012-02-26 00:39:32634 }
635
Brian Anderson0c6e4702012-08-26 23:54:31636 Ok(res)
Elly Jonesbd726262011-11-07 19:01:28637 }
638
Alex Crichton3136fba2013-03-24 16:41:19639 fn parse_decimal(&mut self, res: float) -> Result<float, Error> {
Erick Tryzelaar012dec52012-02-26 00:39:32640 self.bump();
641
642 // Make sure a digit follows the decimal place.
Brian Andersonecaf9e32012-08-06 19:34:08643 match self.ch {
Brian Anderson80c4f742012-09-02 01:38:05644 '0' .. '9' => (),
Brian Anderson025d8662012-08-04 02:59:04645 _ => return self.error(~"invalid number")
Erick Tryzelaar012dec52012-02-26 00:39:32646 }
647
Niko Matsakis6b358752012-03-14 18:03:56648 let mut res = res;
649 let mut dec = 1f;
Erick Tryzelaar012dec52012-02-26 00:39:32650 while !self.eof() {
Brian Andersonecaf9e32012-08-06 19:34:08651 match self.ch {
Brian Anderson80c4f742012-09-02 01:38:05652 '0' .. '9' => {
Marijn Haverbeke4f826d82011-12-16 09:11:00653 dec /= 10f;
Erick Tryzelaar012dec52012-02-26 00:39:32654 res += (((self.ch as int) - ('0' as int)) as float) * dec;
655
656 self.bump();
657 }
Brian Anderson025d8662012-08-04 02:59:04658 _ => break
Elly Jonesbd726262011-11-07 19:01:28659 }
Elly Jonesbd726262011-11-07 19:01:28660 }
Elly Jonesbd726262011-11-07 19:01:28661
Brian Anderson0c6e4702012-08-26 23:54:31662 Ok(res)
Erick Tryzelaar012dec52012-02-26 00:39:32663 }
664
Alex Crichton3136fba2013-03-24 16:41:19665 fn parse_exponent(&mut self, mut res: float) -> Result<float, Error> {
Erick Tryzelaar012dec52012-02-26 00:39:32666 self.bump();
667
Niko Matsakis6b358752012-03-14 18:03:56668 let mut exp = 0u;
669 let mut neg_exp = false;
Erick Tryzelaar012dec52012-02-26 00:39:32670
Brian Andersonecaf9e32012-08-06 19:34:08671 match self.ch {
Brian Anderson025d8662012-08-04 02:59:04672 '+' => self.bump(),
673 '-' => { self.bump(); neg_exp = true; }
674 _ => ()
Erick Tryzelaar012dec52012-02-26 00:39:32675 }
676
677 // Make sure a digit follows the exponent place.
Brian Andersonecaf9e32012-08-06 19:34:08678 match self.ch {
Brian Anderson80c4f742012-09-02 01:38:05679 '0' .. '9' => (),
Brian Anderson025d8662012-08-04 02:59:04680 _ => return self.error(~"invalid number")
Erick Tryzelaar012dec52012-02-26 00:39:32681 }
682
683 while !self.eof() {
Brian Andersonecaf9e32012-08-06 19:34:08684 match self.ch {
Brian Anderson80c4f742012-09-02 01:38:05685 '0' .. '9' => {
Erick Tryzelaar012dec52012-02-26 00:39:32686 exp *= 10u;
687 exp += (self.ch as uint) - ('0' as uint);
688
689 self.bump();
690 }
Brian Anderson025d8662012-08-04 02:59:04691 _ => break
Erick Tryzelaar012dec52012-02-26 00:39:32692 }
693 }
694
695 let exp = float::pow_with_uint(10u, exp);
696 if neg_exp {
697 res /= exp;
698 } else {
699 res *= exp;
700 }
701
Brian Anderson0c6e4702012-08-26 23:54:31702 Ok(res)
Erick Tryzelaar012dec52012-02-26 00:39:32703 }
704
Alex Crichton3136fba2013-03-24 16:41:19705 fn parse_str(&mut self) -> Result<~str, Error> {
Niko Matsakis6b358752012-03-14 18:03:56706 let mut escape = false;
Michael Sullivan92743dc2012-07-14 05:57:48707 let mut res = ~"";
Erick Tryzelaar012dec52012-02-26 00:39:32708
709 while !self.eof() {
710 self.bump();
711
712 if (escape) {
Brian Andersonecaf9e32012-08-06 19:34:08713 match self.ch {
Huon Wilson15538742013-06-10 07:42:24714 '"' => res.push_char('"'),
715 '\\' => res.push_char('\\'),
716 '/' => res.push_char('/'),
717 'b' => res.push_char('\x08'),
718 'f' => res.push_char('\x0c'),
719 'n' => res.push_char('\n'),
720 'r' => res.push_char('\r'),
721 't' => res.push_char('\t'),
Brian Anderson025d8662012-08-04 02:59:04722 'u' => {
Erick Tryzelaar012dec52012-02-26 00:39:32723 // Parse \u1234.
Niko Matsakis6b358752012-03-14 18:03:56724 let mut i = 0u;
725 let mut n = 0u;
Erick Tryzelaar012dec52012-02-26 00:39:32726 while i < 4u {
Brian Andersonecaf9e32012-08-06 19:34:08727 match self.next_char() {
Brian Anderson80c4f742012-09-02 01:38:05728 '0' .. '9' => {
Kevin Cantu4fb675b2012-08-31 03:12:10729 n = n * 16u + (self.ch as uint)
730 - ('0' as uint);
731 },
732 'a' | 'A' => n = n * 16u + 10u,
733 'b' | 'B' => n = n * 16u + 11u,
734 'c' | 'C' => n = n * 16u + 12u,
735 'd' | 'D' => n = n * 16u + 13u,
736 'e' | 'E' => n = n * 16u + 14u,
737 'f' | 'F' => n = n * 16u + 15u,
738 _ => return self.error(
739 ~"invalid \\u escape (unrecognized hex)")
Erick Tryzelaar012dec52012-02-26 00:39:32740 }
Niko Matsakis6b358752012-03-14 18:03:56741 i += 1u;
Erick Tryzelaar012dec52012-02-26 00:39:32742 }
743
744 // Error out if we didn't parse 4 digits.
745 if i != 4u {
Kevin Cantu4fb675b2012-08-31 03:12:10746 return self.error(
747 ~"invalid \\u escape (not four digits)");
Erick Tryzelaar012dec52012-02-26 00:39:32748 }
749
Huon Wilson15538742013-06-10 07:42:24750 res.push_char(n as char);
Erick Tryzelaar012dec52012-02-26 00:39:32751 }
Brian Anderson025d8662012-08-04 02:59:04752 _ => return self.error(~"invalid escape")
Erick Tryzelaar012dec52012-02-26 00:39:32753 }
754 escape = false;
755 } else if self.ch == '\\' {
756 escape = true;
757 } else {
758 if self.ch == '"' {
759 self.bump();
Erick Tryzelaar49d00b22012-09-24 16:55:42760 return Ok(res);
Erick Tryzelaar012dec52012-02-26 00:39:32761 }
Huon Wilson15538742013-06-10 07:42:24762 res.push_char(self.ch);
Erick Tryzelaar012dec52012-02-26 00:39:32763 }
764 }
765
Michael Sullivan92743dc2012-07-14 05:57:48766 self.error(~"EOF while parsing string")
Erick Tryzelaar012dec52012-02-26 00:39:32767 }
768
Alex Crichton3136fba2013-03-24 16:41:19769 fn parse_list(&mut self) -> Result<Json, Error> {
Erick Tryzelaar012dec52012-02-26 00:39:32770 self.bump();
771 self.parse_whitespace();
772
Michael Sullivan98e161f2012-06-29 23:26:56773 let mut values = ~[];
Erick Tryzelaar012dec52012-02-26 00:39:32774
775 if self.ch == ']' {
776 self.bump();
Luqman Aden4cf51c22013-02-15 07:30:30777 return Ok(List(values));
Erick Tryzelaar012dec52012-02-26 00:39:32778 }
779
Tim Chevalier35400e12012-03-11 04:34:17780 loop {
Luqman Aden4cf51c22013-02-15 07:30:30781 match self.parse_value() {
782 Ok(v) => values.push(v),
783 Err(e) => return Err(e)
Erick Tryzelaar012dec52012-02-26 00:39:32784 }
785
786 self.parse_whitespace();
Tim Chevalier35400e12012-03-11 04:34:17787 if self.eof() {
Brian Andersonb3559362012-08-02 00:30:05788 return self.error(~"EOF while parsing list");
Tim Chevalier35400e12012-03-11 04:34:17789 }
Erick Tryzelaar012dec52012-02-26 00:39:32790
Brian Andersonecaf9e32012-08-06 19:34:08791 match self.ch {
Brian Anderson025d8662012-08-04 02:59:04792 ',' => self.bump(),
Luqman Aden4cf51c22013-02-15 07:30:30793 ']' => { self.bump(); return Ok(List(values)); }
Brian Anderson025d8662012-08-04 02:59:04794 _ => return self.error(~"expected `,` or `]`")
Erick Tryzelaar012dec52012-02-26 00:39:32795 }
Tim Chevalier35400e12012-03-11 04:34:17796 };
Erick Tryzelaar012dec52012-02-26 00:39:32797 }
798
Alex Crichton3136fba2013-03-24 16:41:19799 fn parse_object(&mut self) -> Result<Json, Error> {
Erick Tryzelaar012dec52012-02-26 00:39:32800 self.bump();
801 self.parse_whitespace();
802
Daniel Micaycc148b52013-04-03 13:28:36803 let mut values = ~HashMap::new();
Erick Tryzelaar012dec52012-02-26 00:39:32804
805 if self.ch == '}' {
806 self.bump();
Luqman Aden4cf51c22013-02-15 07:30:30807 return Ok(Object(values));
Erick Tryzelaar012dec52012-02-26 00:39:32808 }
809
810 while !self.eof() {
811 self.parse_whitespace();
812
813 if self.ch != '"' {
Brian Andersonb3559362012-08-02 00:30:05814 return self.error(~"key must be a string");
Erick Tryzelaar012dec52012-02-26 00:39:32815 }
816
Luqman Aden4cf51c22013-02-15 07:30:30817 let key = match self.parse_str() {
818 Ok(key) => key,
819 Err(e) => return Err(e)
Erick Tryzelaar012dec52012-02-26 00:39:32820 };
821
822 self.parse_whitespace();
823
824 if self.ch != ':' {
825 if self.eof() { break; }
Brian Andersonb3559362012-08-02 00:30:05826 return self.error(~"expected `:`");
Erick Tryzelaar012dec52012-02-26 00:39:32827 }
828 self.bump();
829
Luqman Aden4cf51c22013-02-15 07:30:30830 match self.parse_value() {
831 Ok(value) => { values.insert(key, value); }
832 Err(e) => return Err(e)
Erick Tryzelaar012dec52012-02-26 00:39:32833 }
834 self.parse_whitespace();
835
Brian Andersonecaf9e32012-08-06 19:34:08836 match self.ch {
Brian Anderson025d8662012-08-04 02:59:04837 ',' => self.bump(),
Luqman Aden4cf51c22013-02-15 07:30:30838 '}' => { self.bump(); return Ok(Object(values)); }
Brian Anderson025d8662012-08-04 02:59:04839 _ => {
Erick Tryzelaar012dec52012-02-26 00:39:32840 if self.eof() { break; }
Brian Andersonb3559362012-08-02 00:30:05841 return self.error(~"expected `,` or `}`");
Erick Tryzelaar012dec52012-02-26 00:39:32842 }
843 }
844 }
845
Brian Andersonb3559362012-08-02 00:30:05846 return self.error(~"EOF while parsing object");
Elly Jonesbd726262011-11-07 19:01:28847 }
848}
849
Patrick Waltonb1c69982013-03-12 20:00:50850/// Decodes a json value from an @io::Reader
851pub fn from_reader(rdr: @io::Reader) -> Result<Json, Error> {
Alex Crichton3136fba2013-03-24 16:41:19852 let mut parser = Parser(rdr);
853 parser.parse()
Elly Jonesbd726262011-11-07 19:01:28854}
855
Erick Tryzelaar8650c6f2012-12-18 03:31:04856/// Decodes a json value from a string
Erick Tryzelaar49d00b22012-09-24 16:55:42857pub fn from_str(s: &str) -> Result<Json, Error> {
858 do io::with_str_reader(s) |rdr| {
859 from_reader(rdr)
860 }
Erick Tryzelaar012dec52012-02-26 00:39:32861}
862
Alex Crichton39568502013-05-29 03:11:41863/// A structure to decode JSON to values in rust.
Patrick Waltonc7522412013-05-04 00:55:53864pub struct Decoder {
865 priv stack: ~[Json],
866}
867
Alex Crichton39568502013-05-29 03:11:41868/// Creates a new decoder instance for decoding the specified JSON value.
Erick Tryzelaar8650c6f2012-12-18 03:31:04869pub fn Decoder(json: Json) -> Decoder {
Patrick Waltondc5df612013-05-02 00:54:54870 Decoder {
871 stack: ~[json]
872 }
Elly Jonesbd726262011-11-07 19:01:28873}
Brian Anderson6e27b272012-01-18 03:05:07874
Patrick Waltondc5df612013-05-02 00:54:54875impl serialize::Decoder for Decoder {
876 fn read_nil(&mut self) -> () {
877 debug!("read_nil");
878 match self.stack.pop() {
879 Null => (),
Björn Steinbrinkbdc182c2013-05-05 22:18:51880 value => fail!("not a null: %?", value)
Patrick Waltondc5df612013-05-02 00:54:54881 }
882 }
883
884 fn read_u64(&mut self) -> u64 { self.read_float() as u64 }
885 fn read_u32(&mut self) -> u32 { self.read_float() as u32 }
886 fn read_u16(&mut self) -> u16 { self.read_float() as u16 }
887 fn read_u8 (&mut self) -> u8 { self.read_float() as u8 }
888 fn read_uint(&mut self) -> uint { self.read_float() as uint }
889
890 fn read_i64(&mut self) -> i64 { self.read_float() as i64 }
891 fn read_i32(&mut self) -> i32 { self.read_float() as i32 }
892 fn read_i16(&mut self) -> i16 { self.read_float() as i16 }
893 fn read_i8 (&mut self) -> i8 { self.read_float() as i8 }
894 fn read_int(&mut self) -> int { self.read_float() as int }
895
896 fn read_bool(&mut self) -> bool {
897 debug!("read_bool");
898 match self.stack.pop() {
899 Boolean(b) => b,
Björn Steinbrinkbdc182c2013-05-05 22:18:51900 value => fail!("not a boolean: %?", value)
Patrick Waltondc5df612013-05-02 00:54:54901 }
902 }
903
904 fn read_f64(&mut self) -> f64 { self.read_float() as f64 }
905 fn read_f32(&mut self) -> f32 { self.read_float() as f32 }
906 fn read_float(&mut self) -> float {
907 debug!("read_float");
908 match self.stack.pop() {
909 Number(f) => f,
Björn Steinbrinkbdc182c2013-05-05 22:18:51910 value => fail!("not a number: %?", value)
Patrick Waltondc5df612013-05-02 00:54:54911 }
912 }
913
914 fn read_char(&mut self) -> char {
915 let mut v = ~[];
Huon Wilson4b806b42013-06-08 12:04:46916 let s = self.read_str();
917 for s.iter().advance |c| { v.push(c) }
Björn Steinbrinkbdc182c2013-05-05 22:18:51918 if v.len() != 1 { fail!("string must have one character") }
Patrick Waltondc5df612013-05-02 00:54:54919 v[0]
920 }
921
922 fn read_str(&mut self) -> ~str {
923 debug!("read_str");
924 match self.stack.pop() {
925 String(s) => s,
Björn Steinbrinkbdc182c2013-05-05 22:18:51926 json => fail!("not a string: %?", json)
Patrick Waltondc5df612013-05-02 00:54:54927 }
928 }
929
930 fn read_enum<T>(&mut self, name: &str, f: &fn(&mut Decoder) -> T) -> T {
931 debug!("read_enum(%s)", name);
932 f(self)
933 }
934
935 fn read_enum_variant<T>(&mut self,
936 names: &[&str],
937 f: &fn(&mut Decoder, uint) -> T)
938 -> T {
939 debug!("read_enum_variant(names=%?)", names);
940 let name = match self.stack.pop() {
941 String(s) => s,
942 List(list) => {
943 do vec::consume_reverse(list) |_i, v| {
944 self.stack.push(v);
945 }
946 match self.stack.pop() {
947 String(s) => s,
Björn Steinbrinkbdc182c2013-05-05 22:18:51948 value => fail!("invalid variant name: %?", value),
Patrick Waltondc5df612013-05-02 00:54:54949 }
950 }
Björn Steinbrinkbdc182c2013-05-05 22:18:51951 ref json => fail!("invalid variant: %?", *json),
Patrick Waltondc5df612013-05-02 00:54:54952 };
Daniel Micay883c9662013-06-19 02:59:48953 let idx = match names.iter().position_(|n| str::eq_slice(*n, name)) {
Patrick Waltondc5df612013-05-02 00:54:54954 Some(idx) => idx,
Björn Steinbrinkbdc182c2013-05-05 22:18:51955 None => fail!("Unknown variant name: %?", name),
Patrick Waltondc5df612013-05-02 00:54:54956 };
957 f(self, idx)
958 }
959
960 fn read_enum_variant_arg<T>(&mut self,
961 idx: uint,
962 f: &fn(&mut Decoder) -> T)
963 -> T {
964 debug!("read_enum_variant_arg(idx=%u)", idx);
965 f(self)
966 }
967
968 fn read_enum_struct_variant<T>(&mut self,
969 names: &[&str],
970 f: &fn(&mut Decoder, uint) -> T)
971 -> T {
972 debug!("read_enum_struct_variant(names=%?)", names);
973 self.read_enum_variant(names, f)
974 }
975
976
977 fn read_enum_struct_variant_field<T>(&mut self,
978 name: &str,
979 idx: uint,
980 f: &fn(&mut Decoder) -> T)
981 -> T {
982 debug!("read_enum_struct_variant_field(name=%?, idx=%u)", name, idx);
983 self.read_enum_variant_arg(idx, f)
984 }
985
986 fn read_struct<T>(&mut self,
987 name: &str,
988 len: uint,
989 f: &fn(&mut Decoder) -> T)
990 -> T {
991 debug!("read_struct(name=%s, len=%u)", name, len);
992 let value = f(self);
993 self.stack.pop();
994 value
995 }
996
Patrick Waltondc5df612013-05-02 00:54:54997 fn read_struct_field<T>(&mut self,
998 name: &str,
999 idx: uint,
1000 f: &fn(&mut Decoder) -> T)
1001 -> T {
1002 debug!("read_struct_field(name=%?, idx=%u)", name, idx);
1003 match self.stack.pop() {
1004 Object(obj) => {
1005 let mut obj = obj;
1006 let value = match obj.pop(&name.to_owned()) {
Björn Steinbrinkbdc182c2013-05-05 22:18:511007 None => fail!("no such field: %s", name),
Patrick Waltondc5df612013-05-02 00:54:541008 Some(json) => {
1009 self.stack.push(json);
1010 f(self)
1011 }
1012 };
1013 self.stack.push(Object(obj));
1014 value
1015 }
Björn Steinbrinkbdc182c2013-05-05 22:18:511016 value => fail!("not an object: %?", value)
Patrick Waltondc5df612013-05-02 00:54:541017 }
1018 }
1019
1020 fn read_tuple<T>(&mut self, f: &fn(&mut Decoder, uint) -> T) -> T {
1021 debug!("read_tuple()");
1022 self.read_seq(f)
1023 }
1024
1025 fn read_tuple_arg<T>(&mut self,
1026 idx: uint,
1027 f: &fn(&mut Decoder) -> T)
1028 -> T {
1029 debug!("read_tuple_arg(idx=%u)", idx);
1030 self.read_seq_elt(idx, f)
1031 }
1032
1033 fn read_tuple_struct<T>(&mut self,
1034 name: &str,
1035 f: &fn(&mut Decoder, uint) -> T)
1036 -> T {
1037 debug!("read_tuple_struct(name=%?)", name);
1038 self.read_tuple(f)
1039 }
1040
1041 fn read_tuple_struct_arg<T>(&mut self,
1042 idx: uint,
1043 f: &fn(&mut Decoder) -> T)
1044 -> T {
1045 debug!("read_tuple_struct_arg(idx=%u)", idx);
1046 self.read_tuple_arg(idx, f)
1047 }
1048
1049 fn read_option<T>(&mut self, f: &fn(&mut Decoder, bool) -> T) -> T {
1050 match self.stack.pop() {
1051 Null => f(self, false),
1052 value => { self.stack.push(value); f(self, true) }
1053 }
1054 }
1055
1056 fn read_seq<T>(&mut self, f: &fn(&mut Decoder, uint) -> T) -> T {
1057 debug!("read_seq()");
1058 let len = match self.stack.pop() {
1059 List(list) => {
1060 let len = list.len();
1061 do vec::consume_reverse(list) |_i, v| {
1062 self.stack.push(v);
1063 }
1064 len
1065 }
Björn Steinbrinkbdc182c2013-05-05 22:18:511066 _ => fail!("not a list"),
Patrick Waltondc5df612013-05-02 00:54:541067 };
1068 f(self, len)
1069 }
1070
1071 fn read_seq_elt<T>(&mut self, idx: uint, f: &fn(&mut Decoder) -> T) -> T {
1072 debug!("read_seq_elt(idx=%u)", idx);
1073 f(self)
1074 }
1075
1076 fn read_map<T>(&mut self, f: &fn(&mut Decoder, uint) -> T) -> T {
1077 debug!("read_map()");
1078 let len = match self.stack.pop() {
1079 Object(obj) => {
1080 let mut obj = obj;
1081 let len = obj.len();
1082 do obj.consume |key, value| {
1083 self.stack.push(value);
1084 self.stack.push(String(key));
1085 }
1086 len
1087 }
Björn Steinbrinkbdc182c2013-05-05 22:18:511088 json => fail!("not an object: %?", json),
Patrick Waltondc5df612013-05-02 00:54:541089 };
1090 f(self, len)
1091 }
1092
1093 fn read_map_elt_key<T>(&mut self,
1094 idx: uint,
1095 f: &fn(&mut Decoder) -> T)
1096 -> T {
1097 debug!("read_map_elt_key(idx=%u)", idx);
1098 f(self)
1099 }
1100
1101 fn read_map_elt_val<T>(&mut self, idx: uint, f: &fn(&mut Decoder) -> T)
1102 -> T {
1103 debug!("read_map_elt_val(idx=%u)", idx);
1104 f(self)
1105 }
1106}
1107
Patrick Walton91436882013-02-14 19:47:001108impl Eq for Json {
Patrick Waltonc1084092013-03-22 04:34:301109 fn eq(&self, other: &Json) -> bool {
Tim Chevalier3e7da962013-01-11 04:09:161110 match (self) {
1111 &Number(f0) =>
1112 match other { &Number(f1) => f0 == f1, _ => false },
1113 &String(ref s0) =>
1114 match other { &String(ref s1) => s0 == s1, _ => false },
1115 &Boolean(b0) =>
1116 match other { &Boolean(b1) => b0 == b1, _ => false },
1117 &Null =>
1118 match other { &Null => true, _ => false },
1119 &List(ref v0) =>
1120 match other { &List(ref v1) => v0 == v1, _ => false },
1121 &Object(ref d0) => {
1122 match other {
1123 &Object(ref d1) => {
Patrick Walton318e5342012-11-15 02:59:301124 if d0.len() == d1.len() {
1125 let mut equal = true;
Daniel Micaye67c48a2013-06-24 22:34:201126 for d0.iter().advance |(k, v0)| {
Daniel Micayee0a8c62013-01-23 16:47:431127 match d1.find(k) {
Patrick Walton318e5342012-11-15 02:59:301128 Some(v1) if v0 == v1 => { },
1129 _ => { equal = false; break }
1130 }
1131 };
1132 equal
1133 } else {
1134 false
1135 }
1136 }
1137 _ => false
1138 }
1139 }
1140 }
1141 }
Patrick Waltonc1084092013-03-22 04:34:301142 fn ne(&self, other: &Json) -> bool { !self.eq(other) }
Erick Tryzelaar49d00b22012-09-24 16:55:421143}
1144
Patrick Walton22b87572012-09-08 01:53:141145/// Test if two json values are less than one another
Patrick Walton91436882013-02-14 19:47:001146impl Ord for Json {
Patrick Waltonc1084092013-03-22 04:34:301147 fn lt(&self, other: &Json) -> bool {
Patrick Walton318e5342012-11-15 02:59:301148 match (*self) {
1149 Number(f0) => {
1150 match *other {
1151 Number(f1) => f0 < f1,
1152 String(_) | Boolean(_) | List(_) | Object(_) |
1153 Null => true
1154 }
1155 }
1156
1157 String(ref s0) => {
1158 match *other {
1159 Number(_) => false,
1160 String(ref s1) => s0 < s1,
1161 Boolean(_) | List(_) | Object(_) | Null => true
1162 }
1163 }
1164
1165 Boolean(b0) => {
1166 match *other {
1167 Number(_) | String(_) => false,
1168 Boolean(b1) => b0 < b1,
1169 List(_) | Object(_) | Null => true
1170 }
1171 }
1172
Patrick Walton98fdcb02012-12-08 03:34:571173 List(ref l0) => {
Patrick Walton318e5342012-11-15 02:59:301174 match *other {
1175 Number(_) | String(_) | Boolean(_) => false,
Patrick Walton98fdcb02012-12-08 03:34:571176 List(ref l1) => (*l0) < (*l1),
Patrick Walton318e5342012-11-15 02:59:301177 Object(_) | Null => true
1178 }
1179 }
1180
1181 Object(ref d0) => {
1182 match *other {
1183 Number(_) | String(_) | Boolean(_) | List(_) => false,
1184 Object(ref d1) => {
Alex Crichton255193c2013-04-08 20:50:341185 let mut d0_flat = ~[];
1186 let mut d1_flat = ~[];
Patrick Walton318e5342012-11-15 02:59:301187
Alex Crichton255193c2013-04-08 20:50:341188 // FIXME #4430: this is horribly inefficient...
Daniel Micaye67c48a2013-06-24 22:34:201189 for d0.iter().advance |(k, v)| {
Alex Crichton255193c2013-04-08 20:50:341190 d0_flat.push((@copy *k, @copy *v));
Patrick Walton318e5342012-11-15 02:59:301191 }
Alex Crichton255193c2013-04-08 20:50:341192 d0_flat.qsort();
1193
Daniel Micaye67c48a2013-06-24 22:34:201194 for d1.iter().advance |(k, v)| {
Alex Crichton255193c2013-04-08 20:50:341195 d1_flat.push((@copy *k, @copy *v));
1196 }
1197 d1_flat.qsort();
1198
1199 d0_flat < d1_flat
Patrick Walton318e5342012-11-15 02:59:301200 }
1201 Null => true
1202 }
1203 }
1204
1205 Null => {
1206 match *other {
1207 Number(_) | String(_) | Boolean(_) | List(_) |
1208 Object(_) =>
1209 false,
1210 Null => true
1211 }
1212 }
1213 }
1214 }
Patrick Waltonc1084092013-03-22 04:34:301215 fn le(&self, other: &Json) -> bool { !(*other).lt(&(*self)) }
1216 fn ge(&self, other: &Json) -> bool { !(*self).lt(other) }
1217 fn gt(&self, other: &Json) -> bool { (*other).lt(&(*self)) }
Patrick Walton22b87572012-09-08 01:53:141218}
1219
Alex Crichton39568502013-05-29 03:11:411220/// A trait for converting values to JSON
1221trait ToJson {
1222 /// Converts the value of `self` to an instance of JSON
1223 fn to_json(&self) -> Json;
1224}
Erick Tryzelaared5af702012-05-28 19:10:321225
Patrick Walton91436882013-02-14 19:47:001226impl ToJson for Json {
Ben Striegel0fed29c2013-03-08 02:11:091227 fn to_json(&self) -> Json { copy *self }
Erick Tryzelaared5af702012-05-28 19:10:321228}
1229
Patrick Walton91436882013-02-14 19:47:001230impl ToJson for @Json {
Ben Striegel0fed29c2013-03-08 02:11:091231 fn to_json(&self) -> Json { (**self).to_json() }
Erick Tryzelaar11a56c32012-06-13 15:30:541232}
1233
Patrick Walton91436882013-02-14 19:47:001234impl ToJson for int {
Ben Striegel0fed29c2013-03-08 02:11:091235 fn to_json(&self) -> Json { Number(*self as float) }
Erick Tryzelaar11a56c32012-06-13 15:30:541236}
1237
Patrick Walton91436882013-02-14 19:47:001238impl ToJson for i8 {
Ben Striegel0fed29c2013-03-08 02:11:091239 fn to_json(&self) -> Json { Number(*self as float) }
Erick Tryzelaared5af702012-05-28 19:10:321240}
1241
Patrick Walton91436882013-02-14 19:47:001242impl ToJson for i16 {
Ben Striegel0fed29c2013-03-08 02:11:091243 fn to_json(&self) -> Json { Number(*self as float) }
Erick Tryzelaared5af702012-05-28 19:10:321244}
1245
Patrick Walton91436882013-02-14 19:47:001246impl ToJson for i32 {
Ben Striegel0fed29c2013-03-08 02:11:091247 fn to_json(&self) -> Json { Number(*self as float) }
Erick Tryzelaared5af702012-05-28 19:10:321248}
1249
Patrick Walton91436882013-02-14 19:47:001250impl ToJson for i64 {
Ben Striegel0fed29c2013-03-08 02:11:091251 fn to_json(&self) -> Json { Number(*self as float) }
Erick Tryzelaared5af702012-05-28 19:10:321252}
1253
Patrick Walton91436882013-02-14 19:47:001254impl ToJson for uint {
Ben Striegel0fed29c2013-03-08 02:11:091255 fn to_json(&self) -> Json { Number(*self as float) }
Erick Tryzelaar11a56c32012-06-13 15:30:541256}
1257
Patrick Walton91436882013-02-14 19:47:001258impl ToJson for u8 {
Ben Striegel0fed29c2013-03-08 02:11:091259 fn to_json(&self) -> Json { Number(*self as float) }
Erick Tryzelaared5af702012-05-28 19:10:321260}
1261
Patrick Walton91436882013-02-14 19:47:001262impl ToJson for u16 {
Ben Striegel0fed29c2013-03-08 02:11:091263 fn to_json(&self) -> Json { Number(*self as float) }
Erick Tryzelaared5af702012-05-28 19:10:321264}
1265
Patrick Walton91436882013-02-14 19:47:001266impl ToJson for u32 {
Ben Striegel0fed29c2013-03-08 02:11:091267 fn to_json(&self) -> Json { Number(*self as float) }
Erick Tryzelaared5af702012-05-28 19:10:321268}
1269
Patrick Walton91436882013-02-14 19:47:001270impl ToJson for u64 {
Ben Striegel0fed29c2013-03-08 02:11:091271 fn to_json(&self) -> Json { Number(*self as float) }
Erick Tryzelaared5af702012-05-28 19:10:321272}
1273
Patrick Walton91436882013-02-14 19:47:001274impl ToJson for float {
Ben Striegel0fed29c2013-03-08 02:11:091275 fn to_json(&self) -> Json { Number(*self) }
Erick Tryzelaared5af702012-05-28 19:10:321276}
1277
Patrick Walton91436882013-02-14 19:47:001278impl ToJson for f32 {
Ben Striegel0fed29c2013-03-08 02:11:091279 fn to_json(&self) -> Json { Number(*self as float) }
Erick Tryzelaared5af702012-05-28 19:10:321280}
1281
Patrick Walton91436882013-02-14 19:47:001282impl ToJson for f64 {
Ben Striegel0fed29c2013-03-08 02:11:091283 fn to_json(&self) -> Json { Number(*self as float) }
Erick Tryzelaared5af702012-05-28 19:10:321284}
1285
Patrick Walton91436882013-02-14 19:47:001286impl ToJson for () {
Ben Striegel0fed29c2013-03-08 02:11:091287 fn to_json(&self) -> Json { Null }
Erick Tryzelaared5af702012-05-28 19:10:321288}
1289
Patrick Walton91436882013-02-14 19:47:001290impl ToJson for bool {
Ben Striegel0fed29c2013-03-08 02:11:091291 fn to_json(&self) -> Json { Boolean(*self) }
Erick Tryzelaared5af702012-05-28 19:10:321292}
1293
Patrick Walton91436882013-02-14 19:47:001294impl ToJson for ~str {
Ben Striegel0fed29c2013-03-08 02:11:091295 fn to_json(&self) -> Json { String(copy *self) }
Erick Tryzelaarb361f6c2012-06-13 00:20:511296}
1297
Patrick Walton91436882013-02-14 19:47:001298impl ToJson for @~str {
Ben Striegel0fed29c2013-03-08 02:11:091299 fn to_json(&self) -> Json { String(copy **self) }
Erick Tryzelaared5af702012-05-28 19:10:321300}
1301
Patrick Waltonbf2a2252013-02-21 01:07:171302impl<A:ToJson,B:ToJson> ToJson for (A, B) {
Ben Striegel0fed29c2013-03-08 02:11:091303 fn to_json(&self) -> Json {
1304 match *self {
Brian Andersonbc9efaa2012-09-28 07:22:181305 (ref a, ref b) => {
Erick Tryzelaar49d00b22012-09-24 16:55:421306 List(~[a.to_json(), b.to_json()])
Niko Matsakis97452c02012-08-02 22:42:561307 }
1308 }
Erick Tryzelaared5af702012-05-28 19:10:321309 }
1310}
1311
Patrick Waltonbf2a2252013-02-21 01:07:171312impl<A:ToJson,B:ToJson,C:ToJson> ToJson for (A, B, C) {
Ben Striegel0fed29c2013-03-08 02:11:091313 fn to_json(&self) -> Json {
1314 match *self {
Brian Andersonbc9efaa2012-09-28 07:22:181315 (ref a, ref b, ref c) => {
Erick Tryzelaar49d00b22012-09-24 16:55:421316 List(~[a.to_json(), b.to_json(), c.to_json()])
Niko Matsakis97452c02012-08-02 22:42:561317 }
1318 }
Erick Tryzelaared5af702012-05-28 19:10:321319 }
1320}
1321
Patrick Waltonbf2a2252013-02-21 01:07:171322impl<A:ToJson> ToJson for ~[A] {
Ben Striegel0fed29c2013-03-08 02:11:091323 fn to_json(&self) -> Json { List(self.map(|elt| elt.to_json())) }
Erick Tryzelaared5af702012-05-28 19:10:321324}
1325
Daniel Micaycc148b52013-04-03 13:28:361326impl<A:ToJson + Copy> ToJson for HashMap<~str, A> {
Ben Striegel0fed29c2013-03-08 02:11:091327 fn to_json(&self) -> Json {
Daniel Micaycc148b52013-04-03 13:28:361328 let mut d = HashMap::new();
Daniel Micaye67c48a2013-06-24 22:34:201329 for self.iter().advance |(key, value)| {
Erick Tryzelaar49d00b22012-09-24 16:55:421330 d.insert(copy *key, value.to_json());
Erick Tryzelaared5af702012-05-28 19:10:321331 }
Erick Tryzelaar49d00b22012-09-24 16:55:421332 Object(~d)
Erick Tryzelaared5af702012-05-28 19:10:321333 }
1334}
1335
Patrick Waltonbf2a2252013-02-21 01:07:171336impl<A:ToJson> ToJson for Option<A> {
Ben Striegel0fed29c2013-03-08 02:11:091337 fn to_json(&self) -> Json {
1338 match *self {
Ben Striegela605fd02012-08-11 14:08:421339 None => Null,
Brian Andersonbc9efaa2012-09-28 07:22:181340 Some(ref value) => value.to_json()
Erick Tryzelaared5af702012-05-28 19:10:321341 }
1342 }
1343}
1344
Patrick Walton91436882013-02-14 19:47:001345impl to_str::ToStr for Json {
Patrick Waltonc1084092013-03-22 04:34:301346 fn to_str(&self) -> ~str { to_str(self) }
Erick Tryzelaared5af702012-05-28 19:10:321347}
1348
Patrick Walton91436882013-02-14 19:47:001349impl to_str::ToStr for Error {
Patrick Waltonc1084092013-03-22 04:34:301350 fn to_str(&self) -> ~str {
Paul Stansifer29f32b42012-08-23 00:24:521351 fmt!("%u:%u: %s", self.line, self.col, *self.msg)
Erick Tryzelaara8161762012-06-11 15:32:381352 }
1353}
1354
Brian Anderson6e27b272012-01-18 03:05:071355#[cfg(test)]
1356mod tests {
Patrick Waltonee528652013-05-22 00:24:311357 use core::prelude::*;
1358
Erick Tryzelaarb2908632013-03-27 00:46:291359 use super::*;
1360
Daniel Micaycc148b52013-04-03 13:28:361361 use core::hashmap::HashMap;
Patrick Walton206ab892013-05-25 02:35:291362 use core::io;
1363 use core::result;
John Clementsf91160b2013-02-08 01:06:261364
Erick Tryzelaarb10b8c32013-03-27 07:13:011365 use std::serialize::Decodable;
1366
Huon Wilson5dc5efe2013-05-15 22:55:571367 #[deriving(Eq, Encodable, Decodable)]
Erick Tryzelaar9bbf3842013-03-30 18:08:571368 enum Animal {
1369 Dog,
1370 Frog(~str, int)
1371 }
1372
Huon Wilson5dc5efe2013-05-15 22:55:571373 #[deriving(Eq, Encodable, Decodable)]
Erick Tryzelaar5b7d6082013-03-30 20:31:031374 struct Inner {
1375 a: (),
1376 b: uint,
1377 c: ~[~str],
1378 }
1379
Huon Wilson5dc5efe2013-05-15 22:55:571380 #[deriving(Eq, Encodable, Decodable)]
Erick Tryzelaar5b7d6082013-03-30 20:31:031381 struct Outer {
1382 inner: ~[Inner],
1383 }
1384
Erick Tryzelaar49d00b22012-09-24 16:55:421385 fn mk_object(items: &[(~str, Json)]) -> Json {
Daniel Micaycc148b52013-04-03 13:28:361386 let mut d = ~HashMap::new();
Erick Tryzelaar012dec52012-02-26 00:39:321387
Daniel Micayd2e99122013-06-21 12:29:531388 for items.iter().advance |item| {
Erick Tryzelaar49d00b22012-09-24 16:55:421389 match *item {
Niko Matsakis7a1a4082013-05-29 23:59:331390 (ref key, ref value) => { d.insert(copy *key, copy *value); },
Erick Tryzelaar49d00b22012-09-24 16:55:421391 }
Erick Tryzelaar012dec52012-02-26 00:39:321392 };
1393
Luqman Aden4cf51c22013-02-15 07:30:301394 Object(d)
Brian Anderson6e27b272012-01-18 03:05:071395 }
1396
1397 #[test]
Erick Tryzelaar012dec52012-02-26 00:39:321398 fn test_write_null() {
Erick Tryzelaar6cf99fa2013-03-27 00:23:001399 assert_eq!(to_str(&Null), ~"null");
Erick Tryzelaar9bbf3842013-03-30 18:08:571400 assert_eq!(to_pretty_str(&Null), ~"null");
Brian Anderson6e27b272012-01-18 03:05:071401 }
1402
Erick Tryzelaar9bbf3842013-03-30 18:08:571403
Brian Anderson6e27b272012-01-18 03:05:071404 #[test]
Erick Tryzelaar49d00b22012-09-24 16:55:421405 fn test_write_number() {
Erick Tryzelaar6cf99fa2013-03-27 00:23:001406 assert_eq!(to_str(&Number(3f)), ~"3");
Erick Tryzelaar9bbf3842013-03-30 18:08:571407 assert_eq!(to_pretty_str(&Number(3f)), ~"3");
1408
Erick Tryzelaar6cf99fa2013-03-27 00:23:001409 assert_eq!(to_str(&Number(3.1f)), ~"3.1");
Erick Tryzelaar9bbf3842013-03-30 18:08:571410 assert_eq!(to_pretty_str(&Number(3.1f)), ~"3.1");
1411
Erick Tryzelaar6cf99fa2013-03-27 00:23:001412 assert_eq!(to_str(&Number(-1.5f)), ~"-1.5");
Erick Tryzelaar9bbf3842013-03-30 18:08:571413 assert_eq!(to_pretty_str(&Number(-1.5f)), ~"-1.5");
1414
Erick Tryzelaar6cf99fa2013-03-27 00:23:001415 assert_eq!(to_str(&Number(0.5f)), ~"0.5");
Erick Tryzelaar9bbf3842013-03-30 18:08:571416 assert_eq!(to_pretty_str(&Number(0.5f)), ~"0.5");
Brian Anderson6e27b272012-01-18 03:05:071417 }
1418
1419 #[test]
Erick Tryzelaar012dec52012-02-26 00:39:321420 fn test_write_str() {
Erick Tryzelaar6cf99fa2013-03-27 00:23:001421 assert_eq!(to_str(&String(~"")), ~"\"\"");
Erick Tryzelaar9bbf3842013-03-30 18:08:571422 assert_eq!(to_pretty_str(&String(~"")), ~"\"\"");
1423
Erick Tryzelaar6cf99fa2013-03-27 00:23:001424 assert_eq!(to_str(&String(~"foo")), ~"\"foo\"");
Erick Tryzelaar9bbf3842013-03-30 18:08:571425 assert_eq!(to_pretty_str(&String(~"foo")), ~"\"foo\"");
Brian Anderson6e27b272012-01-18 03:05:071426 }
1427
1428 #[test]
Erick Tryzelaar012dec52012-02-26 00:39:321429 fn test_write_bool() {
Erick Tryzelaar6cf99fa2013-03-27 00:23:001430 assert_eq!(to_str(&Boolean(true)), ~"true");
Erick Tryzelaar9bbf3842013-03-30 18:08:571431 assert_eq!(to_pretty_str(&Boolean(true)), ~"true");
1432
Erick Tryzelaar6cf99fa2013-03-27 00:23:001433 assert_eq!(to_str(&Boolean(false)), ~"false");
Erick Tryzelaar9bbf3842013-03-30 18:08:571434 assert_eq!(to_pretty_str(&Boolean(false)), ~"false");
Brian Anderson6e27b272012-01-18 03:05:071435 }
1436
1437 #[test]
Erick Tryzelaar012dec52012-02-26 00:39:321438 fn test_write_list() {
Erick Tryzelaar6cf99fa2013-03-27 00:23:001439 assert_eq!(to_str(&List(~[])), ~"[]");
Erick Tryzelaarc9188c82013-03-27 00:34:491440 assert_eq!(to_pretty_str(&List(~[])), ~"[]");
Erick Tryzelaar9bbf3842013-03-30 18:08:571441
1442 assert_eq!(to_str(&List(~[Boolean(true)])), ~"[true]");
Erick Tryzelaarc9188c82013-03-27 00:34:491443 assert_eq!(
1444 to_pretty_str(&List(~[Boolean(true)])),
1445 ~"\
1446 [\n \
1447 true\n\
1448 ]"
1449 );
Erick Tryzelaar9bbf3842013-03-30 18:08:571450
1451 assert_eq!(to_str(&List(~[
1452 Boolean(false),
1453 Null,
1454 List(~[String(~"foo\nbar"), Number(3.5f)])
1455 ])), ~"[false,null,[\"foo\\nbar\",3.5]]");
Erick Tryzelaarc9188c82013-03-27 00:34:491456 assert_eq!(
1457 to_pretty_str(&List(~[
1458 Boolean(false),
1459 Null,
1460 List(~[String(~"foo\nbar"), Number(3.5f)])
1461 ])),
1462 ~"\
1463 [\n \
1464 false,\n \
1465 null,\n \
1466 [\n \
1467 \"foo\\nbar\",\n \
1468 3.5\n \
1469 ]\n\
1470 ]"
1471 );
1472 }
1473
1474 #[test]
Erick Tryzelaar49d00b22012-09-24 16:55:421475 fn test_write_object() {
Erick Tryzelaar609a9e62013-05-23 16:39:001476 assert_eq!(to_str(&mk_object([])), ~"{}");
1477 assert_eq!(to_pretty_str(&mk_object([])), ~"{}");
Erick Tryzelaar9bbf3842013-03-30 18:08:571478
Erick Tryzelaar6cf99fa2013-03-27 00:23:001479 assert_eq!(
Erick Tryzelaar609a9e62013-05-23 16:39:001480 to_str(&mk_object([(~"a", Boolean(true))])),
Erick Tryzelaar6cf99fa2013-03-27 00:23:001481 ~"{\"a\":true}"
1482 );
Erick Tryzelaarc9188c82013-03-27 00:34:491483 assert_eq!(
Erick Tryzelaar609a9e62013-05-23 16:39:001484 to_pretty_str(&mk_object([(~"a", Boolean(true))])),
Erick Tryzelaar9bbf3842013-03-30 18:08:571485 ~"\
1486 {\n \
1487 \"a\": true\n\
1488 }"
1489 );
1490
1491 assert_eq!(
Erick Tryzelaar609a9e62013-05-23 16:39:001492 to_str(&mk_object([
Erick Tryzelaarc9188c82013-03-27 00:34:491493 (~"b", List(~[
Erick Tryzelaar609a9e62013-05-23 16:39:001494 mk_object([(~"c", String(~"\x0c\r"))]),
1495 mk_object([(~"d", String(~""))])
Erick Tryzelaarc9188c82013-03-27 00:34:491496 ]))
1497 ])),
1498 ~"{\
1499 \"b\":[\
1500 {\"c\":\"\\f\\r\"},\
1501 {\"d\":\"\"}\
1502 ]\
1503 }"
1504 );
Erick Tryzelaarc9188c82013-03-27 00:34:491505 assert_eq!(
Erick Tryzelaar609a9e62013-05-23 16:39:001506 to_pretty_str(&mk_object([
Erick Tryzelaarc9188c82013-03-27 00:34:491507 (~"b", List(~[
Erick Tryzelaar609a9e62013-05-23 16:39:001508 mk_object([(~"c", String(~"\x0c\r"))]),
1509 mk_object([(~"d", String(~""))])
Erick Tryzelaarc9188c82013-03-27 00:34:491510 ]))
1511 ])),
1512 ~"\
1513 {\n \
1514 \"b\": [\n \
1515 {\n \
1516 \"c\": \"\\f\\r\"\n \
1517 },\n \
1518 {\n \
1519 \"d\": \"\"\n \
1520 }\n \
1521 ]\n\
1522 }"
1523 );
Erick Tryzelaar9bbf3842013-03-30 18:08:571524
Erick Tryzelaar609a9e62013-05-23 16:39:001525 let a = mk_object([
Erick Tryzelaarc9188c82013-03-27 00:34:491526 (~"a", Boolean(true)),
1527 (~"b", List(~[
Erick Tryzelaar609a9e62013-05-23 16:39:001528 mk_object([(~"c", String(~"\x0c\r"))]),
1529 mk_object([(~"d", String(~""))])
Erick Tryzelaarc9188c82013-03-27 00:34:491530 ]))
1531 ]);
Erick Tryzelaar9bbf3842013-03-30 18:08:571532
Erick Tryzelaarc9188c82013-03-27 00:34:491533 // We can't compare the strings directly because the object fields be
1534 // printed in a different order.
Erick Tryzelaar9bbf3842013-03-30 18:08:571535 assert_eq!(copy a, from_str(to_str(&a)).unwrap());
1536 assert_eq!(copy a, from_str(to_pretty_str(&a)).unwrap());
Erick Tryzelaarc9188c82013-03-27 00:34:491537 }
1538
1539 #[test]
Erick Tryzelaar9bbf3842013-03-30 18:08:571540 fn test_write_enum() {
Erick Tryzelaarc9188c82013-03-27 00:34:491541 let animal = Dog;
Erick Tryzelaarc9188c82013-03-27 00:34:491542 assert_eq!(
Erick Tryzelaar9bbf3842013-03-30 18:08:571543 do io::with_str_writer |wr| {
Patrick Waltondc5df612013-05-02 00:54:541544 let mut encoder = Encoder(wr);
1545 animal.encode(&mut encoder);
Erick Tryzelaar9bbf3842013-03-30 18:08:571546 },
1547 ~"\"Dog\""
1548 );
1549 assert_eq!(
1550 do io::with_str_writer |wr| {
Patrick Waltondc5df612013-05-02 00:54:541551 let mut encoder = PrettyEncoder(wr);
1552 animal.encode(&mut encoder);
Erick Tryzelaar9bbf3842013-03-30 18:08:571553 },
1554 ~"\"Dog\""
1555 );
1556
1557 let animal = Frog(~"Henry", 349);
1558 assert_eq!(
1559 do io::with_str_writer |wr| {
Patrick Waltondc5df612013-05-02 00:54:541560 let mut encoder = Encoder(wr);
1561 animal.encode(&mut encoder);
Erick Tryzelaar9bbf3842013-03-30 18:08:571562 },
1563 ~"[\"Frog\",\"Henry\",349]"
1564 );
1565 assert_eq!(
1566 do io::with_str_writer |wr| {
Patrick Waltondc5df612013-05-02 00:54:541567 let mut encoder = PrettyEncoder(wr);
1568 animal.encode(&mut encoder);
Erick Tryzelaar9bbf3842013-03-30 18:08:571569 },
Erick Tryzelaarc9188c82013-03-27 00:34:491570 ~"\
1571 [\n \
1572 \"Frog\",\n \
Erick Tryzelaar4d995e62013-03-27 07:14:521573 \"Henry\",\n \
1574 349\n\
Erick Tryzelaarc9188c82013-03-27 00:34:491575 ]"
1576 );
John Clementsc952c042013-02-08 23:36:401577 }
1578
1579 #[test]
Erick Tryzelaar6cf99fa2013-03-27 00:23:001580 fn test_write_some() {
1581 let value = Some(~"jodhpurs");
1582 let s = do io::with_str_writer |wr| {
Patrick Waltondc5df612013-05-02 00:54:541583 let mut encoder = Encoder(wr);
1584 value.encode(&mut encoder);
Erick Tryzelaar6cf99fa2013-03-27 00:23:001585 };
1586 assert_eq!(s, ~"\"jodhpurs\"");
John Clementsc952c042013-02-08 23:36:401587
Erick Tryzelaarc9188c82013-03-27 00:34:491588 let value = Some(~"jodhpurs");
1589 let s = do io::with_str_writer |wr| {
Patrick Waltondc5df612013-05-02 00:54:541590 let mut encoder = PrettyEncoder(wr);
1591 value.encode(&mut encoder);
Erick Tryzelaarc9188c82013-03-27 00:34:491592 };
1593 assert_eq!(s, ~"\"jodhpurs\"");
1594 }
1595
1596 #[test]
Erick Tryzelaar6cf99fa2013-03-27 00:23:001597 fn test_write_none() {
1598 let value: Option<~str> = None;
1599 let s = do io::with_str_writer |wr| {
Patrick Waltondc5df612013-05-02 00:54:541600 let mut encoder = Encoder(wr);
1601 value.encode(&mut encoder);
Erick Tryzelaar6cf99fa2013-03-27 00:23:001602 };
1603 assert_eq!(s, ~"null");
John Clementsf91160b2013-02-08 01:06:261604
Erick Tryzelaarc9188c82013-03-27 00:34:491605 let s = do io::with_str_writer |wr| {
Patrick Waltondc5df612013-05-02 00:54:541606 let mut encoder = Encoder(wr);
1607 value.encode(&mut encoder);
Erick Tryzelaarc9188c82013-03-27 00:34:491608 };
1609 assert_eq!(s, ~"null");
1610 }
1611
1612 #[test]
Erick Tryzelaar012dec52012-02-26 00:39:321613 fn test_trailing_characters() {
Erick Tryzelaar609a9e62013-05-23 16:39:001614 assert_eq!(from_str("nulla"),
Patrick Waltond7e74b52013-03-06 21:58:021615 Err(Error {line: 1u, col: 5u, msg: @~"trailing characters"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001616 assert_eq!(from_str("truea"),
Patrick Waltond7e74b52013-03-06 21:58:021617 Err(Error {line: 1u, col: 5u, msg: @~"trailing characters"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001618 assert_eq!(from_str("falsea"),
Patrick Waltond7e74b52013-03-06 21:58:021619 Err(Error {line: 1u, col: 6u, msg: @~"trailing characters"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001620 assert_eq!(from_str("1a"),
Patrick Waltond7e74b52013-03-06 21:58:021621 Err(Error {line: 1u, col: 2u, msg: @~"trailing characters"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001622 assert_eq!(from_str("[]a"),
Patrick Waltond7e74b52013-03-06 21:58:021623 Err(Error {line: 1u, col: 3u, msg: @~"trailing characters"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001624 assert_eq!(from_str("{}a"),
Patrick Waltond7e74b52013-03-06 21:58:021625 Err(Error {line: 1u, col: 3u, msg: @~"trailing characters"}));
Erick Tryzelaar012dec52012-02-26 00:39:321626 }
1627
1628 #[test]
1629 fn test_read_identifiers() {
Erick Tryzelaar609a9e62013-05-23 16:39:001630 assert_eq!(from_str("n"),
Patrick Waltond7e74b52013-03-06 21:58:021631 Err(Error {line: 1u, col: 2u, msg: @~"invalid syntax"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001632 assert_eq!(from_str("nul"),
Patrick Waltond7e74b52013-03-06 21:58:021633 Err(Error {line: 1u, col: 4u, msg: @~"invalid syntax"}));
Erick Tryzelaar012dec52012-02-26 00:39:321634
Erick Tryzelaar609a9e62013-05-23 16:39:001635 assert_eq!(from_str("t"),
Patrick Waltond7e74b52013-03-06 21:58:021636 Err(Error {line: 1u, col: 2u, msg: @~"invalid syntax"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001637 assert_eq!(from_str("truz"),
Patrick Waltond7e74b52013-03-06 21:58:021638 Err(Error {line: 1u, col: 4u, msg: @~"invalid syntax"}));
Erick Tryzelaar012dec52012-02-26 00:39:321639
Erick Tryzelaar609a9e62013-05-23 16:39:001640 assert_eq!(from_str("f"),
Patrick Waltond7e74b52013-03-06 21:58:021641 Err(Error {line: 1u, col: 2u, msg: @~"invalid syntax"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001642 assert_eq!(from_str("faz"),
Patrick Waltond7e74b52013-03-06 21:58:021643 Err(Error {line: 1u, col: 3u, msg: @~"invalid syntax"}));
Erick Tryzelaar012dec52012-02-26 00:39:321644
Erick Tryzelaar609a9e62013-05-23 16:39:001645 assert_eq!(from_str("null"), Ok(Null));
1646 assert_eq!(from_str("true"), Ok(Boolean(true)));
1647 assert_eq!(from_str("false"), Ok(Boolean(false)));
1648 assert_eq!(from_str(" null "), Ok(Null));
1649 assert_eq!(from_str(" true "), Ok(Boolean(true)));
1650 assert_eq!(from_str(" false "), Ok(Boolean(false)));
Erick Tryzelaar012dec52012-02-26 00:39:321651 }
1652
1653 #[test]
Erick Tryzelaar5b7d6082013-03-30 20:31:031654 fn test_decode_identifiers() {
Erick Tryzelaar609a9e62013-05-23 16:39:001655 let mut decoder = Decoder(from_str("null").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541656 let v: () = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031657 assert_eq!(v, ());
1658
Erick Tryzelaar609a9e62013-05-23 16:39:001659 let mut decoder = Decoder(from_str("true").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541660 let v: bool = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031661 assert_eq!(v, true);
1662
Erick Tryzelaar609a9e62013-05-23 16:39:001663 let mut decoder = Decoder(from_str("false").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541664 let v: bool = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031665 assert_eq!(v, false);
1666 }
1667
1668 #[test]
Erick Tryzelaar49d00b22012-09-24 16:55:421669 fn test_read_number() {
Erick Tryzelaar609a9e62013-05-23 16:39:001670 assert_eq!(from_str("+"),
Patrick Waltond7e74b52013-03-06 21:58:021671 Err(Error {line: 1u, col: 1u, msg: @~"invalid syntax"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001672 assert_eq!(from_str("."),
Patrick Waltond7e74b52013-03-06 21:58:021673 Err(Error {line: 1u, col: 1u, msg: @~"invalid syntax"}));
Erick Tryzelaar012dec52012-02-26 00:39:321674
Erick Tryzelaar609a9e62013-05-23 16:39:001675 assert_eq!(from_str("-"),
Patrick Waltond7e74b52013-03-06 21:58:021676 Err(Error {line: 1u, col: 2u, msg: @~"invalid number"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001677 assert_eq!(from_str("00"),
Patrick Waltond7e74b52013-03-06 21:58:021678 Err(Error {line: 1u, col: 2u, msg: @~"invalid number"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001679 assert_eq!(from_str("1."),
Patrick Waltond7e74b52013-03-06 21:58:021680 Err(Error {line: 1u, col: 3u, msg: @~"invalid number"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001681 assert_eq!(from_str("1e"),
Patrick Waltond7e74b52013-03-06 21:58:021682 Err(Error {line: 1u, col: 3u, msg: @~"invalid number"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001683 assert_eq!(from_str("1e+"),
Patrick Waltond7e74b52013-03-06 21:58:021684 Err(Error {line: 1u, col: 4u, msg: @~"invalid number"}));
Erick Tryzelaar012dec52012-02-26 00:39:321685
Erick Tryzelaar609a9e62013-05-23 16:39:001686 assert_eq!(from_str("3"), Ok(Number(3f)));
1687 assert_eq!(from_str("3.1"), Ok(Number(3.1f)));
1688 assert_eq!(from_str("-1.2"), Ok(Number(-1.2f)));
1689 assert_eq!(from_str("0.4"), Ok(Number(0.4f)));
1690 assert_eq!(from_str("0.4e5"), Ok(Number(0.4e5f)));
1691 assert_eq!(from_str("0.4e+15"), Ok(Number(0.4e15f)));
1692 assert_eq!(from_str("0.4e-01"), Ok(Number(0.4e-01f)));
1693 assert_eq!(from_str(" 3 "), Ok(Number(3f)));
Erick Tryzelaar012dec52012-02-26 00:39:321694 }
1695
1696 #[test]
Erick Tryzelaar5b7d6082013-03-30 20:31:031697 fn test_decode_numbers() {
Erick Tryzelaar609a9e62013-05-23 16:39:001698 let mut decoder = Decoder(from_str("3").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541699 let v: float = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031700 assert_eq!(v, 3f);
1701
Erick Tryzelaar609a9e62013-05-23 16:39:001702 let mut decoder = Decoder(from_str("3.1").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541703 let v: float = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031704 assert_eq!(v, 3.1f);
1705
Erick Tryzelaar609a9e62013-05-23 16:39:001706 let mut decoder = Decoder(from_str("-1.2").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541707 let v: float = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031708 assert_eq!(v, -1.2f);
1709
Erick Tryzelaar609a9e62013-05-23 16:39:001710 let mut decoder = Decoder(from_str("0.4").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541711 let v: float = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031712 assert_eq!(v, 0.4f);
1713
Erick Tryzelaar609a9e62013-05-23 16:39:001714 let mut decoder = Decoder(from_str("0.4e5").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541715 let v: float = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031716 assert_eq!(v, 0.4e5f);
1717
Erick Tryzelaar609a9e62013-05-23 16:39:001718 let mut decoder = Decoder(from_str("0.4e15").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541719 let v: float = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031720 assert_eq!(v, 0.4e15f);
1721
Erick Tryzelaar609a9e62013-05-23 16:39:001722 let mut decoder = Decoder(from_str("0.4e-01").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541723 let v: float = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031724 assert_eq!(v, 0.4e-01f);
1725 }
1726
1727 #[test]
Erick Tryzelaar012dec52012-02-26 00:39:321728 fn test_read_str() {
Erick Tryzelaar609a9e62013-05-23 16:39:001729 assert_eq!(from_str("\""),
Patrick Waltond7e74b52013-03-06 21:58:021730 Err(Error {line: 1u, col: 2u, msg: @~"EOF while parsing string"
1731 }));
Erick Tryzelaar609a9e62013-05-23 16:39:001732 assert_eq!(from_str("\"lol"),
Patrick Waltond7e74b52013-03-06 21:58:021733 Err(Error {line: 1u, col: 5u, msg: @~"EOF while parsing string"
1734 }));
Erick Tryzelaar012dec52012-02-26 00:39:321735
Erick Tryzelaar609a9e62013-05-23 16:39:001736 assert_eq!(from_str("\"\""), Ok(String(~"")));
1737 assert_eq!(from_str("\"foo\""), Ok(String(~"foo")));
1738 assert_eq!(from_str("\"\\\"\""), Ok(String(~"\"")));
1739 assert_eq!(from_str("\"\\b\""), Ok(String(~"\x08")));
1740 assert_eq!(from_str("\"\\n\""), Ok(String(~"\n")));
1741 assert_eq!(from_str("\"\\r\""), Ok(String(~"\r")));
1742 assert_eq!(from_str("\"\\t\""), Ok(String(~"\t")));
1743 assert_eq!(from_str(" \"foo\" "), Ok(String(~"foo")));
1744 assert_eq!(from_str("\"\\u12ab\""), Ok(String(~"\u12ab")));
1745 assert_eq!(from_str("\"\\uAB12\""), Ok(String(~"\uAB12")));
Erick Tryzelaar012dec52012-02-26 00:39:321746 }
1747
1748 #[test]
Erick Tryzelaar5b7d6082013-03-30 20:31:031749 fn test_decode_str() {
Erick Tryzelaar609a9e62013-05-23 16:39:001750 let mut decoder = Decoder(from_str("\"\"").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541751 let v: ~str = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031752 assert_eq!(v, ~"");
1753
Erick Tryzelaar609a9e62013-05-23 16:39:001754 let mut decoder = Decoder(from_str("\"foo\"").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541755 let v: ~str = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031756 assert_eq!(v, ~"foo");
1757
Erick Tryzelaar609a9e62013-05-23 16:39:001758 let mut decoder = Decoder(from_str("\"\\\"\"").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541759 let v: ~str = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031760 assert_eq!(v, ~"\"");
1761
Erick Tryzelaar609a9e62013-05-23 16:39:001762 let mut decoder = Decoder(from_str("\"\\b\"").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541763 let v: ~str = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031764 assert_eq!(v, ~"\x08");
1765
Erick Tryzelaar609a9e62013-05-23 16:39:001766 let mut decoder = Decoder(from_str("\"\\n\"").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541767 let v: ~str = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031768 assert_eq!(v, ~"\n");
1769
Erick Tryzelaar609a9e62013-05-23 16:39:001770 let mut decoder = Decoder(from_str("\"\\r\"").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541771 let v: ~str = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031772 assert_eq!(v, ~"\r");
1773
Erick Tryzelaar609a9e62013-05-23 16:39:001774 let mut decoder = Decoder(from_str("\"\\t\"").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541775 let v: ~str = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031776 assert_eq!(v, ~"\t");
1777
Erick Tryzelaar609a9e62013-05-23 16:39:001778 let mut decoder = Decoder(from_str("\"\\u12ab\"").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541779 let v: ~str = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031780 assert_eq!(v, ~"\u12ab");
1781
Erick Tryzelaar609a9e62013-05-23 16:39:001782 let mut decoder = Decoder(from_str("\"\\uAB12\"").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541783 let v: ~str = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031784 assert_eq!(v, ~"\uAB12");
Kevin Cantucf386182012-08-31 04:03:191785 }
1786
1787 #[test]
Erick Tryzelaar012dec52012-02-26 00:39:321788 fn test_read_list() {
Erick Tryzelaar609a9e62013-05-23 16:39:001789 assert_eq!(from_str("["),
Patrick Waltond7e74b52013-03-06 21:58:021790 Err(Error {line: 1u, col: 2u, msg: @~"EOF while parsing value"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001791 assert_eq!(from_str("[1"),
Patrick Waltond7e74b52013-03-06 21:58:021792 Err(Error {line: 1u, col: 3u, msg: @~"EOF while parsing list"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001793 assert_eq!(from_str("[1,"),
Patrick Waltond7e74b52013-03-06 21:58:021794 Err(Error {line: 1u, col: 4u, msg: @~"EOF while parsing value"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001795 assert_eq!(from_str("[1,]"),
Patrick Waltond7e74b52013-03-06 21:58:021796 Err(Error {line: 1u, col: 4u, msg: @~"invalid syntax"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001797 assert_eq!(from_str("[6 7]"),
Patrick Waltond7e74b52013-03-06 21:58:021798 Err(Error {line: 1u, col: 4u, msg: @~"expected `,` or `]`"}));
Erick Tryzelaar012dec52012-02-26 00:39:321799
Erick Tryzelaar609a9e62013-05-23 16:39:001800 assert_eq!(from_str("[]"), Ok(List(~[])));
1801 assert_eq!(from_str("[ ]"), Ok(List(~[])));
1802 assert_eq!(from_str("[true]"), Ok(List(~[Boolean(true)])));
1803 assert_eq!(from_str("[ false ]"), Ok(List(~[Boolean(false)])));
1804 assert_eq!(from_str("[null]"), Ok(List(~[Null])));
1805 assert_eq!(from_str("[3, 1]"),
Patrick Waltond7e74b52013-03-06 21:58:021806 Ok(List(~[Number(3f), Number(1f)])));
Erick Tryzelaar609a9e62013-05-23 16:39:001807 assert_eq!(from_str("\n[3, 2]\n"),
Patrick Waltond7e74b52013-03-06 21:58:021808 Ok(List(~[Number(3f), Number(2f)])));
Erick Tryzelaar609a9e62013-05-23 16:39:001809 assert_eq!(from_str("[2, [4, 1]]"),
Patrick Waltond7e74b52013-03-06 21:58:021810 Ok(List(~[Number(2f), List(~[Number(4f), Number(1f)])])));
Erick Tryzelaar012dec52012-02-26 00:39:321811 }
1812
1813 #[test]
Erick Tryzelaar5b7d6082013-03-30 20:31:031814 fn test_decode_list() {
Erick Tryzelaar609a9e62013-05-23 16:39:001815 let mut decoder = Decoder(from_str("[]").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541816 let v: ~[()] = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031817 assert_eq!(v, ~[]);
1818
Erick Tryzelaar609a9e62013-05-23 16:39:001819 let mut decoder = Decoder(from_str("[null]").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541820 let v: ~[()] = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031821 assert_eq!(v, ~[()]);
1822
Erick Tryzelaar609a9e62013-05-23 16:39:001823 let mut decoder = Decoder(from_str("[true]").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541824 let v: ~[bool] = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031825 assert_eq!(v, ~[true]);
1826
Erick Tryzelaar609a9e62013-05-23 16:39:001827 let mut decoder = Decoder(from_str("[true]").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541828 let v: ~[bool] = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031829 assert_eq!(v, ~[true]);
1830
Erick Tryzelaar609a9e62013-05-23 16:39:001831 let mut decoder = Decoder(from_str("[3, 1]").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541832 let v: ~[int] = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031833 assert_eq!(v, ~[3, 1]);
1834
Erick Tryzelaar609a9e62013-05-23 16:39:001835 let mut decoder = Decoder(from_str("[[3], [1, 2]]").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541836 let v: ~[~[uint]] = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031837 assert_eq!(v, ~[~[3], ~[1, 2]]);
1838 }
1839
1840 #[test]
Erick Tryzelaar49d00b22012-09-24 16:55:421841 fn test_read_object() {
Erick Tryzelaar609a9e62013-05-23 16:39:001842 assert_eq!(from_str("{"),
Patrick Waltond7e74b52013-03-06 21:58:021843 Err(Error {
1844 line: 1u,
1845 col: 2u,
1846 msg: @~"EOF while parsing object"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001847 assert_eq!(from_str("{ "),
Patrick Waltond7e74b52013-03-06 21:58:021848 Err(Error {
1849 line: 1u,
1850 col: 3u,
1851 msg: @~"EOF while parsing object"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001852 assert_eq!(from_str("{1"),
Patrick Waltond7e74b52013-03-06 21:58:021853 Err(Error {
1854 line: 1u,
1855 col: 2u,
1856 msg: @~"key must be a string"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001857 assert_eq!(from_str("{ \"a\""),
Patrick Waltond7e74b52013-03-06 21:58:021858 Err(Error {
1859 line: 1u,
1860 col: 6u,
1861 msg: @~"EOF while parsing object"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001862 assert_eq!(from_str("{\"a\""),
Patrick Waltond7e74b52013-03-06 21:58:021863 Err(Error {
1864 line: 1u,
1865 col: 5u,
1866 msg: @~"EOF while parsing object"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001867 assert_eq!(from_str("{\"a\" "),
Patrick Waltond7e74b52013-03-06 21:58:021868 Err(Error {
1869 line: 1u,
1870 col: 6u,
1871 msg: @~"EOF while parsing object"}));
Erick Tryzelaar012dec52012-02-26 00:39:321872
Erick Tryzelaar609a9e62013-05-23 16:39:001873 assert_eq!(from_str("{\"a\" 1"),
Patrick Waltond7e74b52013-03-06 21:58:021874 Err(Error {line: 1u, col: 6u, msg: @~"expected `:`"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001875 assert_eq!(from_str("{\"a\":"),
Patrick Waltond7e74b52013-03-06 21:58:021876 Err(Error {line: 1u, col: 6u, msg: @~"EOF while parsing value"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001877 assert_eq!(from_str("{\"a\":1"),
Patrick Waltond7e74b52013-03-06 21:58:021878 Err(Error {
1879 line: 1u,
1880 col: 7u,
1881 msg: @~"EOF while parsing object"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001882 assert_eq!(from_str("{\"a\":1 1"),
Patrick Waltond7e74b52013-03-06 21:58:021883 Err(Error {line: 1u, col: 8u, msg: @~"expected `,` or `}`"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001884 assert_eq!(from_str("{\"a\":1,"),
Patrick Waltond7e74b52013-03-06 21:58:021885 Err(Error {
1886 line: 1u,
1887 col: 8u,
1888 msg: @~"EOF while parsing object"}));
Erick Tryzelaar012dec52012-02-26 00:39:321889
Erick Tryzelaar609a9e62013-05-23 16:39:001890 assert_eq!(result::unwrap(from_str("{}")), mk_object([]));
1891 assert_eq!(result::unwrap(from_str("{\"a\": 3}")),
1892 mk_object([(~"a", Number(3.0f))]));
Erick Tryzelaar012dec52012-02-26 00:39:321893
Erick Tryzelaar6cf99fa2013-03-27 00:23:001894 assert_eq!(result::unwrap(from_str(
Erick Tryzelaar609a9e62013-05-23 16:39:001895 "{ \"a\": null, \"b\" : true }")),
1896 mk_object([
Ben Striegela605fd02012-08-11 14:08:421897 (~"a", Null),
Patrick Waltond7e74b52013-03-06 21:58:021898 (~"b", Boolean(true))]));
Erick Tryzelaar6cf99fa2013-03-27 00:23:001899 assert_eq!(result::unwrap(
Erick Tryzelaar609a9e62013-05-23 16:39:001900 from_str("\n{ \"a\": null, \"b\" : true }\n")),
1901 mk_object([
Ben Striegela605fd02012-08-11 14:08:421902 (~"a", Null),
Patrick Waltond7e74b52013-03-06 21:58:021903 (~"b", Boolean(true))]));
Erick Tryzelaar6cf99fa2013-03-27 00:23:001904 assert_eq!(result::unwrap(from_str(
Erick Tryzelaar609a9e62013-05-23 16:39:001905 "{\"a\" : 1.0 ,\"b\": [ true ]}")),
1906 mk_object([
Erick Tryzelaar49d00b22012-09-24 16:55:421907 (~"a", Number(1.0)),
1908 (~"b", List(~[Boolean(true)]))
Patrick Waltond7e74b52013-03-06 21:58:021909 ]));
Erick Tryzelaar6cf99fa2013-03-27 00:23:001910 assert_eq!(result::unwrap(from_str(
Michael Sullivan92743dc2012-07-14 05:57:481911 ~"{" +
Alex Crichtonb04c40b2013-05-27 23:04:001912 "\"a\": 1.0, " +
1913 "\"b\": [" +
1914 "true," +
1915 "\"foo\\nbar\", " +
1916 "{ \"c\": {\"d\": null} } " +
1917 "]" +
1918 "}")),
Erick Tryzelaar609a9e62013-05-23 16:39:001919 mk_object([
Erick Tryzelaar49d00b22012-09-24 16:55:421920 (~"a", Number(1.0f)),
1921 (~"b", List(~[
Ben Striegela605fd02012-08-11 14:08:421922 Boolean(true),
Erick Tryzelaar49d00b22012-09-24 16:55:421923 String(~"foo\nbar"),
Erick Tryzelaar609a9e62013-05-23 16:39:001924 mk_object([
1925 (~"c", mk_object([(~"d", Null)]))
Michael Sullivan98e161f2012-06-29 23:26:561926 ])
1927 ]))
Patrick Waltond7e74b52013-03-06 21:58:021928 ]));
Erick Tryzelaar012dec52012-02-26 00:39:321929 }
1930
1931 #[test]
Erick Tryzelaar5b7d6082013-03-30 20:31:031932 fn test_decode_struct() {
1933 let s = ~"{
1934 \"inner\": [
1935 { \"a\": null, \"b\": 2, \"c\": [\"abc\", \"xyz\"] }
1936 ]
1937 }";
Patrick Waltondc5df612013-05-02 00:54:541938 let mut decoder = Decoder(from_str(s).unwrap());
1939 let v: Outer = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031940 assert_eq!(
1941 v,
1942 Outer {
1943 inner: ~[
1944 Inner { a: (), b: 2, c: ~[~"abc", ~"xyz"] }
1945 ]
1946 }
1947 );
Erick Tryzelaarb10b8c32013-03-27 07:13:011948 }
1949
1950 #[test]
Erick Tryzelaar5b7d6082013-03-30 20:31:031951 fn test_decode_option() {
Erick Tryzelaar609a9e62013-05-23 16:39:001952 let mut decoder = Decoder(from_str("null").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541953 let value: Option<~str> = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031954 assert_eq!(value, None);
1955
Erick Tryzelaar609a9e62013-05-23 16:39:001956 let mut decoder = Decoder(from_str("\"jodhpurs\"").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541957 let value: Option<~str> = Decodable::decode(&mut decoder);
Erick Tryzelaarb10b8c32013-03-27 07:13:011958 assert_eq!(value, Some(~"jodhpurs"));
1959 }
1960
1961 #[test]
Erick Tryzelaar5b7d6082013-03-30 20:31:031962 fn test_decode_enum() {
Erick Tryzelaar609a9e62013-05-23 16:39:001963 let mut decoder = Decoder(from_str("\"Dog\"").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541964 let value: Animal = Decodable::decode(&mut decoder);
Erick Tryzelaar4e9a63f2013-03-27 00:42:011965 assert_eq!(value, Dog);
Erick Tryzelaar4e9a63f2013-03-27 00:42:011966
Patrick Waltondc5df612013-05-02 00:54:541967 let mut decoder =
Erick Tryzelaar609a9e62013-05-23 16:39:001968 Decoder(from_str("[\"Frog\",\"Henry\",349]").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541969 let value: Animal = Decodable::decode(&mut decoder);
Erick Tryzelaar4e9a63f2013-03-27 00:42:011970 assert_eq!(value, Frog(~"Henry", 349));
1971 }
1972
1973 #[test]
Erick Tryzelaar5b7d6082013-03-30 20:31:031974 fn test_decode_map() {
Erick Tryzelaard1a83e62013-03-29 16:04:351975 let s = ~"{\"a\": \"Dog\", \"b\": [\"Frog\", \"Henry\", 349]}";
Patrick Waltondc5df612013-05-02 00:54:541976 let mut decoder = Decoder(from_str(s).unwrap());
1977 let mut map: HashMap<~str, Animal> = Decodable::decode(&mut decoder);
Erick Tryzelaard1a83e62013-03-29 16:04:351978
Erick Tryzelaarbdef3f12013-03-29 16:10:311979 assert_eq!(map.pop(&~"a"), Some(Dog));
1980 assert_eq!(map.pop(&~"b"), Some(Frog(~"Henry", 349)));
Erick Tryzelaard1a83e62013-03-29 16:04:351981 }
1982
1983 #[test]
Erick Tryzelaar012dec52012-02-26 00:39:321984 fn test_multiline_errors() {
Erick Tryzelaar609a9e62013-05-23 16:39:001985 assert_eq!(from_str("{\n \"foo\":\n \"bar\""),
Patrick Waltond7e74b52013-03-06 21:58:021986 Err(Error {
1987 line: 3u,
1988 col: 8u,
1989 msg: @~"EOF while parsing object"}));
Brian Anderson6e27b272012-01-18 03:05:071990 }
1991}