blob: c3ef346dba3ba484c5ea2eab3e71cc88c2baffb8 [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
Patrick Walton206ab892013-05-25 02:35:2919use core::char;
20use core::float;
Daniel Micaycc148b52013-04-03 13:28:3621use core::hashmap::HashMap;
Patrick Walton206ab892013-05-25 02:35:2922use core::io::{WriterUtil, ReaderUtil};
23use core::io;
24use core::str;
25use core::to_str;
26use core::vec;
Erick Tryzelaarcefecd82013-03-13 18:29:0527
Patrick Waltoneb4d39e2013-01-26 00:57:3928use serialize::Encodable;
Patrick Walton57c59992012-12-23 22:41:3729use serialize;
Patrick Walton22b87572012-09-08 01:53:1430use sort::Sort;
Elly Jonesbd726262011-11-07 19:01:2831
Gareth Daniel Smithbe014162012-07-04 21:53:1232/// Represents a json value
Erick Tryzelaar49d00b22012-09-24 16:55:4233pub enum Json {
34 Number(float),
35 String(~str),
Ben Striegela605fd02012-08-11 14:08:4236 Boolean(bool),
Erick Tryzelaar49d00b22012-09-24 16:55:4237 List(List),
38 Object(~Object),
Ben Striegela605fd02012-08-11 14:08:4239 Null,
Elly Jonesbd726262011-11-07 19:01:2840}
41
Erick Tryzelaar49d00b22012-09-24 16:55:4242pub type List = ~[Json];
Daniel Micaycc148b52013-04-03 13:28:3643pub type Object = HashMap<~str, Json>;
Erick Tryzelaar49d00b22012-09-24 16:55:4244
Andrew Paseltiner45677ee2013-03-22 20:09:2045#[deriving(Eq)]
Erick Tryzelaar49d00b22012-09-24 16:55:4246pub struct Error {
Erick Tryzelaar012dec52012-02-26 00:39:3247 line: uint,
48 col: uint,
Michael Sullivan92743dc2012-07-14 05:57:4849 msg: @~str,
Kevin Cantud47cb102012-08-30 23:39:5650}
51
Kevin Cantuc43426e2012-09-13 05:09:5552fn escape_str(s: &str) -> ~str {
Michael Sullivan92743dc2012-07-14 05:57:4853 let mut escaped = ~"\"";
Erick Tryzelaarcefecd82013-03-13 18:29:0554 for str::each_char(s) |c| {
Brian Andersonecaf9e32012-08-06 19:34:0855 match c {
Seo Sanghyeon8f803232013-05-23 16:09:1156 '"' => escaped += "\\\"",
57 '\\' => escaped += "\\\\",
58 '\x08' => escaped += "\\b",
59 '\x0c' => escaped += "\\f",
60 '\n' => escaped += "\\n",
61 '\r' => escaped += "\\r",
62 '\t' => escaped += "\\t",
Brian Anderson025d8662012-08-04 02:59:0463 _ => escaped += str::from_char(c)
Erick Tryzelaarb361f6c2012-06-13 00:20:5164 }
65 };
66
Seo Sanghyeon8f803232013-05-23 16:09:1167 escaped += "\"";
Erick Tryzelaarb361f6c2012-06-13 00:20:5168
69 escaped
70}
71
Erick Tryzelaar49d00b22012-09-24 16:55:4272fn spaces(n: uint) -> ~str {
73 let mut ss = ~"";
Tim Chevalier5a8ba072012-10-11 21:12:5074 for n.times { str::push_str(&mut ss, " "); }
Erick Tryzelaar49d00b22012-09-24 16:55:4275 return ss;
76}
77
Erick Tryzelaar8650c6f2012-12-18 03:31:0478pub struct Encoder {
Patrick Waltonb1c69982013-03-12 20:00:5079 priv wr: @io::Writer,
Erick Tryzelaar49d00b22012-09-24 16:55:4280}
81
Patrick Waltonb1c69982013-03-12 20:00:5082pub fn Encoder(wr: @io::Writer) -> Encoder {
Patrick Waltondc5df612013-05-02 00:54:5483 Encoder {
84 wr: wr
85 }
Erick Tryzelaar49d00b22012-09-24 16:55:4286}
87
Patrick Waltondc5df612013-05-02 00:54:5488impl serialize::Encoder for Encoder {
89 fn emit_nil(&mut self) { self.wr.write_str("null") }
90
91 fn emit_uint(&mut self, v: uint) { self.emit_float(v as float); }
92 fn emit_u64(&mut self, v: u64) { self.emit_float(v as float); }
93 fn emit_u32(&mut self, v: u32) { self.emit_float(v as float); }
94 fn emit_u16(&mut self, v: u16) { self.emit_float(v as float); }
95 fn emit_u8(&mut self, v: u8) { self.emit_float(v as float); }
96
97 fn emit_int(&mut self, v: int) { self.emit_float(v as float); }
98 fn emit_i64(&mut self, v: i64) { self.emit_float(v as float); }
99 fn emit_i32(&mut self, v: i32) { self.emit_float(v as float); }
100 fn emit_i16(&mut self, v: i16) { self.emit_float(v as float); }
101 fn emit_i8(&mut self, v: i8) { self.emit_float(v as float); }
102
103 fn emit_bool(&mut self, v: bool) {
104 if v {
105 self.wr.write_str("true");
106 } else {
107 self.wr.write_str("false");
108 }
109 }
110
111 fn emit_f64(&mut self, v: f64) { self.emit_float(v as float); }
112 fn emit_f32(&mut self, v: f32) { self.emit_float(v as float); }
113 fn emit_float(&mut self, v: float) {
114 self.wr.write_str(float::to_str_digits(v, 6u));
115 }
116
117 fn emit_char(&mut self, v: char) { self.emit_str(str::from_char(v)) }
118 fn emit_str(&mut self, v: &str) { self.wr.write_str(escape_str(v)) }
119
120 fn emit_enum(&mut self, _name: &str, f: &fn(&mut Encoder)) { f(self) }
121
122 fn emit_enum_variant(&mut self,
123 name: &str,
124 _id: uint,
125 cnt: uint,
126 f: &fn(&mut Encoder)) {
127 // enums are encoded as strings or vectors:
128 // Bunny => "Bunny"
129 // Kangaroo(34,"William") => ["Kangaroo",[34,"William"]]
130
131 if cnt == 0 {
132 self.wr.write_str(escape_str(name));
133 } else {
134 self.wr.write_char('[');
135 self.wr.write_str(escape_str(name));
136 self.wr.write_char(',');
137 f(self);
138 self.wr.write_char(']');
139 }
140 }
141
142 fn emit_enum_variant_arg(&mut self, idx: uint, f: &fn(&mut Encoder)) {
143 if idx != 0 {
144 self.wr.write_char(',');
145 }
146 f(self);
147 }
148
149 fn emit_enum_struct_variant(&mut self,
150 name: &str,
151 id: uint,
152 cnt: uint,
153 f: &fn(&mut Encoder)) {
154 self.emit_enum_variant(name, id, cnt, f)
155 }
156
157 fn emit_enum_struct_variant_field(&mut self,
158 _: &str,
159 idx: uint,
160 f: &fn(&mut Encoder)) {
161 self.emit_enum_variant_arg(idx, f)
162 }
163
164 fn emit_struct(&mut self, _: &str, _: uint, f: &fn(&mut Encoder)) {
165 self.wr.write_char('{');
166 f(self);
167 self.wr.write_char('}');
168 }
169
170 fn emit_struct_field(&mut self,
171 name: &str,
172 idx: uint,
173 f: &fn(&mut Encoder)) {
174 if idx != 0 { self.wr.write_char(','); }
175 self.wr.write_str(escape_str(name));
176 self.wr.write_char(':');
177 f(self);
178 }
179
180 fn emit_tuple(&mut self, len: uint, f: &fn(&mut Encoder)) {
181 self.emit_seq(len, f)
182 }
183 fn emit_tuple_arg(&mut self, idx: uint, f: &fn(&mut Encoder)) {
184 self.emit_seq_elt(idx, f)
185 }
186
187 fn emit_tuple_struct(&mut self,
188 _name: &str,
189 len: uint,
190 f: &fn(&mut Encoder)) {
191 self.emit_seq(len, f)
192 }
193 fn emit_tuple_struct_arg(&mut self, idx: uint, f: &fn(&mut Encoder)) {
194 self.emit_seq_elt(idx, f)
195 }
196
197 fn emit_option(&mut self, f: &fn(&mut Encoder)) { f(self); }
198 fn emit_option_none(&mut self) { self.emit_nil(); }
199 fn emit_option_some(&mut self, f: &fn(&mut Encoder)) { f(self); }
200
201 fn emit_seq(&mut self, _len: uint, f: &fn(&mut Encoder)) {
202 self.wr.write_char('[');
203 f(self);
204 self.wr.write_char(']');
205 }
206
207 fn emit_seq_elt(&mut self, idx: uint, f: &fn(&mut Encoder)) {
208 if idx != 0 {
209 self.wr.write_char(',');
210 }
211 f(self)
212 }
213
214 fn emit_map(&mut self, _len: uint, f: &fn(&mut Encoder)) {
215 self.wr.write_char('{');
216 f(self);
217 self.wr.write_char('}');
218 }
219
220 fn emit_map_elt_key(&mut self, idx: uint, f: &fn(&mut Encoder)) {
221 if idx != 0 { self.wr.write_char(','); }
222 f(self)
223 }
224
225 fn emit_map_elt_val(&mut self, _idx: uint, f: &fn(&mut Encoder)) {
226 self.wr.write_char(':');
227 f(self)
228 }
229}
230
Patrick Waltonc7522412013-05-04 00:55:53231pub struct PrettyEncoder {
232 priv wr: @io::Writer,
233 priv indent: uint,
234}
235
Patrick Waltonb1c69982013-03-12 20:00:50236pub fn PrettyEncoder(wr: @io::Writer) -> PrettyEncoder {
Patrick Waltondc5df612013-05-02 00:54:54237 PrettyEncoder {
238 wr: wr,
239 indent: 0,
240 }
Erick Tryzelaar49d00b22012-09-24 16:55:42241}
242
Patrick Waltondc5df612013-05-02 00:54:54243impl serialize::Encoder for PrettyEncoder {
244 fn emit_nil(&mut self) { self.wr.write_str("null") }
245
246 fn emit_uint(&mut self, v: uint) { self.emit_float(v as float); }
247 fn emit_u64(&mut self, v: u64) { self.emit_float(v as float); }
248 fn emit_u32(&mut self, v: u32) { self.emit_float(v as float); }
249 fn emit_u16(&mut self, v: u16) { self.emit_float(v as float); }
250 fn emit_u8(&mut self, v: u8) { self.emit_float(v as float); }
251
252 fn emit_int(&mut self, v: int) { self.emit_float(v as float); }
253 fn emit_i64(&mut self, v: i64) { self.emit_float(v as float); }
254 fn emit_i32(&mut self, v: i32) { self.emit_float(v as float); }
255 fn emit_i16(&mut self, v: i16) { self.emit_float(v as float); }
256 fn emit_i8(&mut self, v: i8) { self.emit_float(v as float); }
257
258 fn emit_bool(&mut self, v: bool) {
259 if v {
260 self.wr.write_str("true");
261 } else {
262 self.wr.write_str("false");
263 }
264 }
265
266 fn emit_f64(&mut self, v: f64) { self.emit_float(v as float); }
267 fn emit_f32(&mut self, v: f32) { self.emit_float(v as float); }
268 fn emit_float(&mut self, v: float) {
269 self.wr.write_str(float::to_str_digits(v, 6u));
270 }
271
272 fn emit_char(&mut self, v: char) { self.emit_str(str::from_char(v)) }
273 fn emit_str(&mut self, v: &str) { self.wr.write_str(escape_str(v)); }
274
275 fn emit_enum(&mut self, _name: &str, f: &fn(&mut PrettyEncoder)) {
276 f(self)
277 }
278
279 fn emit_enum_variant(&mut self,
280 name: &str,
281 _: uint,
282 cnt: uint,
283 f: &fn(&mut PrettyEncoder)) {
284 if cnt == 0 {
285 self.wr.write_str(escape_str(name));
286 } else {
287 self.wr.write_char('[');
288 self.indent += 2;
289 self.wr.write_char('\n');
290 self.wr.write_str(spaces(self.indent));
291 self.wr.write_str(escape_str(name));
292 self.wr.write_str(",\n");
293 f(self);
294 self.wr.write_char('\n');
295 self.indent -= 2;
296 self.wr.write_str(spaces(self.indent));
297 self.wr.write_char(']');
298 }
299 }
300
301 fn emit_enum_variant_arg(&mut self,
302 idx: uint,
303 f: &fn(&mut PrettyEncoder)) {
304 if idx != 0 {
305 self.wr.write_str(",\n");
306 }
307 self.wr.write_str(spaces(self.indent));
308 f(self)
309 }
310
311 fn emit_enum_struct_variant(&mut self,
312 name: &str,
313 id: uint,
314 cnt: uint,
315 f: &fn(&mut PrettyEncoder)) {
316 self.emit_enum_variant(name, id, cnt, f)
317 }
318
319 fn emit_enum_struct_variant_field(&mut self,
320 _: &str,
321 idx: uint,
322 f: &fn(&mut PrettyEncoder)) {
323 self.emit_enum_variant_arg(idx, f)
324 }
325
326
327 fn emit_struct(&mut self,
328 _: &str,
329 len: uint,
330 f: &fn(&mut PrettyEncoder)) {
331 if len == 0 {
332 self.wr.write_str("{}");
333 } else {
334 self.wr.write_char('{');
335 self.indent += 2;
336 f(self);
337 self.wr.write_char('\n');
338 self.indent -= 2;
339 self.wr.write_str(spaces(self.indent));
340 self.wr.write_char('}');
341 }
342 }
343
344 fn emit_struct_field(&mut self,
345 name: &str,
346 idx: uint,
347 f: &fn(&mut PrettyEncoder)) {
348 if idx == 0 {
349 self.wr.write_char('\n');
350 } else {
351 self.wr.write_str(",\n");
352 }
353 self.wr.write_str(spaces(self.indent));
354 self.wr.write_str(escape_str(name));
355 self.wr.write_str(": ");
356 f(self);
357 }
358
359 fn emit_tuple(&mut self, len: uint, f: &fn(&mut PrettyEncoder)) {
360 self.emit_seq(len, f)
361 }
362 fn emit_tuple_arg(&mut self, idx: uint, f: &fn(&mut PrettyEncoder)) {
363 self.emit_seq_elt(idx, f)
364 }
365
366 fn emit_tuple_struct(&mut self,
367 _: &str,
368 len: uint,
369 f: &fn(&mut PrettyEncoder)) {
370 self.emit_seq(len, f)
371 }
372 fn emit_tuple_struct_arg(&mut self,
373 idx: uint,
374 f: &fn(&mut PrettyEncoder)) {
375 self.emit_seq_elt(idx, f)
376 }
377
378 fn emit_option(&mut self, f: &fn(&mut PrettyEncoder)) { f(self); }
379 fn emit_option_none(&mut self) { self.emit_nil(); }
380 fn emit_option_some(&mut self, f: &fn(&mut PrettyEncoder)) { f(self); }
381
382 fn emit_seq(&mut self, len: uint, f: &fn(&mut PrettyEncoder)) {
383 if len == 0 {
384 self.wr.write_str("[]");
385 } else {
386 self.wr.write_char('[');
387 self.indent += 2;
388 f(self);
389 self.wr.write_char('\n');
390 self.indent -= 2;
391 self.wr.write_str(spaces(self.indent));
392 self.wr.write_char(']');
393 }
394 }
395
396 fn emit_seq_elt(&mut self, idx: uint, f: &fn(&mut PrettyEncoder)) {
397 if idx == 0 {
398 self.wr.write_char('\n');
399 } else {
400 self.wr.write_str(",\n");
401 }
402 self.wr.write_str(spaces(self.indent));
403 f(self)
404 }
405
406 fn emit_map(&mut self, len: uint, f: &fn(&mut PrettyEncoder)) {
407 if len == 0 {
408 self.wr.write_str("{}");
409 } else {
410 self.wr.write_char('{');
411 self.indent += 2;
412 f(self);
413 self.wr.write_char('\n');
414 self.indent -= 2;
415 self.wr.write_str(spaces(self.indent));
416 self.wr.write_char('}');
417 }
418 }
419
420 fn emit_map_elt_key(&mut self, idx: uint, f: &fn(&mut PrettyEncoder)) {
421 if idx == 0 {
422 self.wr.write_char('\n');
423 } else {
424 self.wr.write_str(",\n");
425 }
426 self.wr.write_str(spaces(self.indent));
427 f(self);
428 }
429
430 fn emit_map_elt_val(&mut self, _idx: uint, f: &fn(&mut PrettyEncoder)) {
431 self.wr.write_str(": ");
432 f(self);
433 }
434}
435
Patrick Waltondc5df612013-05-02 00:54:54436impl<E: serialize::Encoder> serialize::Encodable<E> for Json {
437 fn encode(&self, e: &mut E) {
438 match *self {
439 Number(v) => v.encode(e),
440 String(ref v) => v.encode(e),
441 Boolean(v) => v.encode(e),
442 List(ref v) => v.encode(e),
443 Object(ref v) => v.encode(e),
444 Null => e.emit_nil(),
445 }
446 }
447}
448
Erick Tryzelaar8650c6f2012-12-18 03:31:04449/// Encodes a json value into a io::writer
Patrick Waltondc5df612013-05-02 00:54:54450pub fn to_writer(wr: @io::Writer, json: &Json) {
451 let mut encoder = Encoder(wr);
452 json.encode(&mut encoder)
Erick Tryzelaar49d00b22012-09-24 16:55:42453}
454
Erick Tryzelaar8650c6f2012-12-18 03:31:04455/// Encodes a json value into a string
Patrick Waltonc1084092013-03-22 04:34:30456pub fn to_str(json: &Json) -> ~str {
Alex Crichton255193c2013-04-08 20:50:34457 io::with_str_writer(|wr| to_writer(wr, json))
Elly Jonesbd726262011-11-07 19:01:28458}
459
Erick Tryzelaar8650c6f2012-12-18 03:31:04460/// Encodes a json value into a io::writer
Patrick Waltondc5df612013-05-02 00:54:54461pub fn to_pretty_writer(wr: @io::Writer, json: &Json) {
462 let mut encoder = PrettyEncoder(wr);
463 json.encode(&mut encoder)
Kevin Cantud47cb102012-08-30 23:39:56464}
465
Erick Tryzelaar8650c6f2012-12-18 03:31:04466/// Encodes a json value into a string
Erick Tryzelaar49d00b22012-09-24 16:55:42467pub fn to_pretty_str(json: &Json) -> ~str {
468 io::with_str_writer(|wr| to_pretty_writer(wr, json))
Patrick Waltondb020ab2012-07-11 22:00:40469}
470
Erick Tryzelaar49d00b22012-09-24 16:55:42471pub struct Parser {
Patrick Waltonb1c69982013-03-12 20:00:50472 priv rdr: @io::Reader,
Alex Crichton3136fba2013-03-24 16:41:19473 priv ch: char,
474 priv line: uint,
475 priv col: uint,
Erick Tryzelaar49d00b22012-09-24 16:55:42476}
477
Erick Tryzelaar8650c6f2012-12-18 03:31:04478/// Decode a json value from an io::reader
Patrick Waltonb1c69982013-03-12 20:00:50479pub fn Parser(rdr: @io::Reader) -> Parser {
Erick Tryzelaar49d00b22012-09-24 16:55:42480 Parser {
481 rdr: rdr,
482 ch: rdr.read_char(),
Tim Chevalier90d06b82012-09-19 05:35:42483 line: 1,
484 col: 1,
Erick Tryzelaar49d00b22012-09-24 16:55:42485 }
486}
487
488pub impl Parser {
Alex Crichton3136fba2013-03-24 16:41:19489 fn parse(&mut self) -> Result<Json, Error> {
Luqman Aden4cf51c22013-02-15 07:30:30490 match self.parse_value() {
491 Ok(value) => {
Erick Tryzelaar49d00b22012-09-24 16:55:42492 // Skip trailing whitespaces.
493 self.parse_whitespace();
494 // Make sure there is no trailing characters.
495 if self.eof() {
Luqman Aden4cf51c22013-02-15 07:30:30496 Ok(value)
Erick Tryzelaar49d00b22012-09-24 16:55:42497 } else {
498 self.error(~"trailing characters")
499 }
500 }
Luqman Aden4cf51c22013-02-15 07:30:30501 Err(e) => Err(e)
Erick Tryzelaar49d00b22012-09-24 16:55:42502 }
503 }
504}
505
506priv impl Parser {
Ben Striegel0fed29c2013-03-08 02:11:09507 fn eof(&self) -> bool { self.ch == -1 as char }
Elly Jonesbd726262011-11-07 19:01:28508
Alex Crichton3136fba2013-03-24 16:41:19509 fn bump(&mut self) {
Erick Tryzelaar012dec52012-02-26 00:39:32510 self.ch = self.rdr.read_char();
511
512 if self.ch == '\n' {
513 self.line += 1u;
514 self.col = 1u;
515 } else {
516 self.col += 1u;
517 }
Elly Jonesbd726262011-11-07 19:01:28518 }
519
Alex Crichton3136fba2013-03-24 16:41:19520 fn next_char(&mut self) -> char {
Erick Tryzelaar012dec52012-02-26 00:39:32521 self.bump();
522 self.ch
Elly Jonesbd726262011-11-07 19:01:28523 }
524
Ben Striegel0fed29c2013-03-08 02:11:09525 fn error<T>(&self, msg: ~str) -> Result<T, Error> {
Erick Tryzelaar49d00b22012-09-24 16:55:42526 Err(Error { line: self.line, col: self.col, msg: @msg })
Elly Jonesbd726262011-11-07 19:01:28527 }
Elly Jonesbd726262011-11-07 19:01:28528
Alex Crichton3136fba2013-03-24 16:41:19529 fn parse_value(&mut self) -> Result<Json, Error> {
Erick Tryzelaar012dec52012-02-26 00:39:32530 self.parse_whitespace();
Elly Jonesbd726262011-11-07 19:01:28531
Brian Andersonb3559362012-08-02 00:30:05532 if self.eof() { return self.error(~"EOF while parsing value"); }
Erick Tryzelaar012dec52012-02-26 00:39:32533
Brian Andersonecaf9e32012-08-06 19:34:08534 match self.ch {
Alex Crichton82fa0012013-05-19 05:07:44535 'n' => self.parse_ident("ull", Null),
536 't' => self.parse_ident("rue", Boolean(true)),
537 'f' => self.parse_ident("alse", Boolean(false)),
Brian Anderson80c4f742012-09-02 01:38:05538 '0' .. '9' | '-' => self.parse_number(),
Erick Tryzelaar49d00b22012-09-24 16:55:42539 '"' =>
Luqman Aden4cf51c22013-02-15 07:30:30540 match self.parse_str() {
541 Ok(s) => Ok(String(s)),
542 Err(e) => Err(e),
Erick Tryzelaar49d00b22012-09-24 16:55:42543 },
Brian Anderson025d8662012-08-04 02:59:04544 '[' => self.parse_list(),
545 '{' => self.parse_object(),
546 _ => self.error(~"invalid syntax")
Erick Tryzelaar012dec52012-02-26 00:39:32547 }
548 }
549
Alex Crichton3136fba2013-03-24 16:41:19550 fn parse_whitespace(&mut self) {
Erick Tryzelaar012dec52012-02-26 00:39:32551 while char::is_whitespace(self.ch) { self.bump(); }
552 }
553
Alex Crichton3136fba2013-03-24 16:41:19554 fn parse_ident(&mut self, ident: &str, value: Json) -> Result<Json, Error> {
Brian Andersond1fc2b52012-06-30 23:19:07555 if str::all(ident, |c| c == self.next_char()) {
Erick Tryzelaar012dec52012-02-26 00:39:32556 self.bump();
Luqman Aden4cf51c22013-02-15 07:30:30557 Ok(value)
Erick Tryzelaar012dec52012-02-26 00:39:32558 } else {
Michael Sullivan92743dc2012-07-14 05:57:48559 self.error(~"invalid syntax")
Erick Tryzelaar012dec52012-02-26 00:39:32560 }
561 }
562
Alex Crichton3136fba2013-03-24 16:41:19563 fn parse_number(&mut self) -> Result<Json, Error> {
Niko Matsakis6b358752012-03-14 18:03:56564 let mut neg = 1f;
Erick Tryzelaar012dec52012-02-26 00:39:32565
566 if self.ch == '-' {
567 self.bump();
Marijn Haverbeke4f826d82011-12-16 09:11:00568 neg = -1f;
Elly Jonesbd726262011-11-07 19:01:28569 }
Elly Jonesbd726262011-11-07 19:01:28570
Brian Andersonecaf9e32012-08-06 19:34:08571 let mut res = match self.parse_integer() {
Brian Anderson0c6e4702012-08-26 23:54:31572 Ok(res) => res,
573 Err(e) => return Err(e)
Erick Tryzelaar012dec52012-02-26 00:39:32574 };
575
576 if self.ch == '.' {
Brian Andersonecaf9e32012-08-06 19:34:08577 match self.parse_decimal(res) {
Brian Anderson0c6e4702012-08-26 23:54:31578 Ok(r) => res = r,
579 Err(e) => return Err(e)
Elly Jonesbd726262011-11-07 19:01:28580 }
Elly Jonesbd726262011-11-07 19:01:28581 }
Erick Tryzelaar012dec52012-02-26 00:39:32582
583 if self.ch == 'e' || self.ch == 'E' {
Brian Andersonecaf9e32012-08-06 19:34:08584 match self.parse_exponent(res) {
Brian Anderson0c6e4702012-08-26 23:54:31585 Ok(r) => res = r,
586 Err(e) => return Err(e)
Erick Tryzelaar012dec52012-02-26 00:39:32587 }
588 }
589
Erick Tryzelaar49d00b22012-09-24 16:55:42590 Ok(Number(neg * res))
Elly Jonesbd726262011-11-07 19:01:28591 }
592
Alex Crichton3136fba2013-03-24 16:41:19593 fn parse_integer(&mut self) -> Result<float, Error> {
Niko Matsakis6b358752012-03-14 18:03:56594 let mut res = 0f;
Erick Tryzelaar012dec52012-02-26 00:39:32595
Brian Andersonecaf9e32012-08-06 19:34:08596 match self.ch {
Brian Anderson025d8662012-08-04 02:59:04597 '0' => {
Erick Tryzelaar012dec52012-02-26 00:39:32598 self.bump();
599
600 // There can be only one leading '0'.
Brian Andersonecaf9e32012-08-06 19:34:08601 match self.ch {
Brian Anderson80c4f742012-09-02 01:38:05602 '0' .. '9' => return self.error(~"invalid number"),
Brian Anderson025d8662012-08-04 02:59:04603 _ => ()
Erick Tryzelaar012dec52012-02-26 00:39:32604 }
605 }
Brian Anderson80c4f742012-09-02 01:38:05606 '1' .. '9' => {
Erick Tryzelaar012dec52012-02-26 00:39:32607 while !self.eof() {
Brian Andersonecaf9e32012-08-06 19:34:08608 match self.ch {
Brian Anderson80c4f742012-09-02 01:38:05609 '0' .. '9' => {
Erick Tryzelaar012dec52012-02-26 00:39:32610 res *= 10f;
611 res += ((self.ch as int) - ('0' as int)) as float;
612
613 self.bump();
614 }
Brian Anderson025d8662012-08-04 02:59:04615 _ => break
Erick Tryzelaar012dec52012-02-26 00:39:32616 }
617 }
618 }
Brian Anderson025d8662012-08-04 02:59:04619 _ => return self.error(~"invalid number")
Erick Tryzelaar012dec52012-02-26 00:39:32620 }
621
Brian Anderson0c6e4702012-08-26 23:54:31622 Ok(res)
Elly Jonesbd726262011-11-07 19:01:28623 }
624
Alex Crichton3136fba2013-03-24 16:41:19625 fn parse_decimal(&mut self, res: float) -> Result<float, Error> {
Erick Tryzelaar012dec52012-02-26 00:39:32626 self.bump();
627
628 // Make sure a digit follows the decimal place.
Brian Andersonecaf9e32012-08-06 19:34:08629 match self.ch {
Brian Anderson80c4f742012-09-02 01:38:05630 '0' .. '9' => (),
Brian Anderson025d8662012-08-04 02:59:04631 _ => return self.error(~"invalid number")
Erick Tryzelaar012dec52012-02-26 00:39:32632 }
633
Niko Matsakis6b358752012-03-14 18:03:56634 let mut res = res;
635 let mut dec = 1f;
Erick Tryzelaar012dec52012-02-26 00:39:32636 while !self.eof() {
Brian Andersonecaf9e32012-08-06 19:34:08637 match self.ch {
Brian Anderson80c4f742012-09-02 01:38:05638 '0' .. '9' => {
Marijn Haverbeke4f826d82011-12-16 09:11:00639 dec /= 10f;
Erick Tryzelaar012dec52012-02-26 00:39:32640 res += (((self.ch as int) - ('0' as int)) as float) * dec;
641
642 self.bump();
643 }
Brian Anderson025d8662012-08-04 02:59:04644 _ => break
Elly Jonesbd726262011-11-07 19:01:28645 }
Elly Jonesbd726262011-11-07 19:01:28646 }
Elly Jonesbd726262011-11-07 19:01:28647
Brian Anderson0c6e4702012-08-26 23:54:31648 Ok(res)
Erick Tryzelaar012dec52012-02-26 00:39:32649 }
650
Alex Crichton3136fba2013-03-24 16:41:19651 fn parse_exponent(&mut self, mut res: float) -> Result<float, Error> {
Erick Tryzelaar012dec52012-02-26 00:39:32652 self.bump();
653
Niko Matsakis6b358752012-03-14 18:03:56654 let mut exp = 0u;
655 let mut neg_exp = false;
Erick Tryzelaar012dec52012-02-26 00:39:32656
Brian Andersonecaf9e32012-08-06 19:34:08657 match self.ch {
Brian Anderson025d8662012-08-04 02:59:04658 '+' => self.bump(),
659 '-' => { self.bump(); neg_exp = true; }
660 _ => ()
Erick Tryzelaar012dec52012-02-26 00:39:32661 }
662
663 // Make sure a digit follows the exponent place.
Brian Andersonecaf9e32012-08-06 19:34:08664 match self.ch {
Brian Anderson80c4f742012-09-02 01:38:05665 '0' .. '9' => (),
Brian Anderson025d8662012-08-04 02:59:04666 _ => return self.error(~"invalid number")
Erick Tryzelaar012dec52012-02-26 00:39:32667 }
668
669 while !self.eof() {
Brian Andersonecaf9e32012-08-06 19:34:08670 match self.ch {
Brian Anderson80c4f742012-09-02 01:38:05671 '0' .. '9' => {
Erick Tryzelaar012dec52012-02-26 00:39:32672 exp *= 10u;
673 exp += (self.ch as uint) - ('0' as uint);
674
675 self.bump();
676 }
Brian Anderson025d8662012-08-04 02:59:04677 _ => break
Erick Tryzelaar012dec52012-02-26 00:39:32678 }
679 }
680
681 let exp = float::pow_with_uint(10u, exp);
682 if neg_exp {
683 res /= exp;
684 } else {
685 res *= exp;
686 }
687
Brian Anderson0c6e4702012-08-26 23:54:31688 Ok(res)
Erick Tryzelaar012dec52012-02-26 00:39:32689 }
690
Alex Crichton3136fba2013-03-24 16:41:19691 fn parse_str(&mut self) -> Result<~str, Error> {
Niko Matsakis6b358752012-03-14 18:03:56692 let mut escape = false;
Michael Sullivan92743dc2012-07-14 05:57:48693 let mut res = ~"";
Erick Tryzelaar012dec52012-02-26 00:39:32694
695 while !self.eof() {
696 self.bump();
697
698 if (escape) {
Brian Andersonecaf9e32012-08-06 19:34:08699 match self.ch {
Tim Chevalier5a8ba072012-10-11 21:12:50700 '"' => str::push_char(&mut res, '"'),
701 '\\' => str::push_char(&mut res, '\\'),
702 '/' => str::push_char(&mut res, '/'),
703 'b' => str::push_char(&mut res, '\x08'),
704 'f' => str::push_char(&mut res, '\x0c'),
705 'n' => str::push_char(&mut res, '\n'),
706 'r' => str::push_char(&mut res, '\r'),
707 't' => str::push_char(&mut res, '\t'),
Brian Anderson025d8662012-08-04 02:59:04708 'u' => {
Erick Tryzelaar012dec52012-02-26 00:39:32709 // Parse \u1234.
Niko Matsakis6b358752012-03-14 18:03:56710 let mut i = 0u;
711 let mut n = 0u;
Erick Tryzelaar012dec52012-02-26 00:39:32712 while i < 4u {
Brian Andersonecaf9e32012-08-06 19:34:08713 match self.next_char() {
Brian Anderson80c4f742012-09-02 01:38:05714 '0' .. '9' => {
Kevin Cantu4fb675b2012-08-31 03:12:10715 n = n * 16u + (self.ch as uint)
716 - ('0' as uint);
717 },
718 'a' | 'A' => n = n * 16u + 10u,
719 'b' | 'B' => n = n * 16u + 11u,
720 'c' | 'C' => n = n * 16u + 12u,
721 'd' | 'D' => n = n * 16u + 13u,
722 'e' | 'E' => n = n * 16u + 14u,
723 'f' | 'F' => n = n * 16u + 15u,
724 _ => return self.error(
725 ~"invalid \\u escape (unrecognized hex)")
Erick Tryzelaar012dec52012-02-26 00:39:32726 }
Niko Matsakis6b358752012-03-14 18:03:56727 i += 1u;
Erick Tryzelaar012dec52012-02-26 00:39:32728 }
729
730 // Error out if we didn't parse 4 digits.
731 if i != 4u {
Kevin Cantu4fb675b2012-08-31 03:12:10732 return self.error(
733 ~"invalid \\u escape (not four digits)");
Erick Tryzelaar012dec52012-02-26 00:39:32734 }
735
Tim Chevalier5a8ba072012-10-11 21:12:50736 str::push_char(&mut res, n as char);
Erick Tryzelaar012dec52012-02-26 00:39:32737 }
Brian Anderson025d8662012-08-04 02:59:04738 _ => return self.error(~"invalid escape")
Erick Tryzelaar012dec52012-02-26 00:39:32739 }
740 escape = false;
741 } else if self.ch == '\\' {
742 escape = true;
743 } else {
744 if self.ch == '"' {
745 self.bump();
Erick Tryzelaar49d00b22012-09-24 16:55:42746 return Ok(res);
Erick Tryzelaar012dec52012-02-26 00:39:32747 }
Tim Chevalier5a8ba072012-10-11 21:12:50748 str::push_char(&mut res, self.ch);
Erick Tryzelaar012dec52012-02-26 00:39:32749 }
750 }
751
Michael Sullivan92743dc2012-07-14 05:57:48752 self.error(~"EOF while parsing string")
Erick Tryzelaar012dec52012-02-26 00:39:32753 }
754
Alex Crichton3136fba2013-03-24 16:41:19755 fn parse_list(&mut self) -> Result<Json, Error> {
Erick Tryzelaar012dec52012-02-26 00:39:32756 self.bump();
757 self.parse_whitespace();
758
Michael Sullivan98e161f2012-06-29 23:26:56759 let mut values = ~[];
Erick Tryzelaar012dec52012-02-26 00:39:32760
761 if self.ch == ']' {
762 self.bump();
Luqman Aden4cf51c22013-02-15 07:30:30763 return Ok(List(values));
Erick Tryzelaar012dec52012-02-26 00:39:32764 }
765
Tim Chevalier35400e12012-03-11 04:34:17766 loop {
Luqman Aden4cf51c22013-02-15 07:30:30767 match self.parse_value() {
768 Ok(v) => values.push(v),
769 Err(e) => return Err(e)
Erick Tryzelaar012dec52012-02-26 00:39:32770 }
771
772 self.parse_whitespace();
Tim Chevalier35400e12012-03-11 04:34:17773 if self.eof() {
Brian Andersonb3559362012-08-02 00:30:05774 return self.error(~"EOF while parsing list");
Tim Chevalier35400e12012-03-11 04:34:17775 }
Erick Tryzelaar012dec52012-02-26 00:39:32776
Brian Andersonecaf9e32012-08-06 19:34:08777 match self.ch {
Brian Anderson025d8662012-08-04 02:59:04778 ',' => self.bump(),
Luqman Aden4cf51c22013-02-15 07:30:30779 ']' => { self.bump(); return Ok(List(values)); }
Brian Anderson025d8662012-08-04 02:59:04780 _ => return self.error(~"expected `,` or `]`")
Erick Tryzelaar012dec52012-02-26 00:39:32781 }
Tim Chevalier35400e12012-03-11 04:34:17782 };
Erick Tryzelaar012dec52012-02-26 00:39:32783 }
784
Alex Crichton3136fba2013-03-24 16:41:19785 fn parse_object(&mut self) -> Result<Json, Error> {
Erick Tryzelaar012dec52012-02-26 00:39:32786 self.bump();
787 self.parse_whitespace();
788
Daniel Micaycc148b52013-04-03 13:28:36789 let mut values = ~HashMap::new();
Erick Tryzelaar012dec52012-02-26 00:39:32790
791 if self.ch == '}' {
792 self.bump();
Luqman Aden4cf51c22013-02-15 07:30:30793 return Ok(Object(values));
Erick Tryzelaar012dec52012-02-26 00:39:32794 }
795
796 while !self.eof() {
797 self.parse_whitespace();
798
799 if self.ch != '"' {
Brian Andersonb3559362012-08-02 00:30:05800 return self.error(~"key must be a string");
Erick Tryzelaar012dec52012-02-26 00:39:32801 }
802
Luqman Aden4cf51c22013-02-15 07:30:30803 let key = match self.parse_str() {
804 Ok(key) => key,
805 Err(e) => return Err(e)
Erick Tryzelaar012dec52012-02-26 00:39:32806 };
807
808 self.parse_whitespace();
809
810 if self.ch != ':' {
811 if self.eof() { break; }
Brian Andersonb3559362012-08-02 00:30:05812 return self.error(~"expected `:`");
Erick Tryzelaar012dec52012-02-26 00:39:32813 }
814 self.bump();
815
Luqman Aden4cf51c22013-02-15 07:30:30816 match self.parse_value() {
817 Ok(value) => { values.insert(key, value); }
818 Err(e) => return Err(e)
Erick Tryzelaar012dec52012-02-26 00:39:32819 }
820 self.parse_whitespace();
821
Brian Andersonecaf9e32012-08-06 19:34:08822 match self.ch {
Brian Anderson025d8662012-08-04 02:59:04823 ',' => self.bump(),
Luqman Aden4cf51c22013-02-15 07:30:30824 '}' => { self.bump(); return Ok(Object(values)); }
Brian Anderson025d8662012-08-04 02:59:04825 _ => {
Erick Tryzelaar012dec52012-02-26 00:39:32826 if self.eof() { break; }
Brian Andersonb3559362012-08-02 00:30:05827 return self.error(~"expected `,` or `}`");
Erick Tryzelaar012dec52012-02-26 00:39:32828 }
829 }
830 }
831
Brian Andersonb3559362012-08-02 00:30:05832 return self.error(~"EOF while parsing object");
Elly Jonesbd726262011-11-07 19:01:28833 }
834}
835
Patrick Waltonb1c69982013-03-12 20:00:50836/// Decodes a json value from an @io::Reader
837pub fn from_reader(rdr: @io::Reader) -> Result<Json, Error> {
Alex Crichton3136fba2013-03-24 16:41:19838 let mut parser = Parser(rdr);
839 parser.parse()
Elly Jonesbd726262011-11-07 19:01:28840}
841
Erick Tryzelaar8650c6f2012-12-18 03:31:04842/// Decodes a json value from a string
Erick Tryzelaar49d00b22012-09-24 16:55:42843pub fn from_str(s: &str) -> Result<Json, Error> {
844 do io::with_str_reader(s) |rdr| {
845 from_reader(rdr)
846 }
Erick Tryzelaar012dec52012-02-26 00:39:32847}
848
Patrick Waltonc7522412013-05-04 00:55:53849pub struct Decoder {
850 priv stack: ~[Json],
851}
852
Erick Tryzelaar8650c6f2012-12-18 03:31:04853pub fn Decoder(json: Json) -> Decoder {
Patrick Waltondc5df612013-05-02 00:54:54854 Decoder {
855 stack: ~[json]
856 }
Elly Jonesbd726262011-11-07 19:01:28857}
Brian Anderson6e27b272012-01-18 03:05:07858
Patrick Waltondc5df612013-05-02 00:54:54859impl serialize::Decoder for Decoder {
860 fn read_nil(&mut self) -> () {
861 debug!("read_nil");
862 match self.stack.pop() {
863 Null => (),
Björn Steinbrinkbdc182c2013-05-05 22:18:51864 value => fail!("not a null: %?", value)
Patrick Waltondc5df612013-05-02 00:54:54865 }
866 }
867
868 fn read_u64(&mut self) -> u64 { self.read_float() as u64 }
869 fn read_u32(&mut self) -> u32 { self.read_float() as u32 }
870 fn read_u16(&mut self) -> u16 { self.read_float() as u16 }
871 fn read_u8 (&mut self) -> u8 { self.read_float() as u8 }
872 fn read_uint(&mut self) -> uint { self.read_float() as uint }
873
874 fn read_i64(&mut self) -> i64 { self.read_float() as i64 }
875 fn read_i32(&mut self) -> i32 { self.read_float() as i32 }
876 fn read_i16(&mut self) -> i16 { self.read_float() as i16 }
877 fn read_i8 (&mut self) -> i8 { self.read_float() as i8 }
878 fn read_int(&mut self) -> int { self.read_float() as int }
879
880 fn read_bool(&mut self) -> bool {
881 debug!("read_bool");
882 match self.stack.pop() {
883 Boolean(b) => b,
Björn Steinbrinkbdc182c2013-05-05 22:18:51884 value => fail!("not a boolean: %?", value)
Patrick Waltondc5df612013-05-02 00:54:54885 }
886 }
887
888 fn read_f64(&mut self) -> f64 { self.read_float() as f64 }
889 fn read_f32(&mut self) -> f32 { self.read_float() as f32 }
890 fn read_float(&mut self) -> float {
891 debug!("read_float");
892 match self.stack.pop() {
893 Number(f) => f,
Björn Steinbrinkbdc182c2013-05-05 22:18:51894 value => fail!("not a number: %?", value)
Patrick Waltondc5df612013-05-02 00:54:54895 }
896 }
897
898 fn read_char(&mut self) -> char {
899 let mut v = ~[];
900 for str::each_char(self.read_str()) |c| { v.push(c) }
Björn Steinbrinkbdc182c2013-05-05 22:18:51901 if v.len() != 1 { fail!("string must have one character") }
Patrick Waltondc5df612013-05-02 00:54:54902 v[0]
903 }
904
905 fn read_str(&mut self) -> ~str {
906 debug!("read_str");
907 match self.stack.pop() {
908 String(s) => s,
Björn Steinbrinkbdc182c2013-05-05 22:18:51909 json => fail!("not a string: %?", json)
Patrick Waltondc5df612013-05-02 00:54:54910 }
911 }
912
913 fn read_enum<T>(&mut self, name: &str, f: &fn(&mut Decoder) -> T) -> T {
914 debug!("read_enum(%s)", name);
915 f(self)
916 }
917
918 fn read_enum_variant<T>(&mut self,
919 names: &[&str],
920 f: &fn(&mut Decoder, uint) -> T)
921 -> T {
922 debug!("read_enum_variant(names=%?)", names);
923 let name = match self.stack.pop() {
924 String(s) => s,
925 List(list) => {
926 do vec::consume_reverse(list) |_i, v| {
927 self.stack.push(v);
928 }
929 match self.stack.pop() {
930 String(s) => s,
Björn Steinbrinkbdc182c2013-05-05 22:18:51931 value => fail!("invalid variant name: %?", value),
Patrick Waltondc5df612013-05-02 00:54:54932 }
933 }
Björn Steinbrinkbdc182c2013-05-05 22:18:51934 ref json => fail!("invalid variant: %?", *json),
Patrick Waltondc5df612013-05-02 00:54:54935 };
936 let idx = match vec::position(names, |n| str::eq_slice(*n, name)) {
937 Some(idx) => idx,
Björn Steinbrinkbdc182c2013-05-05 22:18:51938 None => fail!("Unknown variant name: %?", name),
Patrick Waltondc5df612013-05-02 00:54:54939 };
940 f(self, idx)
941 }
942
943 fn read_enum_variant_arg<T>(&mut self,
944 idx: uint,
945 f: &fn(&mut Decoder) -> T)
946 -> T {
947 debug!("read_enum_variant_arg(idx=%u)", idx);
948 f(self)
949 }
950
951 fn read_enum_struct_variant<T>(&mut self,
952 names: &[&str],
953 f: &fn(&mut Decoder, uint) -> T)
954 -> T {
955 debug!("read_enum_struct_variant(names=%?)", names);
956 self.read_enum_variant(names, f)
957 }
958
959
960 fn read_enum_struct_variant_field<T>(&mut self,
961 name: &str,
962 idx: uint,
963 f: &fn(&mut Decoder) -> T)
964 -> T {
965 debug!("read_enum_struct_variant_field(name=%?, idx=%u)", name, idx);
966 self.read_enum_variant_arg(idx, f)
967 }
968
969 fn read_struct<T>(&mut self,
970 name: &str,
971 len: uint,
972 f: &fn(&mut Decoder) -> T)
973 -> T {
974 debug!("read_struct(name=%s, len=%u)", name, len);
975 let value = f(self);
976 self.stack.pop();
977 value
978 }
979
Patrick Waltondc5df612013-05-02 00:54:54980 fn read_struct_field<T>(&mut self,
981 name: &str,
982 idx: uint,
983 f: &fn(&mut Decoder) -> T)
984 -> T {
985 debug!("read_struct_field(name=%?, idx=%u)", name, idx);
986 match self.stack.pop() {
987 Object(obj) => {
988 let mut obj = obj;
989 let value = match obj.pop(&name.to_owned()) {
Björn Steinbrinkbdc182c2013-05-05 22:18:51990 None => fail!("no such field: %s", name),
Patrick Waltondc5df612013-05-02 00:54:54991 Some(json) => {
992 self.stack.push(json);
993 f(self)
994 }
995 };
996 self.stack.push(Object(obj));
997 value
998 }
Björn Steinbrinkbdc182c2013-05-05 22:18:51999 value => fail!("not an object: %?", value)
Patrick Waltondc5df612013-05-02 00:54:541000 }
1001 }
1002
1003 fn read_tuple<T>(&mut self, f: &fn(&mut Decoder, uint) -> T) -> T {
1004 debug!("read_tuple()");
1005 self.read_seq(f)
1006 }
1007
1008 fn read_tuple_arg<T>(&mut self,
1009 idx: uint,
1010 f: &fn(&mut Decoder) -> T)
1011 -> T {
1012 debug!("read_tuple_arg(idx=%u)", idx);
1013 self.read_seq_elt(idx, f)
1014 }
1015
1016 fn read_tuple_struct<T>(&mut self,
1017 name: &str,
1018 f: &fn(&mut Decoder, uint) -> T)
1019 -> T {
1020 debug!("read_tuple_struct(name=%?)", name);
1021 self.read_tuple(f)
1022 }
1023
1024 fn read_tuple_struct_arg<T>(&mut self,
1025 idx: uint,
1026 f: &fn(&mut Decoder) -> T)
1027 -> T {
1028 debug!("read_tuple_struct_arg(idx=%u)", idx);
1029 self.read_tuple_arg(idx, f)
1030 }
1031
1032 fn read_option<T>(&mut self, f: &fn(&mut Decoder, bool) -> T) -> T {
1033 match self.stack.pop() {
1034 Null => f(self, false),
1035 value => { self.stack.push(value); f(self, true) }
1036 }
1037 }
1038
1039 fn read_seq<T>(&mut self, f: &fn(&mut Decoder, uint) -> T) -> T {
1040 debug!("read_seq()");
1041 let len = match self.stack.pop() {
1042 List(list) => {
1043 let len = list.len();
1044 do vec::consume_reverse(list) |_i, v| {
1045 self.stack.push(v);
1046 }
1047 len
1048 }
Björn Steinbrinkbdc182c2013-05-05 22:18:511049 _ => fail!("not a list"),
Patrick Waltondc5df612013-05-02 00:54:541050 };
1051 f(self, len)
1052 }
1053
1054 fn read_seq_elt<T>(&mut self, idx: uint, f: &fn(&mut Decoder) -> T) -> T {
1055 debug!("read_seq_elt(idx=%u)", idx);
1056 f(self)
1057 }
1058
1059 fn read_map<T>(&mut self, f: &fn(&mut Decoder, uint) -> T) -> T {
1060 debug!("read_map()");
1061 let len = match self.stack.pop() {
1062 Object(obj) => {
1063 let mut obj = obj;
1064 let len = obj.len();
1065 do obj.consume |key, value| {
1066 self.stack.push(value);
1067 self.stack.push(String(key));
1068 }
1069 len
1070 }
Björn Steinbrinkbdc182c2013-05-05 22:18:511071 json => fail!("not an object: %?", json),
Patrick Waltondc5df612013-05-02 00:54:541072 };
1073 f(self, len)
1074 }
1075
1076 fn read_map_elt_key<T>(&mut self,
1077 idx: uint,
1078 f: &fn(&mut Decoder) -> T)
1079 -> T {
1080 debug!("read_map_elt_key(idx=%u)", idx);
1081 f(self)
1082 }
1083
1084 fn read_map_elt_val<T>(&mut self, idx: uint, f: &fn(&mut Decoder) -> T)
1085 -> T {
1086 debug!("read_map_elt_val(idx=%u)", idx);
1087 f(self)
1088 }
1089}
1090
Patrick Walton91436882013-02-14 19:47:001091impl Eq for Json {
Patrick Waltonc1084092013-03-22 04:34:301092 fn eq(&self, other: &Json) -> bool {
Tim Chevalier3e7da962013-01-11 04:09:161093 match (self) {
1094 &Number(f0) =>
1095 match other { &Number(f1) => f0 == f1, _ => false },
1096 &String(ref s0) =>
1097 match other { &String(ref s1) => s0 == s1, _ => false },
1098 &Boolean(b0) =>
1099 match other { &Boolean(b1) => b0 == b1, _ => false },
1100 &Null =>
1101 match other { &Null => true, _ => false },
1102 &List(ref v0) =>
1103 match other { &List(ref v1) => v0 == v1, _ => false },
1104 &Object(ref d0) => {
1105 match other {
1106 &Object(ref d1) => {
Patrick Walton318e5342012-11-15 02:59:301107 if d0.len() == d1.len() {
1108 let mut equal = true;
Niko Matsakis5606fc02013-04-06 15:22:361109 for d0.each |k, v0| {
Daniel Micayee0a8c62013-01-23 16:47:431110 match d1.find(k) {
Patrick Walton318e5342012-11-15 02:59:301111 Some(v1) if v0 == v1 => { },
1112 _ => { equal = false; break }
1113 }
1114 };
1115 equal
1116 } else {
1117 false
1118 }
1119 }
1120 _ => false
1121 }
1122 }
1123 }
1124 }
Patrick Waltonc1084092013-03-22 04:34:301125 fn ne(&self, other: &Json) -> bool { !self.eq(other) }
Erick Tryzelaar49d00b22012-09-24 16:55:421126}
1127
Patrick Walton22b87572012-09-08 01:53:141128/// Test if two json values are less than one another
Patrick Walton91436882013-02-14 19:47:001129impl Ord for Json {
Patrick Waltonc1084092013-03-22 04:34:301130 fn lt(&self, other: &Json) -> bool {
Patrick Walton318e5342012-11-15 02:59:301131 match (*self) {
1132 Number(f0) => {
1133 match *other {
1134 Number(f1) => f0 < f1,
1135 String(_) | Boolean(_) | List(_) | Object(_) |
1136 Null => true
1137 }
1138 }
1139
1140 String(ref s0) => {
1141 match *other {
1142 Number(_) => false,
1143 String(ref s1) => s0 < s1,
1144 Boolean(_) | List(_) | Object(_) | Null => true
1145 }
1146 }
1147
1148 Boolean(b0) => {
1149 match *other {
1150 Number(_) | String(_) => false,
1151 Boolean(b1) => b0 < b1,
1152 List(_) | Object(_) | Null => true
1153 }
1154 }
1155
Patrick Walton98fdcb02012-12-08 03:34:571156 List(ref l0) => {
Patrick Walton318e5342012-11-15 02:59:301157 match *other {
1158 Number(_) | String(_) | Boolean(_) => false,
Patrick Walton98fdcb02012-12-08 03:34:571159 List(ref l1) => (*l0) < (*l1),
Patrick Walton318e5342012-11-15 02:59:301160 Object(_) | Null => true
1161 }
1162 }
1163
1164 Object(ref d0) => {
1165 match *other {
1166 Number(_) | String(_) | Boolean(_) | List(_) => false,
1167 Object(ref d1) => {
Alex Crichton255193c2013-04-08 20:50:341168 let mut d0_flat = ~[];
1169 let mut d1_flat = ~[];
Patrick Walton318e5342012-11-15 02:59:301170
Alex Crichton255193c2013-04-08 20:50:341171 // FIXME #4430: this is horribly inefficient...
Niko Matsakis5606fc02013-04-06 15:22:361172 for d0.each |k, v| {
Alex Crichton255193c2013-04-08 20:50:341173 d0_flat.push((@copy *k, @copy *v));
Patrick Walton318e5342012-11-15 02:59:301174 }
Alex Crichton255193c2013-04-08 20:50:341175 d0_flat.qsort();
1176
Niko Matsakis5606fc02013-04-06 15:22:361177 for d1.each |k, v| {
Alex Crichton255193c2013-04-08 20:50:341178 d1_flat.push((@copy *k, @copy *v));
1179 }
1180 d1_flat.qsort();
1181
1182 d0_flat < d1_flat
Patrick Walton318e5342012-11-15 02:59:301183 }
1184 Null => true
1185 }
1186 }
1187
1188 Null => {
1189 match *other {
1190 Number(_) | String(_) | Boolean(_) | List(_) |
1191 Object(_) =>
1192 false,
1193 Null => true
1194 }
1195 }
1196 }
1197 }
Patrick Waltonc1084092013-03-22 04:34:301198 fn le(&self, other: &Json) -> bool { !(*other).lt(&(*self)) }
1199 fn ge(&self, other: &Json) -> bool { !(*self).lt(other) }
1200 fn gt(&self, other: &Json) -> bool { (*other).lt(&(*self)) }
Patrick Walton22b87572012-09-08 01:53:141201}
1202
Ben Striegel0fed29c2013-03-08 02:11:091203trait ToJson { fn to_json(&self) -> Json; }
Erick Tryzelaared5af702012-05-28 19:10:321204
Patrick Walton91436882013-02-14 19:47:001205impl ToJson for Json {
Ben Striegel0fed29c2013-03-08 02:11:091206 fn to_json(&self) -> Json { copy *self }
Erick Tryzelaared5af702012-05-28 19:10:321207}
1208
Patrick Walton91436882013-02-14 19:47:001209impl ToJson for @Json {
Ben Striegel0fed29c2013-03-08 02:11:091210 fn to_json(&self) -> Json { (**self).to_json() }
Erick Tryzelaar11a56c32012-06-13 15:30:541211}
1212
Patrick Walton91436882013-02-14 19:47:001213impl ToJson for int {
Ben Striegel0fed29c2013-03-08 02:11:091214 fn to_json(&self) -> Json { Number(*self as float) }
Erick Tryzelaar11a56c32012-06-13 15:30:541215}
1216
Patrick Walton91436882013-02-14 19:47:001217impl ToJson for i8 {
Ben Striegel0fed29c2013-03-08 02:11:091218 fn to_json(&self) -> Json { Number(*self as float) }
Erick Tryzelaared5af702012-05-28 19:10:321219}
1220
Patrick Walton91436882013-02-14 19:47:001221impl ToJson for i16 {
Ben Striegel0fed29c2013-03-08 02:11:091222 fn to_json(&self) -> Json { Number(*self as float) }
Erick Tryzelaared5af702012-05-28 19:10:321223}
1224
Patrick Walton91436882013-02-14 19:47:001225impl ToJson for i32 {
Ben Striegel0fed29c2013-03-08 02:11:091226 fn to_json(&self) -> Json { Number(*self as float) }
Erick Tryzelaared5af702012-05-28 19:10:321227}
1228
Patrick Walton91436882013-02-14 19:47:001229impl ToJson for i64 {
Ben Striegel0fed29c2013-03-08 02:11:091230 fn to_json(&self) -> Json { Number(*self as float) }
Erick Tryzelaared5af702012-05-28 19:10:321231}
1232
Patrick Walton91436882013-02-14 19:47:001233impl ToJson for uint {
Ben Striegel0fed29c2013-03-08 02:11:091234 fn to_json(&self) -> Json { Number(*self as float) }
Erick Tryzelaar11a56c32012-06-13 15:30:541235}
1236
Patrick Walton91436882013-02-14 19:47:001237impl ToJson for u8 {
Ben Striegel0fed29c2013-03-08 02:11:091238 fn to_json(&self) -> Json { Number(*self as float) }
Erick Tryzelaared5af702012-05-28 19:10:321239}
1240
Patrick Walton91436882013-02-14 19:47:001241impl ToJson for u16 {
Ben Striegel0fed29c2013-03-08 02:11:091242 fn to_json(&self) -> Json { Number(*self as float) }
Erick Tryzelaared5af702012-05-28 19:10:321243}
1244
Patrick Walton91436882013-02-14 19:47:001245impl ToJson for u32 {
Ben Striegel0fed29c2013-03-08 02:11:091246 fn to_json(&self) -> Json { Number(*self as float) }
Erick Tryzelaared5af702012-05-28 19:10:321247}
1248
Patrick Walton91436882013-02-14 19:47:001249impl ToJson for u64 {
Ben Striegel0fed29c2013-03-08 02:11:091250 fn to_json(&self) -> Json { Number(*self as float) }
Erick Tryzelaared5af702012-05-28 19:10:321251}
1252
Patrick Walton91436882013-02-14 19:47:001253impl ToJson for float {
Ben Striegel0fed29c2013-03-08 02:11:091254 fn to_json(&self) -> Json { Number(*self) }
Erick Tryzelaared5af702012-05-28 19:10:321255}
1256
Patrick Walton91436882013-02-14 19:47:001257impl ToJson for f32 {
Ben Striegel0fed29c2013-03-08 02:11:091258 fn to_json(&self) -> Json { Number(*self as float) }
Erick Tryzelaared5af702012-05-28 19:10:321259}
1260
Patrick Walton91436882013-02-14 19:47:001261impl ToJson for f64 {
Ben Striegel0fed29c2013-03-08 02:11:091262 fn to_json(&self) -> Json { Number(*self as float) }
Erick Tryzelaared5af702012-05-28 19:10:321263}
1264
Patrick Walton91436882013-02-14 19:47:001265impl ToJson for () {
Ben Striegel0fed29c2013-03-08 02:11:091266 fn to_json(&self) -> Json { Null }
Erick Tryzelaared5af702012-05-28 19:10:321267}
1268
Patrick Walton91436882013-02-14 19:47:001269impl ToJson for bool {
Ben Striegel0fed29c2013-03-08 02:11:091270 fn to_json(&self) -> Json { Boolean(*self) }
Erick Tryzelaared5af702012-05-28 19:10:321271}
1272
Patrick Walton91436882013-02-14 19:47:001273impl ToJson for ~str {
Ben Striegel0fed29c2013-03-08 02:11:091274 fn to_json(&self) -> Json { String(copy *self) }
Erick Tryzelaarb361f6c2012-06-13 00:20:511275}
1276
Patrick Walton91436882013-02-14 19:47:001277impl ToJson for @~str {
Ben Striegel0fed29c2013-03-08 02:11:091278 fn to_json(&self) -> Json { String(copy **self) }
Erick Tryzelaared5af702012-05-28 19:10:321279}
1280
Patrick Waltonbf2a2252013-02-21 01:07:171281impl<A:ToJson,B:ToJson> ToJson for (A, B) {
Ben Striegel0fed29c2013-03-08 02:11:091282 fn to_json(&self) -> Json {
1283 match *self {
Brian Andersonbc9efaa2012-09-28 07:22:181284 (ref a, ref b) => {
Erick Tryzelaar49d00b22012-09-24 16:55:421285 List(~[a.to_json(), b.to_json()])
Niko Matsakis97452c02012-08-02 22:42:561286 }
1287 }
Erick Tryzelaared5af702012-05-28 19:10:321288 }
1289}
1290
Patrick Waltonbf2a2252013-02-21 01:07:171291impl<A:ToJson,B:ToJson,C:ToJson> ToJson for (A, B, C) {
Ben Striegel0fed29c2013-03-08 02:11:091292 fn to_json(&self) -> Json {
1293 match *self {
Brian Andersonbc9efaa2012-09-28 07:22:181294 (ref a, ref b, ref c) => {
Erick Tryzelaar49d00b22012-09-24 16:55:421295 List(~[a.to_json(), b.to_json(), c.to_json()])
Niko Matsakis97452c02012-08-02 22:42:561296 }
1297 }
Erick Tryzelaared5af702012-05-28 19:10:321298 }
1299}
1300
Patrick Waltonbf2a2252013-02-21 01:07:171301impl<A:ToJson> ToJson for ~[A] {
Ben Striegel0fed29c2013-03-08 02:11:091302 fn to_json(&self) -> Json { List(self.map(|elt| elt.to_json())) }
Erick Tryzelaared5af702012-05-28 19:10:321303}
1304
Daniel Micaycc148b52013-04-03 13:28:361305impl<A:ToJson + Copy> ToJson for HashMap<~str, A> {
Ben Striegel0fed29c2013-03-08 02:11:091306 fn to_json(&self) -> Json {
Daniel Micaycc148b52013-04-03 13:28:361307 let mut d = HashMap::new();
Niko Matsakis5606fc02013-04-06 15:22:361308 for self.each |key, value| {
Erick Tryzelaar49d00b22012-09-24 16:55:421309 d.insert(copy *key, value.to_json());
Erick Tryzelaared5af702012-05-28 19:10:321310 }
Erick Tryzelaar49d00b22012-09-24 16:55:421311 Object(~d)
Erick Tryzelaared5af702012-05-28 19:10:321312 }
1313}
1314
Patrick Waltonbf2a2252013-02-21 01:07:171315impl<A:ToJson> ToJson for Option<A> {
Ben Striegel0fed29c2013-03-08 02:11:091316 fn to_json(&self) -> Json {
1317 match *self {
Ben Striegela605fd02012-08-11 14:08:421318 None => Null,
Brian Andersonbc9efaa2012-09-28 07:22:181319 Some(ref value) => value.to_json()
Erick Tryzelaared5af702012-05-28 19:10:321320 }
1321 }
1322}
1323
Patrick Walton91436882013-02-14 19:47:001324impl to_str::ToStr for Json {
Patrick Waltonc1084092013-03-22 04:34:301325 fn to_str(&self) -> ~str { to_str(self) }
Erick Tryzelaared5af702012-05-28 19:10:321326}
1327
Patrick Walton91436882013-02-14 19:47:001328impl to_str::ToStr for Error {
Patrick Waltonc1084092013-03-22 04:34:301329 fn to_str(&self) -> ~str {
Paul Stansifer29f32b42012-08-23 00:24:521330 fmt!("%u:%u: %s", self.line, self.col, *self.msg)
Erick Tryzelaara8161762012-06-11 15:32:381331 }
1332}
1333
Brian Anderson6e27b272012-01-18 03:05:071334#[cfg(test)]
1335mod tests {
Patrick Waltonee528652013-05-22 00:24:311336 use core::prelude::*;
1337
Erick Tryzelaarb2908632013-03-27 00:46:291338 use super::*;
1339
Daniel Micaycc148b52013-04-03 13:28:361340 use core::hashmap::HashMap;
Patrick Walton206ab892013-05-25 02:35:291341 use core::io;
1342 use core::result;
John Clementsf91160b2013-02-08 01:06:261343
Erick Tryzelaarb10b8c32013-03-27 07:13:011344 use std::serialize::Decodable;
1345
Huon Wilson5dc5efe2013-05-15 22:55:571346 #[deriving(Eq, Encodable, Decodable)]
Erick Tryzelaar9bbf3842013-03-30 18:08:571347 enum Animal {
1348 Dog,
1349 Frog(~str, int)
1350 }
1351
Huon Wilson5dc5efe2013-05-15 22:55:571352 #[deriving(Eq, Encodable, Decodable)]
Erick Tryzelaar5b7d6082013-03-30 20:31:031353 struct Inner {
1354 a: (),
1355 b: uint,
1356 c: ~[~str],
1357 }
1358
Huon Wilson5dc5efe2013-05-15 22:55:571359 #[deriving(Eq, Encodable, Decodable)]
Erick Tryzelaar5b7d6082013-03-30 20:31:031360 struct Outer {
1361 inner: ~[Inner],
1362 }
1363
Erick Tryzelaar49d00b22012-09-24 16:55:421364 fn mk_object(items: &[(~str, Json)]) -> Json {
Daniel Micaycc148b52013-04-03 13:28:361365 let mut d = ~HashMap::new();
Erick Tryzelaar012dec52012-02-26 00:39:321366
Erick Tryzelaar49d00b22012-09-24 16:55:421367 for items.each |item| {
1368 match *item {
Luqman Aden4cf51c22013-02-15 07:30:301369 (copy key, copy value) => { d.insert(key, value); },
Erick Tryzelaar49d00b22012-09-24 16:55:421370 }
Erick Tryzelaar012dec52012-02-26 00:39:321371 };
1372
Luqman Aden4cf51c22013-02-15 07:30:301373 Object(d)
Brian Anderson6e27b272012-01-18 03:05:071374 }
1375
1376 #[test]
Erick Tryzelaar012dec52012-02-26 00:39:321377 fn test_write_null() {
Erick Tryzelaar6cf99fa2013-03-27 00:23:001378 assert_eq!(to_str(&Null), ~"null");
Erick Tryzelaar9bbf3842013-03-30 18:08:571379 assert_eq!(to_pretty_str(&Null), ~"null");
Brian Anderson6e27b272012-01-18 03:05:071380 }
1381
Erick Tryzelaar9bbf3842013-03-30 18:08:571382
Brian Anderson6e27b272012-01-18 03:05:071383 #[test]
Erick Tryzelaar49d00b22012-09-24 16:55:421384 fn test_write_number() {
Erick Tryzelaar6cf99fa2013-03-27 00:23:001385 assert_eq!(to_str(&Number(3f)), ~"3");
Erick Tryzelaar9bbf3842013-03-30 18:08:571386 assert_eq!(to_pretty_str(&Number(3f)), ~"3");
1387
Erick Tryzelaar6cf99fa2013-03-27 00:23:001388 assert_eq!(to_str(&Number(3.1f)), ~"3.1");
Erick Tryzelaar9bbf3842013-03-30 18:08:571389 assert_eq!(to_pretty_str(&Number(3.1f)), ~"3.1");
1390
Erick Tryzelaar6cf99fa2013-03-27 00:23:001391 assert_eq!(to_str(&Number(-1.5f)), ~"-1.5");
Erick Tryzelaar9bbf3842013-03-30 18:08:571392 assert_eq!(to_pretty_str(&Number(-1.5f)), ~"-1.5");
1393
Erick Tryzelaar6cf99fa2013-03-27 00:23:001394 assert_eq!(to_str(&Number(0.5f)), ~"0.5");
Erick Tryzelaar9bbf3842013-03-30 18:08:571395 assert_eq!(to_pretty_str(&Number(0.5f)), ~"0.5");
Brian Anderson6e27b272012-01-18 03:05:071396 }
1397
1398 #[test]
Erick Tryzelaar012dec52012-02-26 00:39:321399 fn test_write_str() {
Erick Tryzelaar6cf99fa2013-03-27 00:23:001400 assert_eq!(to_str(&String(~"")), ~"\"\"");
Erick Tryzelaar9bbf3842013-03-30 18:08:571401 assert_eq!(to_pretty_str(&String(~"")), ~"\"\"");
1402
Erick Tryzelaar6cf99fa2013-03-27 00:23:001403 assert_eq!(to_str(&String(~"foo")), ~"\"foo\"");
Erick Tryzelaar9bbf3842013-03-30 18:08:571404 assert_eq!(to_pretty_str(&String(~"foo")), ~"\"foo\"");
Brian Anderson6e27b272012-01-18 03:05:071405 }
1406
1407 #[test]
Erick Tryzelaar012dec52012-02-26 00:39:321408 fn test_write_bool() {
Erick Tryzelaar6cf99fa2013-03-27 00:23:001409 assert_eq!(to_str(&Boolean(true)), ~"true");
Erick Tryzelaar9bbf3842013-03-30 18:08:571410 assert_eq!(to_pretty_str(&Boolean(true)), ~"true");
1411
Erick Tryzelaar6cf99fa2013-03-27 00:23:001412 assert_eq!(to_str(&Boolean(false)), ~"false");
Erick Tryzelaar9bbf3842013-03-30 18:08:571413 assert_eq!(to_pretty_str(&Boolean(false)), ~"false");
Brian Anderson6e27b272012-01-18 03:05:071414 }
1415
1416 #[test]
Erick Tryzelaar012dec52012-02-26 00:39:321417 fn test_write_list() {
Erick Tryzelaar6cf99fa2013-03-27 00:23:001418 assert_eq!(to_str(&List(~[])), ~"[]");
Erick Tryzelaarc9188c82013-03-27 00:34:491419 assert_eq!(to_pretty_str(&List(~[])), ~"[]");
Erick Tryzelaar9bbf3842013-03-30 18:08:571420
1421 assert_eq!(to_str(&List(~[Boolean(true)])), ~"[true]");
Erick Tryzelaarc9188c82013-03-27 00:34:491422 assert_eq!(
1423 to_pretty_str(&List(~[Boolean(true)])),
1424 ~"\
1425 [\n \
1426 true\n\
1427 ]"
1428 );
Erick Tryzelaar9bbf3842013-03-30 18:08:571429
1430 assert_eq!(to_str(&List(~[
1431 Boolean(false),
1432 Null,
1433 List(~[String(~"foo\nbar"), Number(3.5f)])
1434 ])), ~"[false,null,[\"foo\\nbar\",3.5]]");
Erick Tryzelaarc9188c82013-03-27 00:34:491435 assert_eq!(
1436 to_pretty_str(&List(~[
1437 Boolean(false),
1438 Null,
1439 List(~[String(~"foo\nbar"), Number(3.5f)])
1440 ])),
1441 ~"\
1442 [\n \
1443 false,\n \
1444 null,\n \
1445 [\n \
1446 \"foo\\nbar\",\n \
1447 3.5\n \
1448 ]\n\
1449 ]"
1450 );
1451 }
1452
1453 #[test]
Erick Tryzelaar49d00b22012-09-24 16:55:421454 fn test_write_object() {
Erick Tryzelaar609a9e62013-05-23 16:39:001455 assert_eq!(to_str(&mk_object([])), ~"{}");
1456 assert_eq!(to_pretty_str(&mk_object([])), ~"{}");
Erick Tryzelaar9bbf3842013-03-30 18:08:571457
Erick Tryzelaar6cf99fa2013-03-27 00:23:001458 assert_eq!(
Erick Tryzelaar609a9e62013-05-23 16:39:001459 to_str(&mk_object([(~"a", Boolean(true))])),
Erick Tryzelaar6cf99fa2013-03-27 00:23:001460 ~"{\"a\":true}"
1461 );
Erick Tryzelaarc9188c82013-03-27 00:34:491462 assert_eq!(
Erick Tryzelaar609a9e62013-05-23 16:39:001463 to_pretty_str(&mk_object([(~"a", Boolean(true))])),
Erick Tryzelaar9bbf3842013-03-30 18:08:571464 ~"\
1465 {\n \
1466 \"a\": true\n\
1467 }"
1468 );
1469
1470 assert_eq!(
Erick Tryzelaar609a9e62013-05-23 16:39:001471 to_str(&mk_object([
Erick Tryzelaarc9188c82013-03-27 00:34:491472 (~"b", List(~[
Erick Tryzelaar609a9e62013-05-23 16:39:001473 mk_object([(~"c", String(~"\x0c\r"))]),
1474 mk_object([(~"d", String(~""))])
Erick Tryzelaarc9188c82013-03-27 00:34:491475 ]))
1476 ])),
1477 ~"{\
1478 \"b\":[\
1479 {\"c\":\"\\f\\r\"},\
1480 {\"d\":\"\"}\
1481 ]\
1482 }"
1483 );
Erick Tryzelaarc9188c82013-03-27 00:34:491484 assert_eq!(
Erick Tryzelaar609a9e62013-05-23 16:39:001485 to_pretty_str(&mk_object([
Erick Tryzelaarc9188c82013-03-27 00:34:491486 (~"b", List(~[
Erick Tryzelaar609a9e62013-05-23 16:39:001487 mk_object([(~"c", String(~"\x0c\r"))]),
1488 mk_object([(~"d", String(~""))])
Erick Tryzelaarc9188c82013-03-27 00:34:491489 ]))
1490 ])),
1491 ~"\
1492 {\n \
1493 \"b\": [\n \
1494 {\n \
1495 \"c\": \"\\f\\r\"\n \
1496 },\n \
1497 {\n \
1498 \"d\": \"\"\n \
1499 }\n \
1500 ]\n\
1501 }"
1502 );
Erick Tryzelaar9bbf3842013-03-30 18:08:571503
Erick Tryzelaar609a9e62013-05-23 16:39:001504 let a = mk_object([
Erick Tryzelaarc9188c82013-03-27 00:34:491505 (~"a", Boolean(true)),
1506 (~"b", List(~[
Erick Tryzelaar609a9e62013-05-23 16:39:001507 mk_object([(~"c", String(~"\x0c\r"))]),
1508 mk_object([(~"d", String(~""))])
Erick Tryzelaarc9188c82013-03-27 00:34:491509 ]))
1510 ]);
Erick Tryzelaar9bbf3842013-03-30 18:08:571511
Erick Tryzelaarc9188c82013-03-27 00:34:491512 // We can't compare the strings directly because the object fields be
1513 // printed in a different order.
Erick Tryzelaar9bbf3842013-03-30 18:08:571514 assert_eq!(copy a, from_str(to_str(&a)).unwrap());
1515 assert_eq!(copy a, from_str(to_pretty_str(&a)).unwrap());
Erick Tryzelaarc9188c82013-03-27 00:34:491516 }
1517
1518 #[test]
Erick Tryzelaar9bbf3842013-03-30 18:08:571519 fn test_write_enum() {
Erick Tryzelaarc9188c82013-03-27 00:34:491520 let animal = Dog;
Erick Tryzelaarc9188c82013-03-27 00:34:491521 assert_eq!(
Erick Tryzelaar9bbf3842013-03-30 18:08:571522 do io::with_str_writer |wr| {
Patrick Waltondc5df612013-05-02 00:54:541523 let mut encoder = Encoder(wr);
1524 animal.encode(&mut encoder);
Erick Tryzelaar9bbf3842013-03-30 18:08:571525 },
1526 ~"\"Dog\""
1527 );
1528 assert_eq!(
1529 do io::with_str_writer |wr| {
Patrick Waltondc5df612013-05-02 00:54:541530 let mut encoder = PrettyEncoder(wr);
1531 animal.encode(&mut encoder);
Erick Tryzelaar9bbf3842013-03-30 18:08:571532 },
1533 ~"\"Dog\""
1534 );
1535
1536 let animal = Frog(~"Henry", 349);
1537 assert_eq!(
1538 do io::with_str_writer |wr| {
Patrick Waltondc5df612013-05-02 00:54:541539 let mut encoder = Encoder(wr);
1540 animal.encode(&mut encoder);
Erick Tryzelaar9bbf3842013-03-30 18:08:571541 },
1542 ~"[\"Frog\",\"Henry\",349]"
1543 );
1544 assert_eq!(
1545 do io::with_str_writer |wr| {
Patrick Waltondc5df612013-05-02 00:54:541546 let mut encoder = PrettyEncoder(wr);
1547 animal.encode(&mut encoder);
Erick Tryzelaar9bbf3842013-03-30 18:08:571548 },
Erick Tryzelaarc9188c82013-03-27 00:34:491549 ~"\
1550 [\n \
1551 \"Frog\",\n \
Erick Tryzelaar4d995e62013-03-27 07:14:521552 \"Henry\",\n \
1553 349\n\
Erick Tryzelaarc9188c82013-03-27 00:34:491554 ]"
1555 );
John Clementsc952c042013-02-08 23:36:401556 }
1557
1558 #[test]
Erick Tryzelaar6cf99fa2013-03-27 00:23:001559 fn test_write_some() {
1560 let value = Some(~"jodhpurs");
1561 let s = do io::with_str_writer |wr| {
Patrick Waltondc5df612013-05-02 00:54:541562 let mut encoder = Encoder(wr);
1563 value.encode(&mut encoder);
Erick Tryzelaar6cf99fa2013-03-27 00:23:001564 };
1565 assert_eq!(s, ~"\"jodhpurs\"");
John Clementsc952c042013-02-08 23:36:401566
Erick Tryzelaarc9188c82013-03-27 00:34:491567 let value = Some(~"jodhpurs");
1568 let s = do io::with_str_writer |wr| {
Patrick Waltondc5df612013-05-02 00:54:541569 let mut encoder = PrettyEncoder(wr);
1570 value.encode(&mut encoder);
Erick Tryzelaarc9188c82013-03-27 00:34:491571 };
1572 assert_eq!(s, ~"\"jodhpurs\"");
1573 }
1574
1575 #[test]
Erick Tryzelaar6cf99fa2013-03-27 00:23:001576 fn test_write_none() {
1577 let value: Option<~str> = None;
1578 let s = do io::with_str_writer |wr| {
Patrick Waltondc5df612013-05-02 00:54:541579 let mut encoder = Encoder(wr);
1580 value.encode(&mut encoder);
Erick Tryzelaar6cf99fa2013-03-27 00:23:001581 };
1582 assert_eq!(s, ~"null");
John Clementsf91160b2013-02-08 01:06:261583
Erick Tryzelaarc9188c82013-03-27 00:34:491584 let s = do io::with_str_writer |wr| {
Patrick Waltondc5df612013-05-02 00:54:541585 let mut encoder = Encoder(wr);
1586 value.encode(&mut encoder);
Erick Tryzelaarc9188c82013-03-27 00:34:491587 };
1588 assert_eq!(s, ~"null");
1589 }
1590
1591 #[test]
Erick Tryzelaar012dec52012-02-26 00:39:321592 fn test_trailing_characters() {
Erick Tryzelaar609a9e62013-05-23 16:39:001593 assert_eq!(from_str("nulla"),
Patrick Waltond7e74b52013-03-06 21:58:021594 Err(Error {line: 1u, col: 5u, msg: @~"trailing characters"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001595 assert_eq!(from_str("truea"),
Patrick Waltond7e74b52013-03-06 21:58:021596 Err(Error {line: 1u, col: 5u, msg: @~"trailing characters"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001597 assert_eq!(from_str("falsea"),
Patrick Waltond7e74b52013-03-06 21:58:021598 Err(Error {line: 1u, col: 6u, msg: @~"trailing characters"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001599 assert_eq!(from_str("1a"),
Patrick Waltond7e74b52013-03-06 21:58:021600 Err(Error {line: 1u, col: 2u, msg: @~"trailing characters"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001601 assert_eq!(from_str("[]a"),
Patrick Waltond7e74b52013-03-06 21:58:021602 Err(Error {line: 1u, col: 3u, msg: @~"trailing characters"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001603 assert_eq!(from_str("{}a"),
Patrick Waltond7e74b52013-03-06 21:58:021604 Err(Error {line: 1u, col: 3u, msg: @~"trailing characters"}));
Erick Tryzelaar012dec52012-02-26 00:39:321605 }
1606
1607 #[test]
1608 fn test_read_identifiers() {
Erick Tryzelaar609a9e62013-05-23 16:39:001609 assert_eq!(from_str("n"),
Patrick Waltond7e74b52013-03-06 21:58:021610 Err(Error {line: 1u, col: 2u, msg: @~"invalid syntax"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001611 assert_eq!(from_str("nul"),
Patrick Waltond7e74b52013-03-06 21:58:021612 Err(Error {line: 1u, col: 4u, msg: @~"invalid syntax"}));
Erick Tryzelaar012dec52012-02-26 00:39:321613
Erick Tryzelaar609a9e62013-05-23 16:39:001614 assert_eq!(from_str("t"),
Patrick Waltond7e74b52013-03-06 21:58:021615 Err(Error {line: 1u, col: 2u, msg: @~"invalid syntax"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001616 assert_eq!(from_str("truz"),
Patrick Waltond7e74b52013-03-06 21:58:021617 Err(Error {line: 1u, col: 4u, msg: @~"invalid syntax"}));
Erick Tryzelaar012dec52012-02-26 00:39:321618
Erick Tryzelaar609a9e62013-05-23 16:39:001619 assert_eq!(from_str("f"),
Patrick Waltond7e74b52013-03-06 21:58:021620 Err(Error {line: 1u, col: 2u, msg: @~"invalid syntax"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001621 assert_eq!(from_str("faz"),
Patrick Waltond7e74b52013-03-06 21:58:021622 Err(Error {line: 1u, col: 3u, msg: @~"invalid syntax"}));
Erick Tryzelaar012dec52012-02-26 00:39:321623
Erick Tryzelaar609a9e62013-05-23 16:39:001624 assert_eq!(from_str("null"), Ok(Null));
1625 assert_eq!(from_str("true"), Ok(Boolean(true)));
1626 assert_eq!(from_str("false"), Ok(Boolean(false)));
1627 assert_eq!(from_str(" null "), Ok(Null));
1628 assert_eq!(from_str(" true "), Ok(Boolean(true)));
1629 assert_eq!(from_str(" false "), Ok(Boolean(false)));
Erick Tryzelaar012dec52012-02-26 00:39:321630 }
1631
1632 #[test]
Erick Tryzelaar5b7d6082013-03-30 20:31:031633 fn test_decode_identifiers() {
Erick Tryzelaar609a9e62013-05-23 16:39:001634 let mut decoder = Decoder(from_str("null").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541635 let v: () = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031636 assert_eq!(v, ());
1637
Erick Tryzelaar609a9e62013-05-23 16:39:001638 let mut decoder = Decoder(from_str("true").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541639 let v: bool = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031640 assert_eq!(v, true);
1641
Erick Tryzelaar609a9e62013-05-23 16:39:001642 let mut decoder = Decoder(from_str("false").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541643 let v: bool = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031644 assert_eq!(v, false);
1645 }
1646
1647 #[test]
Erick Tryzelaar49d00b22012-09-24 16:55:421648 fn test_read_number() {
Erick Tryzelaar609a9e62013-05-23 16:39:001649 assert_eq!(from_str("+"),
Patrick Waltond7e74b52013-03-06 21:58:021650 Err(Error {line: 1u, col: 1u, msg: @~"invalid syntax"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001651 assert_eq!(from_str("."),
Patrick Waltond7e74b52013-03-06 21:58:021652 Err(Error {line: 1u, col: 1u, msg: @~"invalid syntax"}));
Erick Tryzelaar012dec52012-02-26 00:39:321653
Erick Tryzelaar609a9e62013-05-23 16:39:001654 assert_eq!(from_str("-"),
Patrick Waltond7e74b52013-03-06 21:58:021655 Err(Error {line: 1u, col: 2u, msg: @~"invalid number"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001656 assert_eq!(from_str("00"),
Patrick Waltond7e74b52013-03-06 21:58:021657 Err(Error {line: 1u, col: 2u, msg: @~"invalid number"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001658 assert_eq!(from_str("1."),
Patrick Waltond7e74b52013-03-06 21:58:021659 Err(Error {line: 1u, col: 3u, msg: @~"invalid number"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001660 assert_eq!(from_str("1e"),
Patrick Waltond7e74b52013-03-06 21:58:021661 Err(Error {line: 1u, col: 3u, msg: @~"invalid number"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001662 assert_eq!(from_str("1e+"),
Patrick Waltond7e74b52013-03-06 21:58:021663 Err(Error {line: 1u, col: 4u, msg: @~"invalid number"}));
Erick Tryzelaar012dec52012-02-26 00:39:321664
Erick Tryzelaar609a9e62013-05-23 16:39:001665 assert_eq!(from_str("3"), Ok(Number(3f)));
1666 assert_eq!(from_str("3.1"), Ok(Number(3.1f)));
1667 assert_eq!(from_str("-1.2"), Ok(Number(-1.2f)));
1668 assert_eq!(from_str("0.4"), Ok(Number(0.4f)));
1669 assert_eq!(from_str("0.4e5"), Ok(Number(0.4e5f)));
1670 assert_eq!(from_str("0.4e+15"), Ok(Number(0.4e15f)));
1671 assert_eq!(from_str("0.4e-01"), Ok(Number(0.4e-01f)));
1672 assert_eq!(from_str(" 3 "), Ok(Number(3f)));
Erick Tryzelaar012dec52012-02-26 00:39:321673 }
1674
1675 #[test]
Erick Tryzelaar5b7d6082013-03-30 20:31:031676 fn test_decode_numbers() {
Erick Tryzelaar609a9e62013-05-23 16:39:001677 let mut decoder = Decoder(from_str("3").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, 3f);
1680
Erick Tryzelaar609a9e62013-05-23 16:39:001681 let mut decoder = Decoder(from_str("3.1").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, 3.1f);
1684
Erick Tryzelaar609a9e62013-05-23 16:39:001685 let mut decoder = Decoder(from_str("-1.2").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, -1.2f);
1688
Erick Tryzelaar609a9e62013-05-23 16:39:001689 let mut decoder = Decoder(from_str("0.4").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.4f);
1692
Erick Tryzelaar609a9e62013-05-23 16:39:001693 let mut decoder = Decoder(from_str("0.4e5").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.4e5f);
1696
Erick Tryzelaar609a9e62013-05-23 16:39:001697 let mut decoder = Decoder(from_str("0.4e15").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541698 let v: float = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031699 assert_eq!(v, 0.4e15f);
1700
Erick Tryzelaar609a9e62013-05-23 16:39:001701 let mut decoder = Decoder(from_str("0.4e-01").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541702 let v: float = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031703 assert_eq!(v, 0.4e-01f);
1704 }
1705
1706 #[test]
Erick Tryzelaar012dec52012-02-26 00:39:321707 fn test_read_str() {
Erick Tryzelaar609a9e62013-05-23 16:39:001708 assert_eq!(from_str("\""),
Patrick Waltond7e74b52013-03-06 21:58:021709 Err(Error {line: 1u, col: 2u, msg: @~"EOF while parsing string"
1710 }));
Erick Tryzelaar609a9e62013-05-23 16:39:001711 assert_eq!(from_str("\"lol"),
Patrick Waltond7e74b52013-03-06 21:58:021712 Err(Error {line: 1u, col: 5u, msg: @~"EOF while parsing string"
1713 }));
Erick Tryzelaar012dec52012-02-26 00:39:321714
Erick Tryzelaar609a9e62013-05-23 16:39:001715 assert_eq!(from_str("\"\""), Ok(String(~"")));
1716 assert_eq!(from_str("\"foo\""), Ok(String(~"foo")));
1717 assert_eq!(from_str("\"\\\"\""), Ok(String(~"\"")));
1718 assert_eq!(from_str("\"\\b\""), Ok(String(~"\x08")));
1719 assert_eq!(from_str("\"\\n\""), Ok(String(~"\n")));
1720 assert_eq!(from_str("\"\\r\""), Ok(String(~"\r")));
1721 assert_eq!(from_str("\"\\t\""), Ok(String(~"\t")));
1722 assert_eq!(from_str(" \"foo\" "), Ok(String(~"foo")));
1723 assert_eq!(from_str("\"\\u12ab\""), Ok(String(~"\u12ab")));
1724 assert_eq!(from_str("\"\\uAB12\""), Ok(String(~"\uAB12")));
Erick Tryzelaar012dec52012-02-26 00:39:321725 }
1726
1727 #[test]
Erick Tryzelaar5b7d6082013-03-30 20:31:031728 fn test_decode_str() {
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("\"foo\"").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, ~"foo");
1736
Erick Tryzelaar609a9e62013-05-23 16:39:001737 let mut decoder = Decoder(from_str("\"\\\"\"").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, ~"\"");
1740
Erick Tryzelaar609a9e62013-05-23 16:39:001741 let mut decoder = Decoder(from_str("\"\\b\"").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, ~"\x08");
1744
Erick Tryzelaar609a9e62013-05-23 16:39:001745 let mut decoder = Decoder(from_str("\"\\n\"").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, ~"\n");
1748
Erick Tryzelaar609a9e62013-05-23 16:39:001749 let mut decoder = Decoder(from_str("\"\\r\"").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, ~"\r");
1752
Erick Tryzelaar609a9e62013-05-23 16:39:001753 let mut decoder = Decoder(from_str("\"\\t\"").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, ~"\t");
1756
Erick Tryzelaar609a9e62013-05-23 16:39:001757 let mut decoder = Decoder(from_str("\"\\u12ab\"").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541758 let v: ~str = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031759 assert_eq!(v, ~"\u12ab");
1760
Erick Tryzelaar609a9e62013-05-23 16:39:001761 let mut decoder = Decoder(from_str("\"\\uAB12\"").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541762 let v: ~str = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031763 assert_eq!(v, ~"\uAB12");
Kevin Cantucf386182012-08-31 04:03:191764 }
1765
1766 #[test]
Erick Tryzelaar012dec52012-02-26 00:39:321767 fn test_read_list() {
Erick Tryzelaar609a9e62013-05-23 16:39:001768 assert_eq!(from_str("["),
Patrick Waltond7e74b52013-03-06 21:58:021769 Err(Error {line: 1u, col: 2u, msg: @~"EOF while parsing value"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001770 assert_eq!(from_str("[1"),
Patrick Waltond7e74b52013-03-06 21:58:021771 Err(Error {line: 1u, col: 3u, msg: @~"EOF while parsing list"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001772 assert_eq!(from_str("[1,"),
Patrick Waltond7e74b52013-03-06 21:58:021773 Err(Error {line: 1u, col: 4u, msg: @~"EOF while parsing value"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001774 assert_eq!(from_str("[1,]"),
Patrick Waltond7e74b52013-03-06 21:58:021775 Err(Error {line: 1u, col: 4u, msg: @~"invalid syntax"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001776 assert_eq!(from_str("[6 7]"),
Patrick Waltond7e74b52013-03-06 21:58:021777 Err(Error {line: 1u, col: 4u, msg: @~"expected `,` or `]`"}));
Erick Tryzelaar012dec52012-02-26 00:39:321778
Erick Tryzelaar609a9e62013-05-23 16:39:001779 assert_eq!(from_str("[]"), Ok(List(~[])));
1780 assert_eq!(from_str("[ ]"), Ok(List(~[])));
1781 assert_eq!(from_str("[true]"), Ok(List(~[Boolean(true)])));
1782 assert_eq!(from_str("[ false ]"), Ok(List(~[Boolean(false)])));
1783 assert_eq!(from_str("[null]"), Ok(List(~[Null])));
1784 assert_eq!(from_str("[3, 1]"),
Patrick Waltond7e74b52013-03-06 21:58:021785 Ok(List(~[Number(3f), Number(1f)])));
Erick Tryzelaar609a9e62013-05-23 16:39:001786 assert_eq!(from_str("\n[3, 2]\n"),
Patrick Waltond7e74b52013-03-06 21:58:021787 Ok(List(~[Number(3f), Number(2f)])));
Erick Tryzelaar609a9e62013-05-23 16:39:001788 assert_eq!(from_str("[2, [4, 1]]"),
Patrick Waltond7e74b52013-03-06 21:58:021789 Ok(List(~[Number(2f), List(~[Number(4f), Number(1f)])])));
Erick Tryzelaar012dec52012-02-26 00:39:321790 }
1791
1792 #[test]
Erick Tryzelaar5b7d6082013-03-30 20:31:031793 fn test_decode_list() {
Erick Tryzelaar609a9e62013-05-23 16:39:001794 let mut decoder = Decoder(from_str("[]").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541795 let v: ~[()] = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031796 assert_eq!(v, ~[]);
1797
Erick Tryzelaar609a9e62013-05-23 16:39:001798 let mut decoder = Decoder(from_str("[null]").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541799 let v: ~[()] = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031800 assert_eq!(v, ~[()]);
1801
Erick Tryzelaar609a9e62013-05-23 16:39:001802 let mut decoder = Decoder(from_str("[true]").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541803 let v: ~[bool] = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031804 assert_eq!(v, ~[true]);
1805
Erick Tryzelaar609a9e62013-05-23 16:39:001806 let mut decoder = Decoder(from_str("[true]").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541807 let v: ~[bool] = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031808 assert_eq!(v, ~[true]);
1809
Erick Tryzelaar609a9e62013-05-23 16:39:001810 let mut decoder = Decoder(from_str("[3, 1]").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541811 let v: ~[int] = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031812 assert_eq!(v, ~[3, 1]);
1813
Erick Tryzelaar609a9e62013-05-23 16:39:001814 let mut decoder = Decoder(from_str("[[3], [1, 2]]").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541815 let v: ~[~[uint]] = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031816 assert_eq!(v, ~[~[3], ~[1, 2]]);
1817 }
1818
1819 #[test]
Erick Tryzelaar49d00b22012-09-24 16:55:421820 fn test_read_object() {
Erick Tryzelaar609a9e62013-05-23 16:39:001821 assert_eq!(from_str("{"),
Patrick Waltond7e74b52013-03-06 21:58:021822 Err(Error {
1823 line: 1u,
1824 col: 2u,
1825 msg: @~"EOF while parsing object"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001826 assert_eq!(from_str("{ "),
Patrick Waltond7e74b52013-03-06 21:58:021827 Err(Error {
1828 line: 1u,
1829 col: 3u,
1830 msg: @~"EOF while parsing object"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001831 assert_eq!(from_str("{1"),
Patrick Waltond7e74b52013-03-06 21:58:021832 Err(Error {
1833 line: 1u,
1834 col: 2u,
1835 msg: @~"key must be a string"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001836 assert_eq!(from_str("{ \"a\""),
Patrick Waltond7e74b52013-03-06 21:58:021837 Err(Error {
1838 line: 1u,
1839 col: 6u,
1840 msg: @~"EOF while parsing object"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001841 assert_eq!(from_str("{\"a\""),
Patrick Waltond7e74b52013-03-06 21:58:021842 Err(Error {
1843 line: 1u,
1844 col: 5u,
1845 msg: @~"EOF while parsing object"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001846 assert_eq!(from_str("{\"a\" "),
Patrick Waltond7e74b52013-03-06 21:58:021847 Err(Error {
1848 line: 1u,
1849 col: 6u,
1850 msg: @~"EOF while parsing object"}));
Erick Tryzelaar012dec52012-02-26 00:39:321851
Erick Tryzelaar609a9e62013-05-23 16:39:001852 assert_eq!(from_str("{\"a\" 1"),
Patrick Waltond7e74b52013-03-06 21:58:021853 Err(Error {line: 1u, col: 6u, msg: @~"expected `:`"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001854 assert_eq!(from_str("{\"a\":"),
Patrick Waltond7e74b52013-03-06 21:58:021855 Err(Error {line: 1u, col: 6u, msg: @~"EOF while parsing value"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001856 assert_eq!(from_str("{\"a\":1"),
Patrick Waltond7e74b52013-03-06 21:58:021857 Err(Error {
1858 line: 1u,
1859 col: 7u,
1860 msg: @~"EOF while parsing object"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001861 assert_eq!(from_str("{\"a\":1 1"),
Patrick Waltond7e74b52013-03-06 21:58:021862 Err(Error {line: 1u, col: 8u, msg: @~"expected `,` or `}`"}));
Erick Tryzelaar609a9e62013-05-23 16:39:001863 assert_eq!(from_str("{\"a\":1,"),
Patrick Waltond7e74b52013-03-06 21:58:021864 Err(Error {
1865 line: 1u,
1866 col: 8u,
1867 msg: @~"EOF while parsing object"}));
Erick Tryzelaar012dec52012-02-26 00:39:321868
Erick Tryzelaar609a9e62013-05-23 16:39:001869 assert_eq!(result::unwrap(from_str("{}")), mk_object([]));
1870 assert_eq!(result::unwrap(from_str("{\"a\": 3}")),
1871 mk_object([(~"a", Number(3.0f))]));
Erick Tryzelaar012dec52012-02-26 00:39:321872
Erick Tryzelaar6cf99fa2013-03-27 00:23:001873 assert_eq!(result::unwrap(from_str(
Erick Tryzelaar609a9e62013-05-23 16:39:001874 "{ \"a\": null, \"b\" : true }")),
1875 mk_object([
Ben Striegela605fd02012-08-11 14:08:421876 (~"a", Null),
Patrick Waltond7e74b52013-03-06 21:58:021877 (~"b", Boolean(true))]));
Erick Tryzelaar6cf99fa2013-03-27 00:23:001878 assert_eq!(result::unwrap(
Erick Tryzelaar609a9e62013-05-23 16:39:001879 from_str("\n{ \"a\": null, \"b\" : true }\n")),
1880 mk_object([
Ben Striegela605fd02012-08-11 14:08:421881 (~"a", Null),
Patrick Waltond7e74b52013-03-06 21:58:021882 (~"b", Boolean(true))]));
Erick Tryzelaar6cf99fa2013-03-27 00:23:001883 assert_eq!(result::unwrap(from_str(
Erick Tryzelaar609a9e62013-05-23 16:39:001884 "{\"a\" : 1.0 ,\"b\": [ true ]}")),
1885 mk_object([
Erick Tryzelaar49d00b22012-09-24 16:55:421886 (~"a", Number(1.0)),
1887 (~"b", List(~[Boolean(true)]))
Patrick Waltond7e74b52013-03-06 21:58:021888 ]));
Erick Tryzelaar6cf99fa2013-03-27 00:23:001889 assert_eq!(result::unwrap(from_str(
Michael Sullivan92743dc2012-07-14 05:57:481890 ~"{" +
Alex Crichtonb04c40b2013-05-27 23:04:001891 "\"a\": 1.0, " +
1892 "\"b\": [" +
1893 "true," +
1894 "\"foo\\nbar\", " +
1895 "{ \"c\": {\"d\": null} } " +
1896 "]" +
1897 "}")),
Erick Tryzelaar609a9e62013-05-23 16:39:001898 mk_object([
Erick Tryzelaar49d00b22012-09-24 16:55:421899 (~"a", Number(1.0f)),
1900 (~"b", List(~[
Ben Striegela605fd02012-08-11 14:08:421901 Boolean(true),
Erick Tryzelaar49d00b22012-09-24 16:55:421902 String(~"foo\nbar"),
Erick Tryzelaar609a9e62013-05-23 16:39:001903 mk_object([
1904 (~"c", mk_object([(~"d", Null)]))
Michael Sullivan98e161f2012-06-29 23:26:561905 ])
1906 ]))
Patrick Waltond7e74b52013-03-06 21:58:021907 ]));
Erick Tryzelaar012dec52012-02-26 00:39:321908 }
1909
1910 #[test]
Erick Tryzelaar5b7d6082013-03-30 20:31:031911 fn test_decode_struct() {
1912 let s = ~"{
1913 \"inner\": [
1914 { \"a\": null, \"b\": 2, \"c\": [\"abc\", \"xyz\"] }
1915 ]
1916 }";
Patrick Waltondc5df612013-05-02 00:54:541917 let mut decoder = Decoder(from_str(s).unwrap());
1918 let v: Outer = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031919 assert_eq!(
1920 v,
1921 Outer {
1922 inner: ~[
1923 Inner { a: (), b: 2, c: ~[~"abc", ~"xyz"] }
1924 ]
1925 }
1926 );
Erick Tryzelaarb10b8c32013-03-27 07:13:011927 }
1928
1929 #[test]
Erick Tryzelaar5b7d6082013-03-30 20:31:031930 fn test_decode_option() {
Erick Tryzelaar609a9e62013-05-23 16:39:001931 let mut decoder = Decoder(from_str("null").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541932 let value: Option<~str> = Decodable::decode(&mut decoder);
Erick Tryzelaar5b7d6082013-03-30 20:31:031933 assert_eq!(value, None);
1934
Erick Tryzelaar609a9e62013-05-23 16:39:001935 let mut decoder = Decoder(from_str("\"jodhpurs\"").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541936 let value: Option<~str> = Decodable::decode(&mut decoder);
Erick Tryzelaarb10b8c32013-03-27 07:13:011937 assert_eq!(value, Some(~"jodhpurs"));
1938 }
1939
1940 #[test]
Erick Tryzelaar5b7d6082013-03-30 20:31:031941 fn test_decode_enum() {
Erick Tryzelaar609a9e62013-05-23 16:39:001942 let mut decoder = Decoder(from_str("\"Dog\"").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541943 let value: Animal = Decodable::decode(&mut decoder);
Erick Tryzelaar4e9a63f2013-03-27 00:42:011944 assert_eq!(value, Dog);
Erick Tryzelaar4e9a63f2013-03-27 00:42:011945
Patrick Waltondc5df612013-05-02 00:54:541946 let mut decoder =
Erick Tryzelaar609a9e62013-05-23 16:39:001947 Decoder(from_str("[\"Frog\",\"Henry\",349]").unwrap());
Patrick Waltondc5df612013-05-02 00:54:541948 let value: Animal = Decodable::decode(&mut decoder);
Erick Tryzelaar4e9a63f2013-03-27 00:42:011949 assert_eq!(value, Frog(~"Henry", 349));
1950 }
1951
1952 #[test]
Erick Tryzelaar5b7d6082013-03-30 20:31:031953 fn test_decode_map() {
Erick Tryzelaard1a83e62013-03-29 16:04:351954 let s = ~"{\"a\": \"Dog\", \"b\": [\"Frog\", \"Henry\", 349]}";
Patrick Waltondc5df612013-05-02 00:54:541955 let mut decoder = Decoder(from_str(s).unwrap());
1956 let mut map: HashMap<~str, Animal> = Decodable::decode(&mut decoder);
Erick Tryzelaard1a83e62013-03-29 16:04:351957
Erick Tryzelaarbdef3f12013-03-29 16:10:311958 assert_eq!(map.pop(&~"a"), Some(Dog));
1959 assert_eq!(map.pop(&~"b"), Some(Frog(~"Henry", 349)));
Erick Tryzelaard1a83e62013-03-29 16:04:351960 }
1961
1962 #[test]
Erick Tryzelaar012dec52012-02-26 00:39:321963 fn test_multiline_errors() {
Erick Tryzelaar609a9e62013-05-23 16:39:001964 assert_eq!(from_str("{\n \"foo\":\n \"bar\""),
Patrick Waltond7e74b52013-03-06 21:58:021965 Err(Error {
1966 line: 3u,
1967 col: 8u,
1968 msg: @~"EOF while parsing object"}));
Brian Anderson6e27b272012-01-18 03:05:071969 }
1970}