blob: 5ef0500d53ad54ec937039215a65ba56355ec674 [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.
Kevin Cantuc43426e2012-09-13 05:09:5513#[forbid(non_camel_case_types)];
Elly Jonesbd726262011-11-07 19:01:2814
Gareth Daniel Smithbe014162012-07-04 21:53:1215//! json serialization
Brian Anderson95521c42012-03-08 02:17:3016
Patrick Waltonf3723cf2013-05-17 22:28:4417use core::prelude::*;
18
Erick Tryzelaarcefecd82013-03-13 18:29:0519use core::io::{WriterUtil, ReaderUtil};
Daniel Micaycc148b52013-04-03 13:28:3620use core::hashmap::HashMap;
Erick Tryzelaarcefecd82013-03-13 18:29:0521
Patrick Waltoneb4d39e2013-01-26 00:57:3922use serialize::Encodable;
Patrick Walton57c59992012-12-23 22:41:3723use serialize;
Patrick Walton22b87572012-09-08 01:53:1424use sort::Sort;
Elly Jonesbd726262011-11-07 19:01:2825
Gareth Daniel Smithbe014162012-07-04 21:53:1226/// Represents a json value
Erick Tryzelaar49d00b22012-09-24 16:55:4227pub enum Json {
28 Number(float),
29 String(~str),
Ben Striegela605fd02012-08-11 14:08:4230 Boolean(bool),
Erick Tryzelaar49d00b22012-09-24 16:55:4231 List(List),
32 Object(~Object),
Ben Striegela605fd02012-08-11 14:08:4233 Null,
Elly Jonesbd726262011-11-07 19:01:2834}
35
Erick Tryzelaar49d00b22012-09-24 16:55:4236pub type List = ~[Json];
Daniel Micaycc148b52013-04-03 13:28:3637pub type Object = HashMap<~str, Json>;
Erick Tryzelaar49d00b22012-09-24 16:55:4238
Andrew Paseltiner45677ee2013-03-22 20:09:2039#[deriving(Eq)]
Erick Tryzelaar49d00b22012-09-24 16:55:4240pub struct Error {
Erick Tryzelaar012dec52012-02-26 00:39:3241 line: uint,
42 col: uint,
Michael Sullivan92743dc2012-07-14 05:57:4843 msg: @~str,
Kevin Cantud47cb102012-08-30 23:39:5644}
45
Kevin Cantuc43426e2012-09-13 05:09:5546fn escape_str(s: &str) -> ~str {
Michael Sullivan92743dc2012-07-14 05:57:4847 let mut escaped = ~"\"";
Erick Tryzelaarcefecd82013-03-13 18:29:0548 for str::each_char(s) |c| {
Brian Andersonecaf9e32012-08-06 19:34:0849 match c {
Brian Anderson025d8662012-08-04 02:59:0450 '"' => escaped += ~"\\\"",
51 '\\' => escaped += ~"\\\\",
52 '\x08' => escaped += ~"\\b",
53 '\x0c' => escaped += ~"\\f",
54 '\n' => escaped += ~"\\n",
55 '\r' => escaped += ~"\\r",
56 '\t' => escaped += ~"\\t",
57 _ => escaped += str::from_char(c)
Erick Tryzelaarb361f6c2012-06-13 00:20:5158 }
59 };
60
Michael Sullivan92743dc2012-07-14 05:57:4861 escaped += ~"\"";
Erick Tryzelaarb361f6c2012-06-13 00:20:5162
63 escaped
64}
65
Erick Tryzelaar49d00b22012-09-24 16:55:4266fn spaces(n: uint) -> ~str {
67 let mut ss = ~"";
Tim Chevalier5a8ba072012-10-11 21:12:5068 for n.times { str::push_str(&mut ss, " "); }
Erick Tryzelaar49d00b22012-09-24 16:55:4269 return ss;
70}
71
Erick Tryzelaar8650c6f2012-12-18 03:31:0472pub struct Encoder {
Patrick Waltonb1c69982013-03-12 20:00:5073 priv wr: @io::Writer,
Erick Tryzelaar49d00b22012-09-24 16:55:4274}
75
Patrick Waltonb1c69982013-03-12 20:00:5076pub fn Encoder(wr: @io::Writer) -> Encoder {
Patrick Waltondc5df612013-05-02 00:54:5477 Encoder {
78 wr: wr
79 }
Erick Tryzelaar49d00b22012-09-24 16:55:4280}
81
Patrick Waltondc5df612013-05-02 00:54:5482impl serialize::Encoder for Encoder {
83 fn emit_nil(&mut self) { self.wr.write_str("null") }
84
85 fn emit_uint(&mut self, v: uint) { self.emit_float(v as float); }
86 fn emit_u64(&mut self, v: u64) { self.emit_float(v as float); }
87 fn emit_u32(&mut self, v: u32) { self.emit_float(v as float); }
88 fn emit_u16(&mut self, v: u16) { self.emit_float(v as float); }
89 fn emit_u8(&mut self, v: u8) { self.emit_float(v as float); }
90
91 fn emit_int(&mut self, v: int) { self.emit_float(v as float); }
92 fn emit_i64(&mut self, v: i64) { self.emit_float(v as float); }
93 fn emit_i32(&mut self, v: i32) { self.emit_float(v as float); }
94 fn emit_i16(&mut self, v: i16) { self.emit_float(v as float); }
95 fn emit_i8(&mut self, v: i8) { self.emit_float(v as float); }
96
97 fn emit_bool(&mut self, v: bool) {
98 if v {
99 self.wr.write_str("true");
100 } else {
101 self.wr.write_str("false");
102 }
103 }
104
105 fn emit_f64(&mut self, v: f64) { self.emit_float(v as float); }
106 fn emit_f32(&mut self, v: f32) { self.emit_float(v as float); }
107 fn emit_float(&mut self, v: float) {
108 self.wr.write_str(float::to_str_digits(v, 6u));
109 }
110
111 fn emit_char(&mut self, v: char) { self.emit_str(str::from_char(v)) }
112 fn emit_str(&mut self, v: &str) { self.wr.write_str(escape_str(v)) }
113
114 fn emit_enum(&mut self, _name: &str, f: &fn(&mut Encoder)) { f(self) }
115
116 fn emit_enum_variant(&mut self,
117 name: &str,
118 _id: uint,
119 cnt: uint,
120 f: &fn(&mut Encoder)) {
121 // enums are encoded as strings or vectors:
122 // Bunny => "Bunny"
123 // Kangaroo(34,"William") => ["Kangaroo",[34,"William"]]
124
125 if cnt == 0 {
126 self.wr.write_str(escape_str(name));
127 } else {
128 self.wr.write_char('[');
129 self.wr.write_str(escape_str(name));
130 self.wr.write_char(',');
131 f(self);
132 self.wr.write_char(']');
133 }
134 }
135
136 fn emit_enum_variant_arg(&mut self, idx: uint, f: &fn(&mut Encoder)) {
137 if idx != 0 {
138 self.wr.write_char(',');
139 }
140 f(self);
141 }
142
143 fn emit_enum_struct_variant(&mut self,
144 name: &str,
145 id: uint,
146 cnt: uint,
147 f: &fn(&mut Encoder)) {
148 self.emit_enum_variant(name, id, cnt, f)
149 }
150
151 fn emit_enum_struct_variant_field(&mut self,
152 _: &str,
153 idx: uint,
154 f: &fn(&mut Encoder)) {
155 self.emit_enum_variant_arg(idx, f)
156 }
157
158 fn emit_struct(&mut self, _: &str, _: uint, f: &fn(&mut Encoder)) {
159 self.wr.write_char('{');
160 f(self);
161 self.wr.write_char('}');
162 }
163
164 fn emit_struct_field(&mut self,
165 name: &str,
166 idx: uint,
167 f: &fn(&mut Encoder)) {
168 if idx != 0 { self.wr.write_char(','); }
169 self.wr.write_str(escape_str(name));
170 self.wr.write_char(':');
171 f(self);
172 }
173
174 fn emit_tuple(&mut self, len: uint, f: &fn(&mut Encoder)) {
175 self.emit_seq(len, f)
176 }
177 fn emit_tuple_arg(&mut self, idx: uint, f: &fn(&mut Encoder)) {
178 self.emit_seq_elt(idx, f)
179 }
180
181 fn emit_tuple_struct(&mut self,
182 _name: &str,
183 len: uint,
184 f: &fn(&mut Encoder)) {
185 self.emit_seq(len, f)
186 }
187 fn emit_tuple_struct_arg(&mut self, idx: uint, f: &fn(&mut Encoder)) {
188 self.emit_seq_elt(idx, f)
189 }
190
191 fn emit_option(&mut self, f: &fn(&mut Encoder)) { f(self); }
192 fn emit_option_none(&mut self) { self.emit_nil(); }
193 fn emit_option_some(&mut self, f: &fn(&mut Encoder)) { f(self); }
194
195 fn emit_seq(&mut self, _len: uint, f: &fn(&mut Encoder)) {
196 self.wr.write_char('[');
197 f(self);
198 self.wr.write_char(']');
199 }
200
201 fn emit_seq_elt(&mut self, idx: uint, f: &fn(&mut Encoder)) {
202 if idx != 0 {
203 self.wr.write_char(',');
204 }
205 f(self)
206 }
207
208 fn emit_map(&mut self, _len: uint, f: &fn(&mut Encoder)) {
209 self.wr.write_char('{');
210 f(self);
211 self.wr.write_char('}');
212 }
213
214 fn emit_map_elt_key(&mut self, idx: uint, f: &fn(&mut Encoder)) {
215 if idx != 0 { self.wr.write_char(','); }
216 f(self)
217 }
218
219 fn emit_map_elt_val(&mut self, _idx: uint, f: &fn(&mut Encoder)) {
220 self.wr.write_char(':');
221 f(self)
222 }
223}
224
Patrick Waltonc7522412013-05-04 00:55:53225pub struct PrettyEncoder {
226 priv wr: @io::Writer,
227 priv indent: uint,
228}
229
Patrick Waltonb1c69982013-03-12 20:00:50230pub fn PrettyEncoder(wr: @io::Writer) -> PrettyEncoder {
Patrick Waltondc5df612013-05-02 00:54:54231 PrettyEncoder {
232 wr: wr,
233 indent: 0,
234 }
Erick Tryzelaar49d00b22012-09-24 16:55:42235}
236
Patrick Waltondc5df612013-05-02 00:54:54237impl serialize::Encoder for PrettyEncoder {
238 fn emit_nil(&mut self) { self.wr.write_str("null") }
239
240 fn emit_uint(&mut self, v: uint) { self.emit_float(v as float); }
241 fn emit_u64(&mut self, v: u64) { self.emit_float(v as float); }
242 fn emit_u32(&mut self, v: u32) { self.emit_float(v as float); }
243 fn emit_u16(&mut self, v: u16) { self.emit_float(v as float); }
244 fn emit_u8(&mut self, v: u8) { self.emit_float(v as float); }
245
246 fn emit_int(&mut self, v: int) { self.emit_float(v as float); }
247 fn emit_i64(&mut self, v: i64) { self.emit_float(v as float); }
248 fn emit_i32(&mut self, v: i32) { self.emit_float(v as float); }
249 fn emit_i16(&mut self, v: i16) { self.emit_float(v as float); }
250 fn emit_i8(&mut self, v: i8) { self.emit_float(v as float); }
251
252 fn emit_bool(&mut self, v: bool) {
253 if v {
254 self.wr.write_str("true");
255 } else {
256 self.wr.write_str("false");
257 }
258 }
259
260 fn emit_f64(&mut self, v: f64) { self.emit_float(v as float); }
261 fn emit_f32(&mut self, v: f32) { self.emit_float(v as float); }
262 fn emit_float(&mut self, v: float) {
263 self.wr.write_str(float::to_str_digits(v, 6u));
264 }
265
266 fn emit_char(&mut self, v: char) { self.emit_str(str::from_char(v)) }
267 fn emit_str(&mut self, v: &str) { self.wr.write_str(escape_str(v)); }
268
269 fn emit_enum(&mut self, _name: &str, f: &fn(&mut PrettyEncoder)) {
270 f(self)
271 }
272
273 fn emit_enum_variant(&mut self,
274 name: &str,
275 _: uint,
276 cnt: uint,
277 f: &fn(&mut PrettyEncoder)) {
278 if cnt == 0 {
279 self.wr.write_str(escape_str(name));
280 } else {
281 self.wr.write_char('[');
282 self.indent += 2;
283 self.wr.write_char('\n');
284 self.wr.write_str(spaces(self.indent));
285 self.wr.write_str(escape_str(name));
286 self.wr.write_str(",\n");
287 f(self);
288 self.wr.write_char('\n');
289 self.indent -= 2;
290 self.wr.write_str(spaces(self.indent));
291 self.wr.write_char(']');
292 }
293 }
294
295 fn emit_enum_variant_arg(&mut self,
296 idx: uint,
297 f: &fn(&mut PrettyEncoder)) {
298 if idx != 0 {
299 self.wr.write_str(",\n");
300 }
301 self.wr.write_str(spaces(self.indent));
302 f(self)
303 }
304
305 fn emit_enum_struct_variant(&mut self,
306 name: &str,
307 id: uint,
308 cnt: uint,
309 f: &fn(&mut PrettyEncoder)) {
310 self.emit_enum_variant(name, id, cnt, f)
311 }
312
313 fn emit_enum_struct_variant_field(&mut self,
314 _: &str,
315 idx: uint,
316 f: &fn(&mut PrettyEncoder)) {
317 self.emit_enum_variant_arg(idx, f)
318 }
319
320
321 fn emit_struct(&mut self,
322 _: &str,
323 len: uint,
324 f: &fn(&mut PrettyEncoder)) {
325 if len == 0 {
326 self.wr.write_str("{}");
327 } else {
328 self.wr.write_char('{');
329 self.indent += 2;
330 f(self);
331 self.wr.write_char('\n');
332 self.indent -= 2;
333 self.wr.write_str(spaces(self.indent));
334 self.wr.write_char('}');
335 }
336 }
337
338 fn emit_struct_field(&mut self,
339 name: &str,
340 idx: uint,
341 f: &fn(&mut PrettyEncoder)) {
342 if idx == 0 {
343 self.wr.write_char('\n');
344 } else {
345 self.wr.write_str(",\n");
346 }
347 self.wr.write_str(spaces(self.indent));
348 self.wr.write_str(escape_str(name));
349 self.wr.write_str(": ");
350 f(self);
351 }
352
353 fn emit_tuple(&mut self, len: uint, f: &fn(&mut PrettyEncoder)) {
354 self.emit_seq(len, f)
355 }
356 fn emit_tuple_arg(&mut self, idx: uint, f: &fn(&mut PrettyEncoder)) {
357 self.emit_seq_elt(idx, f)
358 }
359
360 fn emit_tuple_struct(&mut self,
361 _: &str,
362 len: uint,
363 f: &fn(&mut PrettyEncoder)) {
364 self.emit_seq(len, f)
365 }
366 fn emit_tuple_struct_arg(&mut self,
367 idx: uint,
368 f: &fn(&mut PrettyEncoder)) {
369 self.emit_seq_elt(idx, f)
370 }
371
372 fn emit_option(&mut self, f: &fn(&mut PrettyEncoder)) { f(self); }
373 fn emit_option_none(&mut self) { self.emit_nil(); }
374 fn emit_option_some(&mut self, f: &fn(&mut PrettyEncoder)) { f(self); }
375
376 fn emit_seq(&mut self, len: uint, f: &fn(&mut PrettyEncoder)) {
377 if len == 0 {
378 self.wr.write_str("[]");
379 } else {
380 self.wr.write_char('[');
381 self.indent += 2;
382 f(self);
383 self.wr.write_char('\n');
384 self.indent -= 2;
385 self.wr.write_str(spaces(self.indent));
386 self.wr.write_char(']');
387 }
388 }
389
390 fn emit_seq_elt(&mut self, idx: uint, f: &fn(&mut PrettyEncoder)) {
391 if idx == 0 {
392 self.wr.write_char('\n');
393 } else {
394 self.wr.write_str(",\n");
395 }
396 self.wr.write_str(spaces(self.indent));
397 f(self)
398 }
399
400 fn emit_map(&mut self, len: uint, f: &fn(&mut PrettyEncoder)) {
401 if len == 0 {
402 self.wr.write_str("{}");
403 } else {
404 self.wr.write_char('{');
405 self.indent += 2;
406 f(self);
407 self.wr.write_char('\n');
408 self.indent -= 2;
409 self.wr.write_str(spaces(self.indent));
410 self.wr.write_char('}');
411 }
412 }
413
414 fn emit_map_elt_key(&mut self, idx: uint, f: &fn(&mut PrettyEncoder)) {
415 if idx == 0 {
416 self.wr.write_char('\n');
417 } else {
418 self.wr.write_str(",\n");
419 }
420 self.wr.write_str(spaces(self.indent));
421 f(self);
422 }
423
424 fn emit_map_elt_val(&mut self, _idx: uint, f: &fn(&mut PrettyEncoder)) {
425 self.wr.write_str(": ");
426 f(self);
427 }
428}
429
Patrick Waltondc5df612013-05-02 00:54:54430impl<E: serialize::Encoder> serialize::Encodable<E> for Json {
431 fn encode(&self, e: &mut E) {
432 match *self {
433 Number(v) => v.encode(e),
434 String(ref v) => v.encode(e),
435 Boolean(v) => v.encode(e),
436 List(ref v) => v.encode(e),
437 Object(ref v) => v.encode(e),
438 Null => e.emit_nil(),
439 }
440 }
441}
442
Erick Tryzelaar8650c6f2012-12-18 03:31:04443/// Encodes a json value into a io::writer
Patrick Waltondc5df612013-05-02 00:54:54444pub fn to_writer(wr: @io::Writer, json: &Json) {
445 let mut encoder = Encoder(wr);
446 json.encode(&mut encoder)
Erick Tryzelaar49d00b22012-09-24 16:55:42447}
448
Erick Tryzelaar8650c6f2012-12-18 03:31:04449/// Encodes a json value into a string
Patrick Waltonc1084092013-03-22 04:34:30450pub fn to_str(json: &Json) -> ~str {
Alex Crichton255193c2013-04-08 20:50:34451 io::with_str_writer(|wr| to_writer(wr, json))
Elly Jonesbd726262011-11-07 19:01:28452}
453
Erick Tryzelaar8650c6f2012-12-18 03:31:04454/// Encodes a json value into a io::writer
Patrick Waltondc5df612013-05-02 00:54:54455pub fn to_pretty_writer(wr: @io::Writer, json: &Json) {
456 let mut encoder = PrettyEncoder(wr);
457 json.encode(&mut encoder)
Kevin Cantud47cb102012-08-30 23:39:56458}
459
Erick Tryzelaar8650c6f2012-12-18 03:31:04460/// Encodes a json value into a string
Erick Tryzelaar49d00b22012-09-24 16:55:42461pub fn to_pretty_str(json: &Json) -> ~str {
462 io::with_str_writer(|wr| to_pretty_writer(wr, json))
Patrick Waltondb020ab2012-07-11 22:00:40463}
464
Erick Tryzelaar49d00b22012-09-24 16:55:42465pub struct Parser {
Patrick Waltonb1c69982013-03-12 20:00:50466 priv rdr: @io::Reader,
Alex Crichton3136fba2013-03-24 16:41:19467 priv ch: char,
468 priv line: uint,
469 priv col: uint,
Erick Tryzelaar49d00b22012-09-24 16:55:42470}
471
Erick Tryzelaar8650c6f2012-12-18 03:31:04472/// Decode a json value from an io::reader
Patrick Waltonb1c69982013-03-12 20:00:50473pub fn Parser(rdr: @io::Reader) -> Parser {
Erick Tryzelaar49d00b22012-09-24 16:55:42474 Parser {
475 rdr: rdr,
476 ch: rdr.read_char(),
Tim Chevalier90d06b82012-09-19 05:35:42477 line: 1,
478 col: 1,
Erick Tryzelaar49d00b22012-09-24 16:55:42479 }
480}
481
482pub impl Parser {
Alex Crichton3136fba2013-03-24 16:41:19483 fn parse(&mut self) -> Result<Json, Error> {
Luqman Aden4cf51c22013-02-15 07:30:30484 match self.parse_value() {
485 Ok(value) => {
Erick Tryzelaar49d00b22012-09-24 16:55:42486 // Skip trailing whitespaces.
487 self.parse_whitespace();
488 // Make sure there is no trailing characters.
489 if self.eof() {
Luqman Aden4cf51c22013-02-15 07:30:30490 Ok(value)
Erick Tryzelaar49d00b22012-09-24 16:55:42491 } else {
492 self.error(~"trailing characters")
493 }
494 }
Luqman Aden4cf51c22013-02-15 07:30:30495 Err(e) => Err(e)
Erick Tryzelaar49d00b22012-09-24 16:55:42496 }
497 }
498}
499
500priv impl Parser {
Ben Striegel0fed29c2013-03-08 02:11:09501 fn eof(&self) -> bool { self.ch == -1 as char }
Elly Jonesbd726262011-11-07 19:01:28502
Alex Crichton3136fba2013-03-24 16:41:19503 fn bump(&mut self) {
Erick Tryzelaar012dec52012-02-26 00:39:32504 self.ch = self.rdr.read_char();
505
506 if self.ch == '\n' {
507 self.line += 1u;
508 self.col = 1u;
509 } else {
510 self.col += 1u;
511 }
Elly Jonesbd726262011-11-07 19:01:28512 }
513
Alex Crichton3136fba2013-03-24 16:41:19514 fn next_char(&mut self) -> char {
Erick Tryzelaar012dec52012-02-26 00:39:32515 self.bump();
516 self.ch
Elly Jonesbd726262011-11-07 19:01:28517 }
518
Ben Striegel0fed29c2013-03-08 02:11:09519 fn error<T>(&self, msg: ~str) -> Result<T, Error> {
Erick Tryzelaar49d00b22012-09-24 16:55:42520 Err(Error { line: self.line, col: self.col, msg: @msg })
Elly Jonesbd726262011-11-07 19:01:28521 }
Elly Jonesbd726262011-11-07 19:01:28522
Alex Crichton3136fba2013-03-24 16:41:19523 fn parse_value(&mut self) -> Result<Json, Error> {
Erick Tryzelaar012dec52012-02-26 00:39:32524 self.parse_whitespace();
Elly Jonesbd726262011-11-07 19:01:28525
Brian Andersonb3559362012-08-02 00:30:05526 if self.eof() { return self.error(~"EOF while parsing value"); }
Erick Tryzelaar012dec52012-02-26 00:39:32527
Brian Andersonecaf9e32012-08-06 19:34:08528 match self.ch {
Alex Crichton82fa0012013-05-19 05:07:44529 'n' => self.parse_ident("ull", Null),
530 't' => self.parse_ident("rue", Boolean(true)),
531 'f' => self.parse_ident("alse", Boolean(false)),
Brian Anderson80c4f742012-09-02 01:38:05532 '0' .. '9' | '-' => self.parse_number(),
Erick Tryzelaar49d00b22012-09-24 16:55:42533 '"' =>
Luqman Aden4cf51c22013-02-15 07:30:30534 match self.parse_str() {
535 Ok(s) => Ok(String(s)),
536 Err(e) => Err(e),
Erick Tryzelaar49d00b22012-09-24 16:55:42537 },
Brian Anderson025d8662012-08-04 02:59:04538 '[' => self.parse_list(),
539 '{' => self.parse_object(),
540 _ => self.error(~"invalid syntax")
Erick Tryzelaar012dec52012-02-26 00:39:32541 }
542 }
543
Alex Crichton3136fba2013-03-24 16:41:19544 fn parse_whitespace(&mut self) {
Erick Tryzelaar012dec52012-02-26 00:39:32545 while char::is_whitespace(self.ch) { self.bump(); }
546 }
547
Alex Crichton3136fba2013-03-24 16:41:19548 fn parse_ident(&mut self, ident: &str, value: Json) -> Result<Json, Error> {
Brian Andersond1fc2b52012-06-30 23:19:07549 if str::all(ident, |c| c == self.next_char()) {
Erick Tryzelaar012dec52012-02-26 00:39:32550 self.bump();
Luqman Aden4cf51c22013-02-15 07:30:30551 Ok(value)
Erick Tryzelaar012dec52012-02-26 00:39:32552 } else {
Michael Sullivan92743dc2012-07-14 05:57:48553 self.error(~"invalid syntax")
Erick Tryzelaar012dec52012-02-26 00:39:32554 }
555 }
556
Alex Crichton3136fba2013-03-24 16:41:19557 fn parse_number(&mut self) -> Result<Json, Error> {
Niko Matsakis6b358752012-03-14 18:03:56558 let mut neg = 1f;
Erick Tryzelaar012dec52012-02-26 00:39:32559
560 if self.ch == '-' {
561 self.bump();
Marijn Haverbeke4f826d82011-12-16 09:11:00562 neg = -1f;
Elly Jonesbd726262011-11-07 19:01:28563 }
Elly Jonesbd726262011-11-07 19:01:28564
Brian Andersonecaf9e32012-08-06 19:34:08565 let mut res = match self.parse_integer() {
Brian Anderson0c6e4702012-08-26 23:54:31566 Ok(res) => res,
567 Err(e) => return Err(e)
Erick Tryzelaar012dec52012-02-26 00:39:32568 };
569
570 if self.ch == '.' {
Brian Andersonecaf9e32012-08-06 19:34:08571 match self.parse_decimal(res) {
Brian Anderson0c6e4702012-08-26 23:54:31572 Ok(r) => res = r,
573 Err(e) => return Err(e)
Elly Jonesbd726262011-11-07 19:01:28574 }
Elly Jonesbd726262011-11-07 19:01:28575 }
Erick Tryzelaar012dec52012-02-26 00:39:32576
577 if self.ch == 'e' || self.ch == 'E' {
Brian Andersonecaf9e32012-08-06 19:34:08578 match self.parse_exponent(res) {
Brian Anderson0c6e4702012-08-26 23:54:31579 Ok(r) => res = r,
580 Err(e) => return Err(e)
Erick Tryzelaar012dec52012-02-26 00:39:32581 }
582 }
583
Erick Tryzelaar49d00b22012-09-24 16:55:42584 Ok(Number(neg * res))
Elly Jonesbd726262011-11-07 19:01:28585 }
586
Alex Crichton3136fba2013-03-24 16:41:19587 fn parse_integer(&mut self) -> Result<float, Error> {
Niko Matsakis6b358752012-03-14 18:03:56588 let mut res = 0f;
Erick Tryzelaar012dec52012-02-26 00:39:32589
Brian Andersonecaf9e32012-08-06 19:34:08590 match self.ch {
Brian Anderson025d8662012-08-04 02:59:04591 '0' => {
Erick Tryzelaar012dec52012-02-26 00:39:32592 self.bump();
593
594 // There can be only one leading '0'.
Brian Andersonecaf9e32012-08-06 19:34:08595 match self.ch {
Brian Anderson80c4f742012-09-02 01:38:05596 '0' .. '9' => return self.error(~"invalid number"),
Brian Anderson025d8662012-08-04 02:59:04597 _ => ()
Erick Tryzelaar012dec52012-02-26 00:39:32598 }
599 }
Brian Anderson80c4f742012-09-02 01:38:05600 '1' .. '9' => {
Erick Tryzelaar012dec52012-02-26 00:39:32601 while !self.eof() {
Brian Andersonecaf9e32012-08-06 19:34:08602 match self.ch {
Brian Anderson80c4f742012-09-02 01:38:05603 '0' .. '9' => {
Erick Tryzelaar012dec52012-02-26 00:39:32604 res *= 10f;
605 res += ((self.ch as int) - ('0' as int)) as float;
606
607 self.bump();
608 }
Brian Anderson025d8662012-08-04 02:59:04609 _ => break
Erick Tryzelaar012dec52012-02-26 00:39:32610 }
611 }
612 }
Brian Anderson025d8662012-08-04 02:59:04613 _ => return self.error(~"invalid number")
Erick Tryzelaar012dec52012-02-26 00:39:32614 }
615
Brian Anderson0c6e4702012-08-26 23:54:31616 Ok(res)
Elly Jonesbd726262011-11-07 19:01:28617 }
618
Alex Crichton3136fba2013-03-24 16:41:19619 fn parse_decimal(&mut self, res: float) -> Result<float, Error> {
Erick Tryzelaar012dec52012-02-26 00:39:32620 self.bump();
621
622 // Make sure a digit follows the decimal place.
Brian Andersonecaf9e32012-08-06 19:34:08623 match self.ch {
Brian Anderson80c4f742012-09-02 01:38:05624 '0' .. '9' => (),
Brian Anderson025d8662012-08-04 02:59:04625 _ => return self.error(~"invalid number")
Erick Tryzelaar012dec52012-02-26 00:39:32626 }
627
Niko Matsakis6b358752012-03-14 18:03:56628 let mut res = res;
629 let mut dec = 1f;
Erick Tryzelaar012dec52012-02-26 00:39:32630 while !self.eof() {
Brian Andersonecaf9e32012-08-06 19:34:08631 match self.ch {
Brian Anderson80c4f742012-09-02 01:38:05632 '0' .. '9' => {
Marijn Haverbeke4f826d82011-12-16 09:11:00633 dec /= 10f;
Erick Tryzelaar012dec52012-02-26 00:39:32634 res += (((self.ch as int) - ('0' as int)) as float) * dec;
635
636 self.bump();
637 }
Brian Anderson025d8662012-08-04 02:59:04638 _ => break
Elly Jonesbd726262011-11-07 19:01:28639 }
Elly Jonesbd726262011-11-07 19:01:28640 }
Elly Jonesbd726262011-11-07 19:01:28641
Brian Anderson0c6e4702012-08-26 23:54:31642 Ok(res)
Erick Tryzelaar012dec52012-02-26 00:39:32643 }
644
Alex Crichton3136fba2013-03-24 16:41:19645 fn parse_exponent(&mut self, mut res: float) -> Result<float, Error> {
Erick Tryzelaar012dec52012-02-26 00:39:32646 self.bump();
647
Niko Matsakis6b358752012-03-14 18:03:56648 let mut exp = 0u;
649 let mut neg_exp = false;
Erick Tryzelaar012dec52012-02-26 00:39:32650
Brian Andersonecaf9e32012-08-06 19:34:08651 match self.ch {
Brian Anderson025d8662012-08-04 02:59:04652 '+' => self.bump(),
653 '-' => { self.bump(); neg_exp = true; }
654 _ => ()
Erick Tryzelaar012dec52012-02-26 00:39:32655 }
656
657 // Make sure a digit follows the exponent place.
Brian Andersonecaf9e32012-08-06 19:34:08658 match self.ch {
Brian Anderson80c4f742012-09-02 01:38:05659 '0' .. '9' => (),
Brian Anderson025d8662012-08-04 02:59:04660 _ => return self.error(~"invalid number")
Erick Tryzelaar012dec52012-02-26 00:39:32661 }
662
663 while !self.eof() {
Brian Andersonecaf9e32012-08-06 19:34:08664 match self.ch {
Brian Anderson80c4f742012-09-02 01:38:05665 '0' .. '9' => {
Erick Tryzelaar012dec52012-02-26 00:39:32666 exp *= 10u;
667 exp += (self.ch as uint) - ('0' as uint);
668
669 self.bump();
670 }
Brian Anderson025d8662012-08-04 02:59:04671 _ => break
Erick Tryzelaar012dec52012-02-26 00:39:32672 }
673 }
674
675 let exp = float::pow_with_uint(10u, exp);
676 if neg_exp {
677 res /= exp;
678 } else {
679 res *= exp;
680 }
681
Brian Anderson0c6e4702012-08-26 23:54:31682 Ok(res)
Erick Tryzelaar012dec52012-02-26 00:39:32683 }
684
Alex Crichton3136fba2013-03-24 16:41:19685 fn parse_str(&mut self) -> Result<~str, Error> {
Niko Matsakis6b358752012-03-14 18:03:56686 let mut escape = false;
Michael Sullivan92743dc2012-07-14 05:57:48687 let mut res = ~"";
Erick Tryzelaar012dec52012-02-26 00:39:32688
689 while !self.eof() {
690 self.bump();
691
692 if (escape) {
Brian Andersonecaf9e32012-08-06 19:34:08693 match self.ch {
Tim Chevalier5a8ba072012-10-11 21:12:50694 '"' => str::push_char(&mut res, '"'),
695 '\\' => str::push_char(&mut res, '\\'),
696 '/' => str::push_char(&mut res, '/'),
697 'b' => str::push_char(&mut res, '\x08'),
698 'f' => str::push_char(&mut res, '\x0c'),
699 'n' => str::push_char(&mut res, '\n'),
700 'r' => str::push_char(&mut res, '\r'),
701 't' => str::push_char(&mut res, '\t'),
Brian Anderson025d8662012-08-04 02:59:04702 'u' => {
Erick Tryzelaar012dec52012-02-26 00:39:32703 // Parse \u1234.
Niko Matsakis6b358752012-03-14 18:03:56704 let mut i = 0u;
705 let mut n = 0u;
Erick Tryzelaar012dec52012-02-26 00:39:32706 while i < 4u {
Brian Andersonecaf9e32012-08-06 19:34:08707 match self.next_char() {
Brian Anderson80c4f742012-09-02 01:38:05708 '0' .. '9' => {
Kevin Cantu4fb675b2012-08-31 03:12:10709 n = n * 16u + (self.ch as uint)
710 - ('0' as uint);
711 },
712 'a' | 'A' => n = n * 16u + 10u,
713 'b' | 'B' => n = n * 16u + 11u,
714 'c' | 'C' => n = n * 16u + 12u,
715 'd' | 'D' => n = n * 16u + 13u,
716 'e' | 'E' => n = n * 16u + 14u,
717 'f' | 'F' => n = n * 16u + 15u,
718 _ => return self.error(
719 ~"invalid \\u escape (unrecognized hex)")
Erick Tryzelaar012dec52012-02-26 00:39:32720 }
Niko Matsakis6b358752012-03-14 18:03:56721 i += 1u;
Erick Tryzelaar012dec52012-02-26 00:39:32722 }
723
724 // Error out if we didn't parse 4 digits.
725 if i != 4u {
Kevin Cantu4fb675b2012-08-31 03:12:10726 return self.error(
727 ~"invalid \\u escape (not four digits)");
Erick Tryzelaar012dec52012-02-26 00:39:32728 }
729
Tim Chevalier5a8ba072012-10-11 21:12:50730 str::push_char(&mut res, n as char);
Erick Tryzelaar012dec52012-02-26 00:39:32731 }
Brian Anderson025d8662012-08-04 02:59:04732 _ => return self.error(~"invalid escape")
Erick Tryzelaar012dec52012-02-26 00:39:32733 }
734 escape = false;
735 } else if self.ch == '\\' {
736 escape = true;
737 } else {
738 if self.ch == '"' {
739 self.bump();
Erick Tryzelaar49d00b22012-09-24 16:55:42740 return Ok(res);
Erick Tryzelaar012dec52012-02-26 00:39:32741 }
Tim Chevalier5a8ba072012-10-11 21:12:50742 str::push_char(&mut res, self.ch);
Erick Tryzelaar012dec52012-02-26 00:39:32743 }
744 }
745
Michael Sullivan92743dc2012-07-14 05:57:48746 self.error(~"EOF while parsing string")
Erick Tryzelaar012dec52012-02-26 00:39:32747 }
748
Alex Crichton3136fba2013-03-24 16:41:19749 fn parse_list(&mut self) -> Result<Json, Error> {
Erick Tryzelaar012dec52012-02-26 00:39:32750 self.bump();
751 self.parse_whitespace();
752
Michael Sullivan98e161f2012-06-29 23:26:56753 let mut values = ~[];
Erick Tryzelaar012dec52012-02-26 00:39:32754
755 if self.ch == ']' {
756 self.bump();
Luqman Aden4cf51c22013-02-15 07:30:30757 return Ok(List(values));
Erick Tryzelaar012dec52012-02-26 00:39:32758 }
759
Tim Chevalier35400e12012-03-11 04:34:17760 loop {
Luqman Aden4cf51c22013-02-15 07:30:30761 match self.parse_value() {
762 Ok(v) => values.push(v),
763 Err(e) => return Err(e)
Erick Tryzelaar012dec52012-02-26 00:39:32764 }
765
766 self.parse_whitespace();
Tim Chevalier35400e12012-03-11 04:34:17767 if self.eof() {
Brian Andersonb3559362012-08-02 00:30:05768 return self.error(~"EOF while parsing list");
Tim Chevalier35400e12012-03-11 04:34:17769 }
Erick Tryzelaar012dec52012-02-26 00:39:32770
Brian Andersonecaf9e32012-08-06 19:34:08771 match self.ch {
Brian Anderson025d8662012-08-04 02:59:04772 ',' => self.bump(),
Luqman Aden4cf51c22013-02-15 07:30:30773 ']' => { self.bump(); return Ok(List(values)); }
Brian Anderson025d8662012-08-04 02:59:04774 _ => return self.error(~"expected `,` or `]`")
Erick Tryzelaar012dec52012-02-26 00:39:32775 }
Tim Chevalier35400e12012-03-11 04:34:17776 };
Erick Tryzelaar012dec52012-02-26 00:39:32777 }
778
Alex Crichton3136fba2013-03-24 16:41:19779 fn parse_object(&mut self) -> Result<Json, Error> {
Erick Tryzelaar012dec52012-02-26 00:39:32780 self.bump();
781 self.parse_whitespace();
782
Daniel Micaycc148b52013-04-03 13:28:36783 let mut values = ~HashMap::new();
Erick Tryzelaar012dec52012-02-26 00:39:32784
785 if self.ch == '}' {
786 self.bump();
Luqman Aden4cf51c22013-02-15 07:30:30787 return Ok(Object(values));
Erick Tryzelaar012dec52012-02-26 00:39:32788 }
789
790 while !self.eof() {
791 self.parse_whitespace();
792
793 if self.ch != '"' {
Brian Andersonb3559362012-08-02 00:30:05794 return self.error(~"key must be a string");
Erick Tryzelaar012dec52012-02-26 00:39:32795 }
796
Luqman Aden4cf51c22013-02-15 07:30:30797 let key = match self.parse_str() {
798 Ok(key) => key,
799 Err(e) => return Err(e)
Erick Tryzelaar012dec52012-02-26 00:39:32800 };
801
802 self.parse_whitespace();
803
804 if self.ch != ':' {
805 if self.eof() { break; }
Brian Andersonb3559362012-08-02 00:30:05806 return self.error(~"expected `:`");
Erick Tryzelaar012dec52012-02-26 00:39:32807 }
808 self.bump();
809
Luqman Aden4cf51c22013-02-15 07:30:30810 match self.parse_value() {
811 Ok(value) => { values.insert(key, value); }
812 Err(e) => return Err(e)
Erick Tryzelaar012dec52012-02-26 00:39:32813 }
814 self.parse_whitespace();
815
Brian Andersonecaf9e32012-08-06 19:34:08816 match self.ch {
Brian Anderson025d8662012-08-04 02:59:04817 ',' => self.bump(),
Luqman Aden4cf51c22013-02-15 07:30:30818 '}' => { self.bump(); return Ok(Object(values)); }
Brian Anderson025d8662012-08-04 02:59:04819 _ => {
Erick Tryzelaar012dec52012-02-26 00:39:32820 if self.eof() { break; }
Brian Andersonb3559362012-08-02 00:30:05821 return self.error(~"expected `,` or `}`");
Erick Tryzelaar012dec52012-02-26 00:39:32822 }
823 }
824 }
825
Brian Andersonb3559362012-08-02 00:30:05826 return self.error(~"EOF while parsing object");
Elly Jonesbd726262011-11-07 19:01:28827 }
828}
829
Patrick Waltonb1c69982013-03-12 20:00:50830/// Decodes a json value from an @io::Reader
831pub fn from_reader(rdr: @io::Reader) -> Result<Json, Error> {
Alex Crichton3136fba2013-03-24 16:41:19832 let mut parser = Parser(rdr);
833 parser.parse()
Elly Jonesbd726262011-11-07 19:01:28834}
835
Erick Tryzelaar8650c6f2012-12-18 03:31:04836/// Decodes a json value from a string
Erick Tryzelaar49d00b22012-09-24 16:55:42837pub fn from_str(s: &str) -> Result<Json, Error> {
838 do io::with_str_reader(s) |rdr| {
839 from_reader(rdr)
840 }
Erick Tryzelaar012dec52012-02-26 00:39:32841}
842
Patrick Waltonc7522412013-05-04 00:55:53843pub struct Decoder {
844 priv stack: ~[Json],
845}
846
Erick Tryzelaar8650c6f2012-12-18 03:31:04847pub fn Decoder(json: Json) -> Decoder {
Patrick Waltondc5df612013-05-02 00:54:54848 Decoder {
849 stack: ~[json]
850 }
Elly Jonesbd726262011-11-07 19:01:28851}
Brian Anderson6e27b272012-01-18 03:05:07852
Patrick Waltondc5df612013-05-02 00:54:54853impl serialize::Decoder for Decoder {
854 fn read_nil(&mut self) -> () {
855 debug!("read_nil");
856 match self.stack.pop() {
857 Null => (),
Björn Steinbrinkbdc182c2013-05-05 22:18:51858 value => fail!("not a null: %?", value)
Patrick Waltondc5df612013-05-02 00:54:54859 }
860 }
861
862 fn read_u64(&mut self) -> u64 { self.read_float() as u64 }
863 fn read_u32(&mut self) -> u32 { self.read_float() as u32 }
864 fn read_u16(&mut self) -> u16 { self.read_float() as u16 }
865 fn read_u8 (&mut self) -> u8 { self.read_float() as u8 }
866 fn read_uint(&mut self) -> uint { self.read_float() as uint }
867
868 fn read_i64(&mut self) -> i64 { self.read_float() as i64 }
869 fn read_i32(&mut self) -> i32 { self.read_float() as i32 }
870 fn read_i16(&mut self) -> i16 { self.read_float() as i16 }
871 fn read_i8 (&mut self) -> i8 { self.read_float() as i8 }
872 fn read_int(&mut self) -> int { self.read_float() as int }
873
874 fn read_bool(&mut self) -> bool {
875 debug!("read_bool");
876 match self.stack.pop() {
877 Boolean(b) => b,
Björn Steinbrinkbdc182c2013-05-05 22:18:51878 value => fail!("not a boolean: %?", value)
Patrick Waltondc5df612013-05-02 00:54:54879 }
880 }
881
882 fn read_f64(&mut self) -> f64 { self.read_float() as f64 }
883 fn read_f32(&mut self) -> f32 { self.read_float() as f32 }
884 fn read_float(&mut self) -> float {
885 debug!("read_float");
886 match self.stack.pop() {
887 Number(f) => f,
Björn Steinbrinkbdc182c2013-05-05 22:18:51888 value => fail!("not a number: %?", value)
Patrick Waltondc5df612013-05-02 00:54:54889 }
890 }
891
892 fn read_char(&mut self) -> char {
893 let mut v = ~[];
894 for str::each_char(self.read_str()) |c| { v.push(c) }
Björn Steinbrinkbdc182c2013-05-05 22:18:51895 if v.len() != 1 { fail!("string must have one character") }
Patrick Waltondc5df612013-05-02 00:54:54896 v[0]
897 }
898
899 fn read_str(&mut self) -> ~str {
900 debug!("read_str");
901 match self.stack.pop() {
902 String(s) => s,
Björn Steinbrinkbdc182c2013-05-05 22:18:51903 json => fail!("not a string: %?", json)
Patrick Waltondc5df612013-05-02 00:54:54904 }
905 }
906
907 fn read_enum<T>(&mut self, name: &str, f: &fn(&mut Decoder) -> T) -> T {
908 debug!("read_enum(%s)", name);
909 f(self)
910 }
911
912 fn read_enum_variant<T>(&mut self,
913 names: &[&str],
914 f: &fn(&mut Decoder, uint) -> T)
915 -> T {
916 debug!("read_enum_variant(names=%?)", names);
917 let name = match self.stack.pop() {
918 String(s) => s,
919 List(list) => {
920 do vec::consume_reverse(list) |_i, v| {
921 self.stack.push(v);
922 }
923 match self.stack.pop() {
924 String(s) => s,
Björn Steinbrinkbdc182c2013-05-05 22:18:51925 value => fail!("invalid variant name: %?", value),
Patrick Waltondc5df612013-05-02 00:54:54926 }
927 }
Björn Steinbrinkbdc182c2013-05-05 22:18:51928 ref json => fail!("invalid variant: %?", *json),
Patrick Waltondc5df612013-05-02 00:54:54929 };
930 let idx = match vec::position(names, |n| str::eq_slice(*n, name)) {
931 Some(idx) => idx,
Björn Steinbrinkbdc182c2013-05-05 22:18:51932 None => fail!("Unknown variant name: %?", name),
Patrick Waltondc5df612013-05-02 00:54:54933 };
934 f(self, idx)
935 }
936
937 fn read_enum_variant_arg<T>(&mut self,
938 idx: uint,
939 f: &fn(&mut Decoder) -> T)
940 -> T {
941 debug!("read_enum_variant_arg(idx=%u)", idx);
942 f(self)
943 }
944
945 fn read_enum_struct_variant<T>(&mut self,
946 names: &[&str],
947 f: &fn(&mut Decoder, uint) -> T)
948 -> T {
949 debug!("read_enum_struct_variant(names=%?)", names);
950 self.read_enum_variant(names, f)
951 }
952
953
954 fn read_enum_struct_variant_field<T>(&mut self,
955 name: &str,
956 idx: uint,
957 f: &fn(&mut Decoder) -> T)
958 -> T {
959 debug!("read_enum_struct_variant_field(name=%?, idx=%u)", name, idx);
960 self.read_enum_variant_arg(idx, f)
961 }
962
963 fn read_struct<T>(&mut self,
964 name: &str,
965 len: uint,
966 f: &fn(&mut Decoder) -> T)
967 -> T {
968 debug!("read_struct(name=%s, len=%u)", name, len);
969 let value = f(self);
970 self.stack.pop();
971 value
972 }
973
Patrick Waltondc5df612013-05-02 00:54:54974 fn read_struct_field<T>(&mut self,
975 name: &str,
976 idx: uint,
977 f: &fn(&mut Decoder) -> T)
978 -> T {
979 debug!("read_struct_field(name=%?, idx=%u)", name, idx);
980 match self.stack.pop() {
981 Object(obj) => {
982 let mut obj = obj;
983 let value = match obj.pop(&name.to_owned()) {
Björn Steinbrinkbdc182c2013-05-05 22:18:51984 None => fail!("no such field: %s", name),
Patrick Waltondc5df612013-05-02 00:54:54985 Some(json) => {
986 self.stack.push(json);
987 f(self)
988 }
989 };
990 self.stack.push(Object(obj));
991 value
992 }
Björn Steinbrinkbdc182c2013-05-05 22:18:51993 value => fail!("not an object: %?", value)
Patrick Waltondc5df612013-05-02 00:54:54994 }
995 }
996
997 fn read_tuple<T>(&mut self, f: &fn(&mut Decoder, uint) -> T) -> T {
998 debug!("read_tuple()");
999 self.read_seq(f)
1000 }
1001
1002 fn read_tuple_arg<T>(&mut self,
1003 idx: uint,
1004 f: &fn(&mut Decoder) -> T)
1005 -> T {
1006 debug!("read_tuple_arg(idx=%u)", idx);
1007 self.read_seq_elt(idx, f)
1008 }
1009
1010 fn read_tuple_struct<T>(&mut self,
1011 name: &str,
1012 f: &fn(&mut Decoder, uint) -> T)
1013 -> T {
1014 debug!("read_tuple_struct(name=%?)", name);
1015 self.read_tuple(f)
1016 }
1017
1018 fn read_tuple_struct_arg<T>(&mut self,
1019 idx: uint,
1020 f: &fn(&mut Decoder) -> T)
1021 -> T {
1022 debug!("read_tuple_struct_arg(idx=%u)", idx);
1023 self.read_tuple_arg(idx, f)
1024 }
1025
1026 fn read_option<T>(&mut self, f: &fn(&mut Decoder, bool) -> T) -> T {
1027 match self.stack.pop() {
1028 Null => f(self, false),
1029 value => { self.stack.push(value); f(self, true) }
1030 }
1031 }
1032
1033 fn read_seq<T>(&mut self, f: &fn(&mut Decoder, uint) -> T) -> T {
1034 debug!("read_seq()");
1035 let len = match self.stack.pop() {
1036 List(list) => {
1037 let len = list.len();
1038 do vec::consume_reverse(list) |_i, v| {
1039 self.stack.push(v);
1040 }
1041 len
1042 }
Björn Steinbrinkbdc182c2013-05-05 22:18:511043 _ => fail!("not a list"),
Patrick Waltondc5df612013-05-02 00:54:541044 };
1045 f(self, len)
1046 }
1047
1048 fn read_seq_elt<T>(&mut self, idx: uint, f: &fn(&mut Decoder) -> T) -> T {
1049 debug!("read_seq_elt(idx=%u)", idx);
1050 f(self)
1051 }
1052
1053 fn read_map<T>(&mut self, f: &fn(&mut Decoder, uint) -> T) -> T {
1054 debug!("read_map()");
1055 let len = match self.stack.pop() {
1056 Object(obj) => {
1057 let mut obj = obj;
1058 let len = obj.len();
1059 do obj.consume |key, value| {
1060 self.stack.push(value);
1061 self.stack.push(String(key));
1062 }
1063 len
1064 }
Björn Steinbrinkbdc182c2013-05-05 22:18:511065 json => fail!("not an object: %?", json),
Patrick Waltondc5df612013-05-02 00:54:541066 };
1067 f(self, len)
1068 }
1069
1070 fn read_map_elt_key<T>(&mut self,
1071 idx: uint,
1072 f: &fn(&mut Decoder) -> T)
1073 -> T {
1074 debug!("read_map_elt_key(idx=%u)", idx);
1075 f(self)
1076 }
1077
1078 fn read_map_elt_val<T>(&mut self, idx: uint, f: &fn(&mut Decoder) -> T)
1079 -> T {
1080 debug!("read_map_elt_val(idx=%u)", idx);
1081 f(self)
1082 }
1083}
1084
Patrick Walton91436882013-02-14 19:47:001085impl Eq for Json {
Patrick Waltonc1084092013-03-22 04:34:301086 fn eq(&self, other: &Json) -> bool {
Tim Chevalier3e7da962013-01-11 04:09:161087 match (self) {
1088 &Number(f0) =>
1089 match other { &Number(f1) => f0 == f1, _ => false },
1090 &String(ref s0) =>
1091 match other { &String(ref s1) => s0 == s1, _ => false },
1092 &Boolean(b0) =>
1093 match other { &Boolean(b1) => b0 == b1, _ => false },
1094 &Null =>
1095 match other { &Null => true, _ => false },
1096 &List(ref v0) =>
1097 match other { &List(ref v1) => v0 == v1, _ => false },
1098 &Object(ref d0) => {
1099 match other {
1100 &Object(ref d1) => {
Patrick Walton318e5342012-11-15 02:59:301101 if d0.len() == d1.len() {
1102 let mut equal = true;
Niko Matsakis5606fc02013-04-06 15:22:361103 for d0.each |k, v0| {
Daniel Micayee0a8c62013-01-23 16:47:431104 match d1.find(k) {
Patrick Walton318e5342012-11-15 02:59:301105 Some(v1) if v0 == v1 => { },
1106 _ => { equal = false; break }
1107 }
1108 };
1109 equal
1110 } else {
1111 false
1112 }
1113 }
1114 _ => false
1115 }
1116 }
1117 }
1118 }
Patrick Waltonc1084092013-03-22 04:34:301119 fn ne(&self, other: &Json) -> bool { !self.eq(other) }
Erick Tryzelaar49d00b22012-09-24 16:55:421120}
1121
Patrick Walton22b87572012-09-08 01:53:141122/// Test if two json values are less than one another
Patrick Walton91436882013-02-14 19:47:001123impl Ord for Json {
Patrick Waltonc1084092013-03-22 04:34:301124 fn lt(&self, other: &Json) -> bool {
Patrick Walton318e5342012-11-15 02:59:301125 match (*self) {
1126 Number(f0) => {
1127 match *other {
1128 Number(f1) => f0 < f1,
1129 String(_) | Boolean(_) | List(_) | Object(_) |
1130 Null => true
1131 }
1132 }
1133
1134 String(ref s0) => {
1135 match *other {
1136 Number(_) => false,
1137 String(ref s1) => s0 < s1,
1138 Boolean(_) | List(_) | Object(_) | Null => true
1139 }
1140 }
1141
1142 Boolean(b0) => {
1143 match *other {
1144 Number(_) | String(_) => false,
1145 Boolean(b1) => b0 < b1,
1146 List(_) | Object(_) | Null => true
1147 }
1148 }
1149
Patrick Walton98fdcb02012-12-08 03:34:571150 List(ref l0) => {
Patrick Walton318e5342012-11-15 02:59:301151 match *other {
1152 Number(_) | String(_) | Boolean(_) => false,
Patrick Walton98fdcb02012-12-08 03:34:571153 List(ref l1) => (*l0) < (*l1),
Patrick Walton318e5342012-11-15 02:59:301154 Object(_) | Null => true
1155 }
1156 }
1157
1158 Object(ref d0) => {
1159 match *other {
1160 Number(_) | String(_) | Boolean(_) | List(_) => false,
1161 Object(ref d1) => {
Alex Crichton255193c2013-04-08 20:50:341162 let mut d0_flat = ~[];
1163 let mut d1_flat = ~[];
Patrick Walton318e5342012-11-15 02:59:301164
Alex Crichton255193c2013-04-08 20:50:341165 // FIXME #4430: this is horribly inefficient...
Niko Matsakis5606fc02013-04-06 15:22:361166 for d0.each |k, v| {
Alex Crichton255193c2013-04-08 20:50:341167 d0_flat.push((@copy *k, @copy *v));
Patrick Walton318e5342012-11-15 02:59:301168 }
Alex Crichton255193c2013-04-08 20:50:341169 d0_flat.qsort();
1170
Niko Matsakis5606fc02013-04-06 15:22:361171 for d1.each |k, v| {
Alex Crichton255193c2013-04-08 20:50:341172 d1_flat.push((@copy *k, @copy *v));
1173 }
1174 d1_flat.qsort();
1175
1176 d0_flat < d1_flat
Patrick Walton318e5342012-11-15 02:59:301177 }
1178 Null => true
1179 }
1180 }
1181
1182 Null => {
1183 match *other {
1184 Number(_) | String(_) | Boolean(_) | List(_) |
1185 Object(_) =>
1186 false,
1187 Null => true
1188 }
1189 }
1190 }
1191 }
Patrick Waltonc1084092013-03-22 04:34:301192 fn le(&self, other: &Json) -> bool { !(*other).lt(&(*self)) }
1193 fn ge(&self, other: &Json) -> bool { !(*self).lt(other) }
1194 fn gt(&self, other: &Json) -> bool { (*other).lt(&(*self)) }
Patrick Walton22b87572012-09-08 01:53:141195}
1196
Ben Striegel0fed29c2013-03-08 02:11:091197trait ToJson { fn to_json(&self) -> Json; }
Erick Tryzelaared5af702012-05-28 19:10:321198
Patrick Walton91436882013-02-14 19:47:001199impl ToJson for Json {
Ben Striegel0fed29c2013-03-08 02:11:091200 fn to_json(&self) -> Json { copy *self }
Erick Tryzelaared5af702012-05-28 19:10:321201}
1202
Patrick Walton91436882013-02-14 19:47:001203impl ToJson for @Json {
Ben Striegel0fed29c2013-03-08 02:11:091204 fn to_json(&self) -> Json { (**self).to_json() }
Erick Tryzelaar11a56c32012-06-13 15:30:541205}
1206
Patrick Walton91436882013-02-14 19:47:001207impl ToJson for int {
Ben Striegel0fed29c2013-03-08 02:11:091208 fn to_json(&self) -> Json { Number(*self as float) }
Erick Tryzelaar11a56c32012-06-13 15:30:541209}
1210
Patrick Walton91436882013-02-14 19:47:001211impl ToJson for i8 {
Ben Striegel0fed29c2013-03-08 02:11:091212 fn to_json(&self) -> Json { Number(*self as float) }
Erick Tryzelaared5af702012-05-28 19:10:321213}
1214
Patrick Walton91436882013-02-14 19:47:001215impl ToJson for i16 {
Ben Striegel0fed29c2013-03-08 02:11:091216 fn to_json(&self) -> Json { Number(*self as float) }
Erick Tryzelaared5af702012-05-28 19:10:321217}
1218
Patrick Walton91436882013-02-14 19:47:001219impl ToJson for i32 {
Ben Striegel0fed29c2013-03-08 02:11:091220 fn to_json(&self) -> Json { Number(*self as float) }
Erick Tryzelaared5af702012-05-28 19:10:321221}
1222
Patrick Walton91436882013-02-14 19:47:001223impl ToJson for i64 {
Ben Striegel0fed29c2013-03-08 02:11:091224 fn to_json(&self) -> Json { Number(*self as float) }
Erick Tryzelaared5af702012-05-28 19:10:321225}
1226
Patrick Walton91436882013-02-14 19:47:001227impl ToJson for uint {
Ben Striegel0fed29c2013-03-08 02:11:091228 fn to_json(&self) -> Json { Number(*self as float) }
Erick Tryzelaar11a56c32012-06-13 15:30:541229}
1230
Patrick Walton91436882013-02-14 19:47:001231impl ToJson for u8 {
Ben Striegel0fed29c2013-03-08 02:11:091232 fn to_json(&self) -> Json { Number(*self as float) }
Erick Tryzelaared5af702012-05-28 19:10:321233}
1234
Patrick Walton91436882013-02-14 19:47:001235impl ToJson for u16 {
Ben Striegel0fed29c2013-03-08 02:11:091236 fn to_json(&self) -> Json { Number(*self as float) }
Erick Tryzelaared5af702012-05-28 19:10:321237}
1238
Patrick Walton91436882013-02-14 19:47:001239impl ToJson for u32 {
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 u64 {
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 float {
Ben Striegel0fed29c2013-03-08 02:11:091248 fn to_json(&self) -> Json { Number(*self) }
Erick Tryzelaared5af702012-05-28 19:10:321249}
1250
Patrick Walton91436882013-02-14 19:47:001251impl ToJson for f32 {
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 f64 {
Ben Striegel0fed29c2013-03-08 02:11:091256 fn to_json(&self) -> Json { Number(*self as float) }
Erick Tryzelaared5af702012-05-28 19:10:321257}
1258
Patrick Walton91436882013-02-14 19:47:001259impl ToJson for () {
Ben Striegel0fed29c2013-03-08 02:11:091260 fn to_json(&self) -> Json { Null }
Erick Tryzelaared5af702012-05-28 19:10:321261}
1262
Patrick Walton91436882013-02-14 19:47:001263impl ToJson for bool {
Ben Striegel0fed29c2013-03-08 02:11:091264 fn to_json(&self) -> Json { Boolean(*self) }
Erick Tryzelaared5af702012-05-28 19:10:321265}
1266
Patrick Walton91436882013-02-14 19:47:001267impl ToJson for ~str {
Ben Striegel0fed29c2013-03-08 02:11:091268 fn to_json(&self) -> Json { String(copy *self) }
Erick Tryzelaarb361f6c2012-06-13 00:20:511269}
1270
Patrick Walton91436882013-02-14 19:47:001271impl ToJson for @~str {
Ben Striegel0fed29c2013-03-08 02:11:091272 fn to_json(&self) -> Json { String(copy **self) }
Erick Tryzelaared5af702012-05-28 19:10:321273}
1274
Patrick Waltonbf2a2252013-02-21 01:07:171275impl<A:ToJson,B:ToJson> ToJson for (A, B) {
Ben Striegel0fed29c2013-03-08 02:11:091276 fn to_json(&self) -> Json {
1277 match *self {
Brian Andersonbc9efaa2012-09-28 07:22:181278 (ref a, ref b) => {
Erick Tryzelaar49d00b22012-09-24 16:55:421279 List(~[a.to_json(), b.to_json()])
Niko Matsakis97452c02012-08-02 22:42:561280 }
1281 }
Erick Tryzelaared5af702012-05-28 19:10:321282 }
1283}
1284
Patrick Waltonbf2a2252013-02-21 01:07:171285impl<A:ToJson,B:ToJson,C:ToJson> ToJson for (A, B, C) {
Ben Striegel0fed29c2013-03-08 02:11:091286 fn to_json(&self) -> Json {
1287 match *self {
Brian Andersonbc9efaa2012-09-28 07:22:181288 (ref a, ref b, ref c) => {
Erick Tryzelaar49d00b22012-09-24 16:55:421289 List(~[a.to_json(), b.to_json(), c.to_json()])
Niko Matsakis97452c02012-08-02 22:42:561290 }
1291 }
Erick Tryzelaared5af702012-05-28 19:10:321292 }
1293}
1294
Patrick Waltonbf2a2252013-02-21 01:07:171295impl<A:ToJson> ToJson for ~[A] {
Ben Striegel0fed29c2013-03-08 02:11:091296 fn to_json(&self) -> Json { List(self.map(|elt| elt.to_json())) }
Erick Tryzelaared5af702012-05-28 19:10:321297}
1298
Daniel Micaycc148b52013-04-03 13:28:361299impl<A:ToJson + Copy> ToJson for HashMap<~str, A> {
Ben Striegel0fed29c2013-03-08 02:11:091300 fn to_json(&self) -> Json {
Daniel Micaycc148b52013-04-03 13:28:361301 let mut d = HashMap::new();
Niko Matsakis5606fc02013-04-06 15:22:361302 for self.each |key, value| {
Erick Tryzelaar49d00b22012-09-24 16:55:421303 d.insert(copy *key, value.to_json());
Erick Tryzelaared5af702012-05-28 19:10:321304 }
Erick Tryzelaar49d00b22012-09-24 16:55:421305 Object(~d)
Erick Tryzelaared5af702012-05-28 19:10:321306 }
1307}
1308
Patrick Waltonbf2a2252013-02-21 01:07:171309impl<A:ToJson> ToJson for Option<A> {
Ben Striegel0fed29c2013-03-08 02:11:091310 fn to_json(&self) -> Json {
1311 match *self {
Ben Striegela605fd02012-08-11 14:08:421312 None => Null,
Brian Andersonbc9efaa2012-09-28 07:22:181313 Some(ref value) => value.to_json()
Erick Tryzelaared5af702012-05-28 19:10:321314 }
1315 }
1316}
1317
Patrick Walton91436882013-02-14 19:47:001318impl to_str::ToStr for Json {
Patrick Waltonc1084092013-03-22 04:34:301319 fn to_str(&self) -> ~str { to_str(self) }
Erick Tryzelaared5af702012-05-28 19:10:321320}
1321
Patrick Walton91436882013-02-14 19:47:001322impl to_str::ToStr for Error {
Patrick Waltonc1084092013-03-22 04:34:301323 fn to_str(&self) -> ~str {
Paul Stansifer29f32b42012-08-23 00:24:521324 fmt!("%u:%u: %s", self.line, self.col, *self.msg)
Erick Tryzelaara8161762012-06-11 15:32:381325 }
1326}
1327
Brian Anderson6e27b272012-01-18 03:05:071328#[cfg(test)]
1329mod tests {
Patrick Waltonee528652013-05-22 00:24:311330 use core::prelude::*;
1331
Erick Tryzelaarb2908632013-03-27 00:46:291332 use super::*;
1333
Daniel Micaycc148b52013-04-03 13:28:361334 use core::hashmap::HashMap;
John Clementsf91160b2013-02-08 01:06:261335
Erick Tryzelaarb10b8c32013-03-27 07:13:011336 use std::serialize::Decodable;
1337
Huon Wilson5dc5efe2013-05-15 22:55:571338 #[deriving(Eq, Encodable, Decodable)]
Erick Tryzelaar9bbf3842013-03-30 18:08:571339 enum Animal {
1340 Dog,
1341 Frog(~str, int)
1342 }
1343
Huon Wilson5dc5efe2013-05-15 22:55:571344 #[deriving(Eq, Encodable, Decodable)]
Erick Tryzelaar5b7d6082013-03-30 20:31:031345 struct Inner {
1346 a: (),
1347 b: uint,
1348 c: ~[~str],
1349 }
1350
Huon Wilson5dc5efe2013-05-15 22:55:571351 #[deriving(Eq, Encodable, Decodable)]
Erick Tryzelaar5b7d6082013-03-30 20:31:031352 struct Outer {
1353 inner: ~[Inner],
1354 }
1355
Erick Tryzelaar49d00b22012-09-24 16:55:421356 fn mk_object(items: &[(~str, Json)]) -> Json {
Daniel Micaycc148b52013-04-03 13:28:361357 let mut d = ~HashMap::new();
Erick Tryzelaar012dec52012-02-26 00:39:321358
Erick Tryzelaar49d00b22012-09-24 16:55:421359 for items.each |item| {
1360 match *item {
Luqman Aden4cf51c22013-02-15 07:30:301361 (copy key, copy value) => { d.insert(key, value); },
Erick Tryzelaar49d00b22012-09-24 16:55:421362 }
Erick Tryzelaar012dec52012-02-26 00:39:321363 };
1364
Luqman Aden4cf51c22013-02-15 07:30:301365 Object(d)
Brian Anderson6e27b272012-01-18 03:05:071366 }
1367
1368 #[test]
Erick Tryzelaar012dec52012-02-26 00:39:321369 fn test_write_null() {
Erick Tryzelaar6cf99fa2013-03-27 00:23:001370 assert_eq!(to_str(&Null), ~"null");
Erick Tryzelaar9bbf3842013-03-30 18:08:571371 assert_eq!(to_pretty_str(&Null), ~"null");
Brian Anderson6e27b272012-01-18 03:05:071372 }
1373
Erick Tryzelaar9bbf3842013-03-30 18:08:571374
Brian Anderson6e27b272012-01-18 03:05:071375 #[test]
Erick Tryzelaar49d00b22012-09-24 16:55:421376 fn test_write_number() {
Erick Tryzelaar6cf99fa2013-03-27 00:23:001377 assert_eq!(to_str(&Number(3f)), ~"3");
Erick Tryzelaar9bbf3842013-03-30 18:08:571378 assert_eq!(to_pretty_str(&Number(3f)), ~"3");
1379
Erick Tryzelaar6cf99fa2013-03-27 00:23:001380 assert_eq!(to_str(&Number(3.1f)), ~"3.1");
Erick Tryzelaar9bbf3842013-03-30 18:08:571381 assert_eq!(to_pretty_str(&Number(3.1f)), ~"3.1");
1382
Erick Tryzelaar6cf99fa2013-03-27 00:23:001383 assert_eq!(to_str(&Number(-1.5f)), ~"-1.5");
Erick Tryzelaar9bbf3842013-03-30 18:08:571384 assert_eq!(to_pretty_str(&Number(-1.5f)), ~"-1.5");
1385
Erick Tryzelaar6cf99fa2013-03-27 00:23:001386 assert_eq!(to_str(&Number(0.5f)), ~"0.5");
Erick Tryzelaar9bbf3842013-03-30 18:08:571387 assert_eq!(to_pretty_str(&Number(0.5f)), ~"0.5");
Brian Anderson6e27b272012-01-18 03:05:071388 }
1389
1390 #[test]
Erick Tryzelaar012dec52012-02-26 00:39:321391 fn test_write_str() {
Erick Tryzelaar6cf99fa2013-03-27 00:23:001392 assert_eq!(to_str(&String(~"")), ~"\"\"");
Erick Tryzelaar9bbf3842013-03-30 18:08:571393 assert_eq!(to_pretty_str(&String(~"")), ~"\"\"");
1394
Erick Tryzelaar6cf99fa2013-03-27 00:23:001395 assert_eq!(to_str(&String(~"foo")), ~"\"foo\"");
Erick Tryzelaar9bbf3842013-03-30 18:08:571396 assert_eq!(to_pretty_str(&String(~"foo")), ~"\"foo\"");
Brian Anderson6e27b272012-01-18 03:05:071397 }
1398
1399 #[test]
Erick Tryzelaar012dec52012-02-26 00:39:321400 fn test_write_bool() {
Erick Tryzelaar6cf99fa2013-03-27 00:23:001401 assert_eq!(to_str(&Boolean(true)), ~"true");
Erick Tryzelaar9bbf3842013-03-30 18:08:571402 assert_eq!(to_pretty_str(&Boolean(true)), ~"true");
1403
Erick Tryzelaar6cf99fa2013-03-27 00:23:001404 assert_eq!(to_str(&Boolean(false)), ~"false");
Erick Tryzelaar9bbf3842013-03-30 18:08:571405 assert_eq!(to_pretty_str(&Boolean(false)), ~"false");
Brian Anderson6e27b272012-01-18 03:05:071406 }
1407
1408 #[test]
Erick Tryzelaar012dec52012-02-26 00:39:321409 fn test_write_list() {
Erick Tryzelaar6cf99fa2013-03-27 00:23:001410 assert_eq!(to_str(&List(~[])), ~"[]");
Erick Tryzelaarc9188c82013-03-27 00:34:491411 assert_eq!(to_pretty_str(&List(~[])), ~"[]");
Erick Tryzelaar9bbf3842013-03-30 18:08:571412
1413 assert_eq!(to_str(&List(~[Boolean(true)])), ~"[true]");
Erick Tryzelaarc9188c82013-03-27 00:34:491414 assert_eq!(
1415 to_pretty_str(&List(~[Boolean(true)])),
1416 ~"\
1417 [\n \
1418 true\n\
1419 ]"
1420 );
Erick Tryzelaar9bbf3842013-03-30 18:08:571421
1422 assert_eq!(to_str(&List(~[
1423 Boolean(false),
1424 Null,
1425 List(~[String(~"foo\nbar"), Number(3.5f)])
1426 ])), ~"[false,null,[\"foo\\nbar\",3.5]]");
Erick Tryzelaarc9188c82013-03-27 00:34:491427 assert_eq!(
1428 to_pretty_str(&List(~[
1429 Boolean(false),
1430 Null,
1431 List(~[String(~"foo\nbar"), Number(3.5f)])
1432 ])),
1433 ~"\
1434 [\n \
1435 false,\n \
1436 null,\n \
1437 [\n \
1438 \"foo\\nbar\",\n \
1439 3.5\n \
1440 ]\n\
1441 ]"
1442 );
1443 }
1444
1445 #[test]
Erick Tryzelaar49d00b22012-09-24 16:55:421446 fn test_write_object() {
Erick Tryzelaar609a9e62013-05-23 16:39:001447 assert_eq!(to_str(&mk_object([])), ~"{}");
1448 assert_eq!(to_pretty_str(&mk_object([])), ~"{}");
Erick Tryzelaar9bbf3842013-03-30 18:08:571449
Erick Tryzelaar6cf99fa2013-03-27 00:23:001450 assert_eq!(
Erick Tryzelaar609a9e62013-05-23 16:39:001451 to_str(&mk_object([(~"a", Boolean(true))])),
Erick Tryzelaar6cf99fa2013-03-27 00:23:001452 ~"{\"a\":true}"
1453 );
Erick Tryzelaarc9188c82013-03-27 00:34:491454 assert_eq!(
Erick Tryzelaar609a9e62013-05-23 16:39:001455 to_pretty_str(&mk_object([(~"a", Boolean(true))])),
Erick Tryzelaar9bbf3842013-03-30 18:08:571456 ~"\
1457 {\n \
1458 \"a\": true\n\
1459 }"
1460 );
1461
1462 assert_eq!(
Erick Tryzelaar609a9e62013-05-23 16:39:001463 to_str(&mk_object([
Erick Tryzelaarc9188c82013-03-27 00:34:491464 (~"b", List(~[
Erick Tryzelaar609a9e62013-05-23 16:39:001465 mk_object([(~"c", String(~"\x0c\r"))]),
1466 mk_object([(~"d", String(~""))])
Erick Tryzelaarc9188c82013-03-27 00:34:491467 ]))
1468 ])),
1469 ~"{\
1470 \"b\":[\
1471 {\"c\":\"\\f\\r\"},\
1472 {\"d\":\"\"}\
1473 ]\
1474 }"
1475 );
Erick Tryzelaarc9188c82013-03-27 00:34:491476 assert_eq!(
Erick Tryzelaar609a9e62013-05-23 16:39:001477 to_pretty_str(&mk_object([
Erick Tryzelaarc9188c82013-03-27 00:34:491478 (~"b", List(~[
Erick Tryzelaar609a9e62013-05-23 16:39:001479 mk_object([(~"c", String(~"\x0c\r"))]),
1480 mk_object([(~"d", String(~""))])
Erick Tryzelaarc9188c82013-03-27 00:34:491481 ]))
1482 ])),
1483 ~"\
1484 {\n \
1485 \"b\": [\n \
1486 {\n \
1487 \"c\": \"\\f\\r\"\n \
1488 },\n \
1489 {\n \
1490 \"d\": \"\"\n \
1491 }\n \
1492 ]\n\
1493 }"
1494 );
Erick Tryzelaar9bbf3842013-03-30 18:08:571495
Erick Tryzelaar609a9e62013-05-23 16:39:001496 let a = mk_object([
Erick Tryzelaarc9188c82013-03-27 00:34:491497 (~"a", Boolean(true)),
1498 (~"b", List(~[
Erick Tryzelaar609a9e62013-05-23 16:39:001499 mk_object([(~"c", String(~"\x0c\r"))]),
1500 mk_object([(~"d", String(~""))])
Erick Tryzelaarc9188c82013-03-27 00:34:491501 ]))
1502 ]);
Erick Tryzelaar9bbf3842013-03-30 18:08:571503
Erick Tryzelaarc9188c82013-03-27 00:34:491504 // We can't compare the strings directly because the object fields be
1505 // printed in a different order.
Erick Tryzelaar9bbf3842013-03-30 18:08:571506 assert_eq!(copy a, from_str(to_str(&a)).unwrap());
1507 assert_eq!(copy a, from_str(to_pretty_str(&a)).unwrap());
Erick Tryzelaarc9188c82013-03-27 00:34:491508 }
1509
1510 #[test]
Erick Tryzelaar9bbf3842013-03-30 18:08:571511 fn test_write_enum() {
Erick Tryzelaarc9188c82013-03-27 00:34:491512 let animal = Dog;
Erick Tryzelaarc9188c82013-03-27 00:34:491513 assert_eq!(
Erick Tryzelaar9bbf3842013-03-30 18:08:571514 do io::with_str_writer |wr| {
Patrick Waltondc5df612013-05-02 00:54:541515 let mut encoder = Encoder(wr);
1516 animal.encode(&mut encoder);
Erick Tryzelaar9bbf3842013-03-30 18:08:571517 },
1518 ~"\"Dog\""
1519 );
1520 assert_eq!(
1521 do io::with_str_writer |wr| {
Patrick Waltondc5df612013-05-02 00:54:541522 let mut encoder = PrettyEncoder(wr);
1523 animal.encode(&mut encoder);
Erick Tryzelaar9bbf3842013-03-30 18:08:571524 },
1525 ~"\"Dog\""
1526 );
1527
1528 let animal = Frog(~"Henry", 349);
1529 assert_eq!(
1530 do io::with_str_writer |wr| {
Patrick Waltondc5df612013-05-02 00:54:541531 let mut encoder = Encoder(wr);
1532 animal.encode(&mut encoder);
Erick Tryzelaar9bbf3842013-03-30 18:08:571533 },
1534 ~"[\"Frog\",\"Henry\",349]"
1535 );
1536 assert_eq!(
1537 do io::with_str_writer |wr| {
Patrick Waltondc5df612013-05-02 00:54:541538 let mut encoder = PrettyEncoder(wr);
1539 animal.encode(&mut encoder);
Erick Tryzelaar9bbf3842013-03-30 18:08:571540 },
Erick Tryzelaarc9188c82013-03-27 00:34:491541 ~"\
1542 [\n \
1543 \"Frog\",\n \
Erick Tryzelaar4d995e62013-03-27 07:14:521544 \"Henry\",\n \
1545 349\n\
Erick Tryzelaarc9188c82013-03-27 00:34:491546 ]"
1547 );
John Clementsc952c042013-02-08 23:36:401548 }
1549
1550 #[test]
Erick Tryzelaar6cf99fa2013-03-27 00:23:001551 fn test_write_some() {
1552 let value = Some(~"jodhpurs");
1553 let s = do io::with_str_writer |wr| {
Patrick Waltondc5df612013-05-02 00:54:541554 let mut encoder = Encoder(wr);
1555 value.encode(&mut encoder);
Erick Tryzelaar6cf99fa2013-03-27 00:23:001556 };
1557 assert_eq!(s, ~"\"jodhpurs\"");
John Clementsc952c042013-02-08 23:36:401558
Erick Tryzelaarc9188c82013-03-27 00:34:491559 let value = Some(~"jodhpurs");
1560 let s = do io::with_str_writer |wr| {
Patrick Waltondc5df612013-05-02 00:54:541561 let mut encoder = PrettyEncoder(wr);
1562 value.encode(&mut encoder);
Erick Tryzelaarc9188c82013-03-27 00:34:491563 };
1564 assert_eq!(s, ~"\"jodhpurs\"");
1565 }
1566
1567 #[test]
Erick Tryzelaar6cf99fa2013-03-27 00:23:001568 fn test_write_none() {
1569 let value: Option<~str> = None;
1570 let s = do io::with_str_writer |wr| {
Patrick Waltondc5df612013-05-02 00:54:541571 let mut encoder = Encoder(wr);
1572 value.encode(&mut encoder);
Erick Tryzelaar6cf99fa2013-03-27 00:23:001573 };
1574 assert_eq!(s, ~"null");
John Clementsf91160b2013-02-08 01:06:261575
Erick Tryzelaarc9188c82013-03-27 00:34:491576 let s = do io::with_str_writer |wr| {
Patrick Waltondc5df612013-05-02 00:54:541577 let mut encoder = Encoder(wr);
1578 value.encode(&mut encoder);
Erick Tryzelaarc9188c82013-03-27 00:34:491579 };
1580 assert_eq!(s, ~"null");
1581 }
1582
1583 #[test]
Erick Tryzelaar012dec52012-02-26 00:39:321584 fn test_trailing_characters() {
Erick Tryzelaar609a9e62013-05-23 16:39:001585 assert_eq!(from_str("nulla"),
Patrick Waltond7e74b52013-03-06 21:58:021586 Err(Error {line: 1u, col: 5u, msg: @~"trailing characters"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001587 assert_eq!(from_str("truea"),
Patrick Waltond7e74b52013-03-06 21:58:021588 Err(Error {line: 1u, col: 5u, msg: @~"trailing characters"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001589 assert_eq!(from_str("falsea"),
Patrick Waltond7e74b52013-03-06 21:58:021590 Err(Error {line: 1u, col: 6u, msg: @~"trailing characters"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001591 assert_eq!(from_str("1a"),
Patrick Waltond7e74b52013-03-06 21:58:021592 Err(Error {line: 1u, col: 2u, msg: @~"trailing characters"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001593 assert_eq!(from_str("[]a"),
Patrick Waltond7e74b52013-03-06 21:58:021594 Err(Error {line: 1u, col: 3u, msg: @~"trailing characters"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001595 assert_eq!(from_str("{}a"),
Patrick Waltond7e74b52013-03-06 21:58:021596 Err(Error {line: 1u, col: 3u, msg: @~"trailing characters"}));
Erick Tryzelaar012dec52012-02-26 00:39:321597 }
1598
1599 #[test]
1600 fn test_read_identifiers() {
Erick Tryzelaar609a9e62013-05-23 16:39:001601 assert_eq!(from_str("n"),
Patrick Waltond7e74b52013-03-06 21:58:021602 Err(Error {line: 1u, col: 2u, msg: @~"invalid syntax"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001603 assert_eq!(from_str("nul"),
Patrick Waltond7e74b52013-03-06 21:58:021604 Err(Error {line: 1u, col: 4u, msg: @~"invalid syntax"}));
Erick Tryzelaar012dec52012-02-26 00:39:321605
Erick Tryzelaar609a9e62013-05-23 16:39:001606 assert_eq!(from_str("t"),
Patrick Waltond7e74b52013-03-06 21:58:021607 Err(Error {line: 1u, col: 2u, msg: @~"invalid syntax"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001608 assert_eq!(from_str("truz"),
Patrick Waltond7e74b52013-03-06 21:58:021609 Err(Error {line: 1u, col: 4u, msg: @~"invalid syntax"}));
Erick Tryzelaar012dec52012-02-26 00:39:321610
Erick Tryzelaar609a9e62013-05-23 16:39:001611 assert_eq!(from_str("f"),
Patrick Waltond7e74b52013-03-06 21:58:021612 Err(Error {line: 1u, col: 2u, msg: @~"invalid syntax"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001613 assert_eq!(from_str("faz"),
Patrick Waltond7e74b52013-03-06 21:58:021614 Err(Error {line: 1u, col: 3u, msg: @~"invalid syntax"}));
Erick Tryzelaar012dec52012-02-26 00:39:321615
Erick Tryzelaar609a9e62013-05-23 16:39:001616 assert_eq!(from_str("null"), Ok(Null));
1617 assert_eq!(from_str("true"), Ok(Boolean(true)));
1618 assert_eq!(from_str("false"), Ok(Boolean(false)));
1619 assert_eq!(from_str(" null "), Ok(Null));
1620 assert_eq!(from_str(" true "), Ok(Boolean(true)));
1621 assert_eq!(from_str(" false "), Ok(Boolean(false)));
Erick Tryzelaar012dec52012-02-26 00:39:321622 }
1623
1624 #[test]
Erick Tryzelaar5b7d6082013-03-30 20:31:031625 fn test_decode_identifiers() {
Erick Tryzelaar609a9e62013-05-23 16:39:001626 let mut decoder = Decoder(from_str("null").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541627 let v: () = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031628 assert_eq!(v, ());
1629
Erick Tryzelaar609a9e62013-05-23 16:39:001630 let mut decoder = Decoder(from_str("true").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541631 let v: bool = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031632 assert_eq!(v, true);
1633
Erick Tryzelaar609a9e62013-05-23 16:39:001634 let mut decoder = Decoder(from_str("false").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541635 let v: bool = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031636 assert_eq!(v, false);
1637 }
1638
1639 #[test]
Erick Tryzelaar49d00b22012-09-24 16:55:421640 fn test_read_number() {
Erick Tryzelaar609a9e62013-05-23 16:39:001641 assert_eq!(from_str("+"),
Patrick Waltond7e74b52013-03-06 21:58:021642 Err(Error {line: 1u, col: 1u, msg: @~"invalid syntax"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001643 assert_eq!(from_str("."),
Patrick Waltond7e74b52013-03-06 21:58:021644 Err(Error {line: 1u, col: 1u, msg: @~"invalid syntax"}));
Erick Tryzelaar012dec52012-02-26 00:39:321645
Erick Tryzelaar609a9e62013-05-23 16:39:001646 assert_eq!(from_str("-"),
Patrick Waltond7e74b52013-03-06 21:58:021647 Err(Error {line: 1u, col: 2u, msg: @~"invalid number"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001648 assert_eq!(from_str("00"),
Patrick Waltond7e74b52013-03-06 21:58:021649 Err(Error {line: 1u, col: 2u, msg: @~"invalid number"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001650 assert_eq!(from_str("1."),
Patrick Waltond7e74b52013-03-06 21:58:021651 Err(Error {line: 1u, col: 3u, msg: @~"invalid number"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001652 assert_eq!(from_str("1e"),
Patrick Waltond7e74b52013-03-06 21:58:021653 Err(Error {line: 1u, col: 3u, msg: @~"invalid number"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001654 assert_eq!(from_str("1e+"),
Patrick Waltond7e74b52013-03-06 21:58:021655 Err(Error {line: 1u, col: 4u, msg: @~"invalid number"}));
Erick Tryzelaar012dec52012-02-26 00:39:321656
Erick Tryzelaar609a9e62013-05-23 16:39:001657 assert_eq!(from_str("3"), Ok(Number(3f)));
1658 assert_eq!(from_str("3.1"), Ok(Number(3.1f)));
1659 assert_eq!(from_str("-1.2"), Ok(Number(-1.2f)));
1660 assert_eq!(from_str("0.4"), Ok(Number(0.4f)));
1661 assert_eq!(from_str("0.4e5"), Ok(Number(0.4e5f)));
1662 assert_eq!(from_str("0.4e+15"), Ok(Number(0.4e15f)));
1663 assert_eq!(from_str("0.4e-01"), Ok(Number(0.4e-01f)));
1664 assert_eq!(from_str(" 3 "), Ok(Number(3f)));
Erick Tryzelaar012dec52012-02-26 00:39:321665 }
1666
1667 #[test]
Erick Tryzelaar5b7d6082013-03-30 20:31:031668 fn test_decode_numbers() {
Erick Tryzelaar609a9e62013-05-23 16:39:001669 let mut decoder = Decoder(from_str("3").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541670 let v: float = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031671 assert_eq!(v, 3f);
1672
Erick Tryzelaar609a9e62013-05-23 16:39:001673 let mut decoder = Decoder(from_str("3.1").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541674 let v: float = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031675 assert_eq!(v, 3.1f);
1676
Erick Tryzelaar609a9e62013-05-23 16:39:001677 let mut decoder = Decoder(from_str("-1.2").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541678 let v: float = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031679 assert_eq!(v, -1.2f);
1680
Erick Tryzelaar609a9e62013-05-23 16:39:001681 let mut decoder = Decoder(from_str("0.4").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541682 let v: float = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031683 assert_eq!(v, 0.4f);
1684
Erick Tryzelaar609a9e62013-05-23 16:39:001685 let mut decoder = Decoder(from_str("0.4e5").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541686 let v: float = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031687 assert_eq!(v, 0.4e5f);
1688
Erick Tryzelaar609a9e62013-05-23 16:39:001689 let mut decoder = Decoder(from_str("0.4e15").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541690 let v: float = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031691 assert_eq!(v, 0.4e15f);
1692
Erick Tryzelaar609a9e62013-05-23 16:39:001693 let mut decoder = Decoder(from_str("0.4e-01").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541694 let v: float = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031695 assert_eq!(v, 0.4e-01f);
1696 }
1697
1698 #[test]
Erick Tryzelaar012dec52012-02-26 00:39:321699 fn test_read_str() {
Erick Tryzelaar609a9e62013-05-23 16:39:001700 assert_eq!(from_str("\""),
Patrick Waltond7e74b52013-03-06 21:58:021701 Err(Error {line: 1u, col: 2u, msg: @~"EOF while parsing string"
1702 }));
Erick Tryzelaar609a9e62013-05-23 16:39:001703 assert_eq!(from_str("\"lol"),
Patrick Waltond7e74b52013-03-06 21:58:021704 Err(Error {line: 1u, col: 5u, msg: @~"EOF while parsing string"
1705 }));
Erick Tryzelaar012dec52012-02-26 00:39:321706
Erick Tryzelaar609a9e62013-05-23 16:39:001707 assert_eq!(from_str("\"\""), Ok(String(~"")));
1708 assert_eq!(from_str("\"foo\""), Ok(String(~"foo")));
1709 assert_eq!(from_str("\"\\\"\""), Ok(String(~"\"")));
1710 assert_eq!(from_str("\"\\b\""), Ok(String(~"\x08")));
1711 assert_eq!(from_str("\"\\n\""), Ok(String(~"\n")));
1712 assert_eq!(from_str("\"\\r\""), Ok(String(~"\r")));
1713 assert_eq!(from_str("\"\\t\""), Ok(String(~"\t")));
1714 assert_eq!(from_str(" \"foo\" "), Ok(String(~"foo")));
1715 assert_eq!(from_str("\"\\u12ab\""), Ok(String(~"\u12ab")));
1716 assert_eq!(from_str("\"\\uAB12\""), Ok(String(~"\uAB12")));
Erick Tryzelaar012dec52012-02-26 00:39:321717 }
1718
1719 #[test]
Erick Tryzelaar5b7d6082013-03-30 20:31:031720 fn test_decode_str() {
Erick Tryzelaar609a9e62013-05-23 16:39:001721 let mut decoder = Decoder(from_str("\"\"").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541722 let v: ~str = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031723 assert_eq!(v, ~"");
1724
Erick Tryzelaar609a9e62013-05-23 16:39:001725 let mut decoder = Decoder(from_str("\"foo\"").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541726 let v: ~str = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031727 assert_eq!(v, ~"foo");
1728
Erick Tryzelaar609a9e62013-05-23 16:39:001729 let mut decoder = Decoder(from_str("\"\\\"\"").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541730 let v: ~str = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031731 assert_eq!(v, ~"\"");
1732
Erick Tryzelaar609a9e62013-05-23 16:39:001733 let mut decoder = Decoder(from_str("\"\\b\"").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541734 let v: ~str = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031735 assert_eq!(v, ~"\x08");
1736
Erick Tryzelaar609a9e62013-05-23 16:39:001737 let mut decoder = Decoder(from_str("\"\\n\"").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541738 let v: ~str = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031739 assert_eq!(v, ~"\n");
1740
Erick Tryzelaar609a9e62013-05-23 16:39:001741 let mut decoder = Decoder(from_str("\"\\r\"").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541742 let v: ~str = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031743 assert_eq!(v, ~"\r");
1744
Erick Tryzelaar609a9e62013-05-23 16:39:001745 let mut decoder = Decoder(from_str("\"\\t\"").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541746 let v: ~str = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031747 assert_eq!(v, ~"\t");
1748
Erick Tryzelaar609a9e62013-05-23 16:39:001749 let mut decoder = Decoder(from_str("\"\\u12ab\"").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541750 let v: ~str = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031751 assert_eq!(v, ~"\u12ab");
1752
Erick Tryzelaar609a9e62013-05-23 16:39:001753 let mut decoder = Decoder(from_str("\"\\uAB12\"").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541754 let v: ~str = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031755 assert_eq!(v, ~"\uAB12");
Kevin Cantucf386182012-08-31 04:03:191756 }
1757
1758 #[test]
Erick Tryzelaar012dec52012-02-26 00:39:321759 fn test_read_list() {
Erick Tryzelaar609a9e62013-05-23 16:39:001760 assert_eq!(from_str("["),
Patrick Waltond7e74b52013-03-06 21:58:021761 Err(Error {line: 1u, col: 2u, msg: @~"EOF while parsing value"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001762 assert_eq!(from_str("[1"),
Patrick Waltond7e74b52013-03-06 21:58:021763 Err(Error {line: 1u, col: 3u, msg: @~"EOF while parsing list"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001764 assert_eq!(from_str("[1,"),
Patrick Waltond7e74b52013-03-06 21:58:021765 Err(Error {line: 1u, col: 4u, msg: @~"EOF while parsing value"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001766 assert_eq!(from_str("[1,]"),
Patrick Waltond7e74b52013-03-06 21:58:021767 Err(Error {line: 1u, col: 4u, msg: @~"invalid syntax"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001768 assert_eq!(from_str("[6 7]"),
Patrick Waltond7e74b52013-03-06 21:58:021769 Err(Error {line: 1u, col: 4u, msg: @~"expected `,` or `]`"}));
Erick Tryzelaar012dec52012-02-26 00:39:321770
Erick Tryzelaar609a9e62013-05-23 16:39:001771 assert_eq!(from_str("[]"), Ok(List(~[])));
1772 assert_eq!(from_str("[ ]"), Ok(List(~[])));
1773 assert_eq!(from_str("[true]"), Ok(List(~[Boolean(true)])));
1774 assert_eq!(from_str("[ false ]"), Ok(List(~[Boolean(false)])));
1775 assert_eq!(from_str("[null]"), Ok(List(~[Null])));
1776 assert_eq!(from_str("[3, 1]"),
Patrick Waltond7e74b52013-03-06 21:58:021777 Ok(List(~[Number(3f), Number(1f)])));
Erick Tryzelaar609a9e62013-05-23 16:39:001778 assert_eq!(from_str("\n[3, 2]\n"),
Patrick Waltond7e74b52013-03-06 21:58:021779 Ok(List(~[Number(3f), Number(2f)])));
Erick Tryzelaar609a9e62013-05-23 16:39:001780 assert_eq!(from_str("[2, [4, 1]]"),
Patrick Waltond7e74b52013-03-06 21:58:021781 Ok(List(~[Number(2f), List(~[Number(4f), Number(1f)])])));
Erick Tryzelaar012dec52012-02-26 00:39:321782 }
1783
1784 #[test]
Erick Tryzelaar5b7d6082013-03-30 20:31:031785 fn test_decode_list() {
Erick Tryzelaar609a9e62013-05-23 16:39:001786 let mut decoder = Decoder(from_str("[]").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541787 let v: ~[()] = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031788 assert_eq!(v, ~[]);
1789
Erick Tryzelaar609a9e62013-05-23 16:39:001790 let mut decoder = Decoder(from_str("[null]").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541791 let v: ~[()] = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031792 assert_eq!(v, ~[()]);
1793
Erick Tryzelaar609a9e62013-05-23 16:39:001794 let mut decoder = Decoder(from_str("[true]").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541795 let v: ~[bool] = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031796 assert_eq!(v, ~[true]);
1797
Erick Tryzelaar609a9e62013-05-23 16:39:001798 let mut decoder = Decoder(from_str("[true]").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541799 let v: ~[bool] = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031800 assert_eq!(v, ~[true]);
1801
Erick Tryzelaar609a9e62013-05-23 16:39:001802 let mut decoder = Decoder(from_str("[3, 1]").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541803 let v: ~[int] = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031804 assert_eq!(v, ~[3, 1]);
1805
Erick Tryzelaar609a9e62013-05-23 16:39:001806 let mut decoder = Decoder(from_str("[[3], [1, 2]]").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541807 let v: ~[~[uint]] = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031808 assert_eq!(v, ~[~[3], ~[1, 2]]);
1809 }
1810
1811 #[test]
Erick Tryzelaar49d00b22012-09-24 16:55:421812 fn test_read_object() {
Erick Tryzelaar609a9e62013-05-23 16:39:001813 assert_eq!(from_str("{"),
Patrick Waltond7e74b52013-03-06 21:58:021814 Err(Error {
1815 line: 1u,
1816 col: 2u,
1817 msg: @~"EOF while parsing object"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001818 assert_eq!(from_str("{ "),
Patrick Waltond7e74b52013-03-06 21:58:021819 Err(Error {
1820 line: 1u,
1821 col: 3u,
1822 msg: @~"EOF while parsing object"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001823 assert_eq!(from_str("{1"),
Patrick Waltond7e74b52013-03-06 21:58:021824 Err(Error {
1825 line: 1u,
1826 col: 2u,
1827 msg: @~"key must be a string"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001828 assert_eq!(from_str("{ \"a\""),
Patrick Waltond7e74b52013-03-06 21:58:021829 Err(Error {
1830 line: 1u,
1831 col: 6u,
1832 msg: @~"EOF while parsing object"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001833 assert_eq!(from_str("{\"a\""),
Patrick Waltond7e74b52013-03-06 21:58:021834 Err(Error {
1835 line: 1u,
1836 col: 5u,
1837 msg: @~"EOF while parsing object"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001838 assert_eq!(from_str("{\"a\" "),
Patrick Waltond7e74b52013-03-06 21:58:021839 Err(Error {
1840 line: 1u,
1841 col: 6u,
1842 msg: @~"EOF while parsing object"}));
Erick Tryzelaar012dec52012-02-26 00:39:321843
Erick Tryzelaar609a9e62013-05-23 16:39:001844 assert_eq!(from_str("{\"a\" 1"),
Patrick Waltond7e74b52013-03-06 21:58:021845 Err(Error {line: 1u, col: 6u, msg: @~"expected `:`"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001846 assert_eq!(from_str("{\"a\":"),
Patrick Waltond7e74b52013-03-06 21:58:021847 Err(Error {line: 1u, col: 6u, msg: @~"EOF while parsing value"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001848 assert_eq!(from_str("{\"a\":1"),
Patrick Waltond7e74b52013-03-06 21:58:021849 Err(Error {
1850 line: 1u,
1851 col: 7u,
1852 msg: @~"EOF while parsing object"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001853 assert_eq!(from_str("{\"a\":1 1"),
Patrick Waltond7e74b52013-03-06 21:58:021854 Err(Error {line: 1u, col: 8u, msg: @~"expected `,` or `}`"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001855 assert_eq!(from_str("{\"a\":1,"),
Patrick Waltond7e74b52013-03-06 21:58:021856 Err(Error {
1857 line: 1u,
1858 col: 8u,
1859 msg: @~"EOF while parsing object"}));
Erick Tryzelaar012dec52012-02-26 00:39:321860
Erick Tryzelaar609a9e62013-05-23 16:39:001861 assert_eq!(result::unwrap(from_str("{}")), mk_object([]));
1862 assert_eq!(result::unwrap(from_str("{\"a\": 3}")),
1863 mk_object([(~"a", Number(3.0f))]));
Erick Tryzelaar012dec52012-02-26 00:39:321864
Erick Tryzelaar6cf99fa2013-03-27 00:23:001865 assert_eq!(result::unwrap(from_str(
Erick Tryzelaar609a9e62013-05-23 16:39:001866 "{ \"a\": null, \"b\" : true }")),
1867 mk_object([
Ben Striegela605fd02012-08-11 14:08:421868 (~"a", Null),
Patrick Waltond7e74b52013-03-06 21:58:021869 (~"b", Boolean(true))]));
Erick Tryzelaar6cf99fa2013-03-27 00:23:001870 assert_eq!(result::unwrap(
Erick Tryzelaar609a9e62013-05-23 16:39:001871 from_str("\n{ \"a\": null, \"b\" : true }\n")),
1872 mk_object([
Ben Striegela605fd02012-08-11 14:08:421873 (~"a", Null),
Patrick Waltond7e74b52013-03-06 21:58:021874 (~"b", Boolean(true))]));
Erick Tryzelaar6cf99fa2013-03-27 00:23:001875 assert_eq!(result::unwrap(from_str(
Erick Tryzelaar609a9e62013-05-23 16:39:001876 "{\"a\" : 1.0 ,\"b\": [ true ]}")),
1877 mk_object([
Erick Tryzelaar49d00b22012-09-24 16:55:421878 (~"a", Number(1.0)),
1879 (~"b", List(~[Boolean(true)]))
Patrick Waltond7e74b52013-03-06 21:58:021880 ]));
Erick Tryzelaar6cf99fa2013-03-27 00:23:001881 assert_eq!(result::unwrap(from_str(
Michael Sullivan92743dc2012-07-14 05:57:481882 ~"{" +
1883 ~"\"a\": 1.0, " +
1884 ~"\"b\": [" +
1885 ~"true," +
1886 ~"\"foo\\nbar\", " +
1887 ~"{ \"c\": {\"d\": null} } " +
1888 ~"]" +
Erick Tryzelaar6cf99fa2013-03-27 00:23:001889 ~"}")),
Erick Tryzelaar609a9e62013-05-23 16:39:001890 mk_object([
Erick Tryzelaar49d00b22012-09-24 16:55:421891 (~"a", Number(1.0f)),
1892 (~"b", List(~[
Ben Striegela605fd02012-08-11 14:08:421893 Boolean(true),
Erick Tryzelaar49d00b22012-09-24 16:55:421894 String(~"foo\nbar"),
Erick Tryzelaar609a9e62013-05-23 16:39:001895 mk_object([
1896 (~"c", mk_object([(~"d", Null)]))
Michael Sullivan98e161f2012-06-29 23:26:561897 ])
1898 ]))
Patrick Waltond7e74b52013-03-06 21:58:021899 ]));
Erick Tryzelaar012dec52012-02-26 00:39:321900 }
1901
1902 #[test]
Erick Tryzelaar5b7d6082013-03-30 20:31:031903 fn test_decode_struct() {
1904 let s = ~"{
1905 \"inner\": [
1906 { \"a\": null, \"b\": 2, \"c\": [\"abc\", \"xyz\"] }
1907 ]
1908 }";
Patrick Waltondc5df612013-05-02 00:54:541909 let mut decoder = Decoder(from_str(s).unwrap());
1910 let v: Outer = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031911 assert_eq!(
1912 v,
1913 Outer {
1914 inner: ~[
1915 Inner { a: (), b: 2, c: ~[~"abc", ~"xyz"] }
1916 ]
1917 }
1918 );
Erick Tryzelaarb10b8c32013-03-27 07:13:011919 }
1920
1921 #[test]
Erick Tryzelaar5b7d6082013-03-30 20:31:031922 fn test_decode_option() {
Erick Tryzelaar609a9e62013-05-23 16:39:001923 let mut decoder = Decoder(from_str("null").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541924 let value: Option<~str> = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031925 assert_eq!(value, None);
1926
Erick Tryzelaar609a9e62013-05-23 16:39:001927 let mut decoder = Decoder(from_str("\"jodhpurs\"").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541928 let value: Option<~str> = Decodable::decode(&mut decoder);
Erick Tryzelaarb10b8c32013-03-27 07:13:011929 assert_eq!(value, Some(~"jodhpurs"));
1930 }
1931
1932 #[test]
Erick Tryzelaar5b7d6082013-03-30 20:31:031933 fn test_decode_enum() {
Erick Tryzelaar609a9e62013-05-23 16:39:001934 let mut decoder = Decoder(from_str("\"Dog\"").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541935 let value: Animal = Decodable::decode(&mut decoder);
Erick Tryzelaar4e9a63f2013-03-27 00:42:011936 assert_eq!(value, Dog);
Erick Tryzelaar4e9a63f2013-03-27 00:42:011937
Patrick Waltondc5df612013-05-02 00:54:541938 let mut decoder =
Erick Tryzelaar609a9e62013-05-23 16:39:001939 Decoder(from_str("[\"Frog\",\"Henry\",349]").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541940 let value: Animal = Decodable::decode(&mut decoder);
Erick Tryzelaar4e9a63f2013-03-27 00:42:011941 assert_eq!(value, Frog(~"Henry", 349));
1942 }
1943
1944 #[test]
Erick Tryzelaar5b7d6082013-03-30 20:31:031945 fn test_decode_map() {
Erick Tryzelaard1a83e62013-03-29 16:04:351946 let s = ~"{\"a\": \"Dog\", \"b\": [\"Frog\", \"Henry\", 349]}";
Patrick Waltondc5df612013-05-02 00:54:541947 let mut decoder = Decoder(from_str(s).unwrap());
1948 let mut map: HashMap<~str, Animal> = Decodable::decode(&mut decoder);
Erick Tryzelaard1a83e62013-03-29 16:04:351949
Erick Tryzelaarbdef3f12013-03-29 16:10:311950 assert_eq!(map.pop(&~"a"), Some(Dog));
1951 assert_eq!(map.pop(&~"b"), Some(Frog(~"Henry", 349)));
Erick Tryzelaard1a83e62013-03-29 16:04:351952 }
1953
1954 #[test]
Erick Tryzelaar012dec52012-02-26 00:39:321955 fn test_multiline_errors() {
Erick Tryzelaar609a9e62013-05-23 16:39:001956 assert_eq!(from_str("{\n \"foo\":\n \"bar\""),
Patrick Waltond7e74b52013-03-06 21:58:021957 Err(Error {
1958 line: 3u,
1959 col: 8u,
1960 msg: @~"EOF while parsing object"}));
Brian Anderson6e27b272012-01-18 03:05:071961 }
1962}