5 use super::{Encoder, Error, State}
;
8 impl rustc_serialize
::Encoder
for Encoder
{
11 fn emit_nil(&mut self) -> Result
<(), Error
> { Ok(()) }
12 fn emit_usize(&mut self, v
: usize) -> Result
<(), Error
> {
13 self.emit_i64(v
as i64)
15 fn emit_u8(&mut self, v
: u8) -> Result
<(), Error
> {
16 self.emit_i64(v
as i64)
18 fn emit_u16(&mut self, v
: u16) -> Result
<(), Error
> {
19 self.emit_i64(v
as i64)
21 fn emit_u32(&mut self, v
: u32) -> Result
<(), Error
> {
22 self.emit_i64(v
as i64)
24 fn emit_u64(&mut self, v
: u64) -> Result
<(), Error
> {
25 self.emit_i64(v
as i64)
27 fn emit_isize(&mut self, v
: isize) -> Result
<(), Error
> {
28 self.emit_i64(v
as i64)
30 fn emit_i8(&mut self, v
: i8) -> Result
<(), Error
> {
31 self.emit_i64(v
as i64)
33 fn emit_i16(&mut self, v
: i16) -> Result
<(), Error
> {
34 self.emit_i64(v
as i64)
36 fn emit_i32(&mut self, v
: i32) -> Result
<(), Error
> {
37 self.emit_i64(v
as i64)
39 fn emit_i64(&mut self, v
: i64) -> Result
<(), Error
> {
40 self.emit_value(Value
::Integer(v
))
42 fn emit_bool(&mut self, v
: bool
) -> Result
<(), Error
> {
43 self.emit_value(Value
::Boolean(v
))
45 fn emit_f32(&mut self, v
: f32) -> Result
<(), Error
> { self.emit_f64(v as f64) }
46 fn emit_f64(&mut self, v
: f64) -> Result
<(), Error
> {
47 self.emit_value(Value
::Float(v
))
49 fn emit_char(&mut self, v
: char) -> Result
<(), Error
> {
50 self.emit_str(&*format
!("{}", v
))
52 fn emit_str(&mut self, v
: &str) -> Result
<(), Error
> {
53 self.emit_value(Value
::String(format
!("{}", v
)))
55 fn emit_enum
<F
>(&mut self, _name
: &str, f
: F
)
57 where F
: FnOnce(&mut Encoder
) -> Result
<(), Error
>
61 fn emit_enum_variant
<F
>(&mut self, _v_name
: &str, _v_id
: usize,
62 _len
: usize, f
: F
) -> Result
<(), Error
>
63 where F
: FnOnce(&mut Encoder
) -> Result
<(), Error
>
67 fn emit_enum_variant_arg
<F
>(&mut self, _a_idx
: usize, f
: F
)
69 where F
: FnOnce(&mut Encoder
) -> Result
<(), Error
>
73 fn emit_enum_struct_variant
<F
>(&mut self, _v_name
: &str, _v_id
: usize,
77 where F
: FnOnce(&mut Encoder
) -> Result
<(), Error
>
81 fn emit_enum_struct_variant_field
<F
>(&mut self,
86 where F
: FnOnce(&mut Encoder
) -> Result
<(), Error
>
90 fn emit_struct
<F
>(&mut self, _name
: &str, _len
: usize, f
: F
)
92 where F
: FnOnce(&mut Encoder
) -> Result
<(), Error
>
96 fn emit_struct_field
<F
>(&mut self, f_name
: &str, _f_idx
: usize, f
: F
)
98 where F
: FnOnce(&mut Encoder
) -> Result
<(), Error
>
100 let old
= mem
::replace(&mut self.state
,
101 State
::NextKey(format
!("{}", f_name
)));
103 if self.state
!= State
::Start
{
109 fn emit_tuple
<F
>(&mut self, len
: usize, f
: F
)
111 where F
: FnOnce(&mut Encoder
) -> Result
<(), Error
>
113 self.emit_seq(len
, f
)
115 fn emit_tuple_arg
<F
>(&mut self, idx
: usize, f
: F
)
117 where F
: FnOnce(&mut Encoder
) -> Result
<(), Error
>
119 self.emit_seq_elt(idx
, f
)
121 fn emit_tuple_struct
<F
>(&mut self, _name
: &str, _len
: usize, _f
: F
)
123 where F
: FnOnce(&mut Encoder
) -> Result
<(), Error
>
127 fn emit_tuple_struct_arg
<F
>(&mut self, _f_idx
: usize, _f
: F
)
129 where F
: FnOnce(&mut Encoder
) -> Result
<(), Error
>
133 fn emit_option
<F
>(&mut self, f
: F
)
135 where F
: FnOnce(&mut Encoder
) -> Result
<(), Error
>
139 fn emit_option_none(&mut self) -> Result
<(), Error
> {
142 fn emit_option_some
<F
>(&mut self, f
: F
) -> Result
<(), Error
>
143 where F
: FnOnce(&mut Encoder
) -> Result
<(), Error
>
147 fn emit_seq
<F
>(&mut self, _len
: usize, f
: F
)
149 where F
: FnOnce(&mut Encoder
) -> Result
<(), Error
>
153 fn emit_seq_elt
<F
>(&mut self, _idx
: usize, f
: F
)
155 where F
: FnOnce(&mut Encoder
) -> Result
<(), Error
>
159 fn emit_map
<F
>(&mut self, len
: usize, f
: F
)
161 where F
: FnOnce(&mut Encoder
) -> Result
<(), Error
>
163 self.emit_struct("foo", len
, f
)
165 fn emit_map_elt_key
<F
>(&mut self, _idx
: usize, f
: F
) -> Result
<(), Error
>
166 where F
: FnOnce(&mut Encoder
) -> Result
<(), Error
>
170 fn emit_map_elt_val
<F
>(&mut self, _idx
: usize, f
: F
) -> Result
<(), Error
>
171 where F
: FnOnce(&mut Encoder
) -> Result
<(), Error
>
177 impl rustc_serialize
::Encodable
for Value
{
178 fn encode
<E
>(&self, e
: &mut E
) -> Result
<(), E
::Error
>
179 where E
: rustc_serialize
::Encoder
182 Value
::String(ref s
) => e
.emit_str(s
),
183 Value
::Integer(i
) => e
.emit_i64(i
),
184 Value
::Float(f
) => e
.emit_f64(f
),
185 Value
::Boolean(b
) => e
.emit_bool(b
),
186 Value
::Datetime(ref s
) => e
.emit_str(s
),
187 Value
::Array(ref a
) => {
188 e
.emit_seq(a
.len(), |e
| {
190 try
!(item
.encode(e
));
195 Value
::Table(ref t
) => {
196 e
.emit_map(t
.len(), |e
| {
197 for (i
, (key
, value
)) in t
.iter().enumerate() {
198 try
!(e
.emit_map_elt_key(i
, |e
| e
.emit_str(key
)));
199 try
!(e
.emit_map_elt_val(i
, |e
| value
.encode(e
)));
210 use std
::collections
::{BTreeMap, HashSet}
;
211 use rustc_serialize
::{self, Encodable, Decodable}
;
213 use {Encoder, Decoder, DecodeError}
;
215 use Value
::{Table, Integer, Array, Float}
;
217 macro_rules
! encode( ($t
:expr
) => ({
218 let mut e
= Encoder
::new();
219 $t
.encode(&mut e
).unwrap();
223 macro_rules
! decode( ($t
:expr
) => ({
224 let mut d
= Decoder
::new($t
);
225 Decodable
::decode(&mut d
).unwrap()
228 macro_rules
! map( ($
($k
:ident
, $v
:expr
),*) => ({
229 let mut _m
= BTreeMap
::new();
230 $
(_m
.insert(stringify
!($k
).to_string(), $v
);)*
236 #[derive(RustcEncodable, RustcDecodable, PartialEq, Debug)]
237 struct Foo { a: isize }
239 let v
= Foo { a: 2 }
;
240 assert_eq
!(encode
!(v
), map
! { a, Integer(2) }
);
241 assert_eq
!(v
, decode
!(Table(encode
!(v
))));
246 #[derive(RustcEncodable, RustcDecodable, PartialEq, Debug)]
247 struct Foo { a_b: isize }
249 let v
= Foo { a_b: 2 }
;
250 assert_eq
!(encode
!(v
), map
! { a_b, Integer(2) }
);
251 assert_eq
!(v
, decode
!(Table(encode
!(v
))));
253 let mut m
= BTreeMap
::new();
254 m
.insert("a-b".to_string(), Integer(2));
255 assert_eq
!(v
, decode
!(Table(encode
!(v
))));
260 #[derive(RustcEncodable, RustcDecodable, PartialEq, Debug)]
261 struct Foo { a: isize, b: Bar }
262 #[derive(RustcEncodable, RustcDecodable, PartialEq, Debug)]
263 struct Bar { a: String }
265 let v
= Foo { a: 2, b: Bar { a: "test".to_string() }
};
266 assert_eq
!(encode
!(v
),
270 a
, Value
::String("test".to_string())
273 assert_eq
!(v
, decode
!(Table(encode
!(v
))));
277 fn application_decode_error() {
278 #[derive(PartialEq, Debug)]
279 struct Range10(usize);
280 impl Decodable
for Range10
{
281 fn decode
<D
: rustc_serialize
::Decoder
>(d
: &mut D
) -> Result
<Range10
, D
::Error
> {
282 let x
: usize = try
!(Decodable
::decode(d
));
284 Err(d
.error("Value out of range!"))
290 let mut d_good
= Decoder
::new(Integer(5));
291 let mut d_bad1
= Decoder
::new(Value
::String("not an isize".to_string()));
292 let mut d_bad2
= Decoder
::new(Integer(11));
294 assert_eq
!(Ok(Range10(5)), Decodable
::decode(&mut d_good
));
296 let err1
: Result
<Range10
, _
> = Decodable
::decode(&mut d_bad1
);
297 assert
!(err1
.is_err());
298 let err2
: Result
<Range10
, _
> = Decodable
::decode(&mut d_bad2
);
299 assert
!(err2
.is_err());
304 #[derive(RustcEncodable, RustcDecodable, PartialEq, Debug)]
305 struct Foo { a: Vec<isize> }
307 let v
= Foo { a: vec![1, 2, 3, 4] }
;
308 assert_eq
!(encode
!(v
),
317 assert_eq
!(v
, decode
!(Table(encode
!(v
))));
322 #[derive(RustcEncodable, RustcDecodable, PartialEq, Debug)]
323 struct Foo { a: (isize, isize, isize, isize) }
325 let v
= Foo { a: (1, 2, 3, 4) }
;
326 assert_eq
!(encode
!(v
),
335 assert_eq
!(v
, decode
!(Table(encode
!(v
))));
339 fn inner_structs_with_options() {
340 #[derive(RustcEncodable, RustcDecodable, PartialEq, Debug)]
345 #[derive(RustcEncodable, RustcDecodable, PartialEq, Debug)]
352 a
: Some(Box
::new(Foo
{
354 b
: Bar { a: "foo".to_string(), b: 4.5 }
,
356 b
: Bar { a: "bar".to_string(), b: 1.0 }
,
358 assert_eq
!(encode
!(v
),
362 a
, Value
::String("foo".to_string()),
367 a
, Value
::String("bar".to_string()),
371 assert_eq
!(v
, decode
!(Table(encode
!(v
))));
376 #[derive(RustcEncodable, RustcDecodable, PartialEq, Debug)]
378 map
: BTreeMap
<String
, isize>,
384 let mut m
= BTreeMap
::new();
385 m
.insert("foo".to_string(), 10);
386 m
.insert("bar".to_string(), 4);
390 let mut s
= HashSet
::new();
395 assert_eq
!(encode
!(v
),
401 set
, Array(vec
![Value
::String("a".to_string())])
404 assert_eq
!(v
, decode
!(Table(encode
!(v
))));
409 #[derive(RustcEncodable, RustcDecodable, PartialEq, Debug)]
410 struct Foo(isize, String
, f64);
412 let v
= Foo(1, "foo".to_string(), 4.5);
417 _field1
, Value
::String("foo".to_string()),
421 assert_eq
!(v
, decode
!(Table(encode
!(v
))));
426 #[derive(RustcEncodable, RustcDecodable, PartialEq, Debug)]
427 struct Foo { a: Vec<Bar>, }
428 #[derive(RustcEncodable, RustcDecodable, PartialEq, Debug)]
429 struct Bar { a: isize }
431 let v
= Foo { a: vec![Bar { a: 1 }
, Bar { a: 2 }
] };
436 Table(map
!{ a, Integer(1) }
),
437 Table(map
!{ a, Integer(2) }
),
441 assert_eq
!(v
, decode
!(Table(encode
!(v
))));
446 #[derive(RustcEncodable, RustcDecodable, PartialEq, Debug)]
447 struct Foo { bar: isize }
449 let mut d
= Decoder
::new(Table(map
! {
452 let a
: Result
<Foo
, DecodeError
> = Decodable
::decode(&mut d
);
454 Ok(..) => panic
!("should not have decoded"),
456 assert_eq
!(format
!("{}", e
),
457 "expected a value of type `integer`, but \
458 found a value of type `float` for the key `bar`");
464 fn missing_errors() {
465 #[derive(RustcEncodable, RustcDecodable, PartialEq, Debug)]
466 struct Foo { bar: isize }
468 let mut d
= Decoder
::new(Table(map
! {
470 let a
: Result
<Foo
, DecodeError
> = Decodable
::decode(&mut d
);
472 Ok(..) => panic
!("should not have decoded"),
474 assert_eq
!(format
!("{}", e
),
475 "expected a value of type `integer` for the key `bar`");
482 #[derive(RustcEncodable, RustcDecodable, PartialEq, Debug)]
484 #[derive(RustcEncodable, RustcDecodable, PartialEq, Debug)]
490 #[derive(RustcEncodable, RustcDecodable, PartialEq, Debug)]
495 let v
= Foo { a: E::Bar(10) }
;
498 map
! { a, Integer(10) }
500 assert_eq
!(v
, decode
!(Table(encode
!(v
))));
502 let v
= Foo { a: E::Baz(10.2) }
;
505 map
! { a, Float(10.2) }
507 assert_eq
!(v
, decode
!(Table(encode
!(v
))));
509 let v
= Foo { a: E::Last(Foo2 { test: "test".to_string() }
) };
512 map
! { a, Table(map! { test, Value::String("test".to_string()) }
) }
514 assert_eq
!(v
, decode
!(Table(encode
!(v
))));
519 #[derive(RustcEncodable, RustcDecodable, PartialEq, Debug)]
520 struct Foo { a: isize }
522 let v
= Foo { a: 2 }
;
523 let mut d
= Decoder
::new(Table(map
! {
527 assert_eq
!(v
, Decodable
::decode(&mut d
).unwrap());
529 assert_eq
!(d
.toml
, Some(Table(map
! {
535 fn unused_fields2() {
536 #[derive(RustcEncodable, RustcDecodable, PartialEq, Debug)]
537 struct Foo { a: Bar }
538 #[derive(RustcEncodable, RustcDecodable, PartialEq, Debug)]
539 struct Bar { a: isize }
541 let v
= Foo { a: Bar { a: 2 }
};
542 let mut d
= Decoder
::new(Table(map
! {
548 assert_eq
!(v
, Decodable
::decode(&mut d
).unwrap());
550 assert_eq
!(d
.toml
, Some(Table(map
! {
558 fn unused_fields3() {
559 #[derive(RustcEncodable, RustcDecodable, PartialEq, Debug)]
560 struct Foo { a: Bar }
561 #[derive(RustcEncodable, RustcDecodable, PartialEq, Debug)]
562 struct Bar { a: isize }
564 let v
= Foo { a: Bar { a: 2 }
};
565 let mut d
= Decoder
::new(Table(map
! {
570 assert_eq
!(v
, Decodable
::decode(&mut d
).unwrap());
572 assert_eq
!(d
.toml
, None
);
576 fn unused_fields4() {
577 #[derive(RustcEncodable, RustcDecodable, PartialEq, Debug)]
578 struct Foo { a: BTreeMap<String, String> }
580 let v
= Foo { a: map! { a, "foo".to_string() }
};
581 let mut d
= Decoder
::new(Table(map
! {
583 a
, Value
::String("foo".to_string())
586 assert_eq
!(v
, Decodable
::decode(&mut d
).unwrap());
588 assert_eq
!(d
.toml
, None
);
592 fn unused_fields5() {
593 #[derive(RustcEncodable, RustcDecodable, PartialEq, Debug)]
594 struct Foo { a: Vec<String> }
596 let v
= Foo { a: vec!["a".to_string()] }
;
597 let mut d
= Decoder
::new(Table(map
! {
598 a
, Array(vec
![Value
::String("a".to_string())])
600 assert_eq
!(v
, Decodable
::decode(&mut d
).unwrap());
602 assert_eq
!(d
.toml
, None
);
606 fn unused_fields6() {
607 #[derive(RustcEncodable, RustcDecodable, PartialEq, Debug)]
608 struct Foo { a: Option<Vec<String>> }
610 let v
= Foo { a: Some(vec![]) }
;
611 let mut d
= Decoder
::new(Table(map
! {
614 assert_eq
!(v
, Decodable
::decode(&mut d
).unwrap());
616 assert_eq
!(d
.toml
, None
);
620 fn unused_fields7() {
621 #[derive(RustcEncodable, RustcDecodable, PartialEq, Debug)]
622 struct Foo { a: Vec<Bar> }
623 #[derive(RustcEncodable, RustcDecodable, PartialEq, Debug)]
624 struct Bar { a: isize }
626 let v
= Foo { a: vec![Bar { a: 1 }
] };
627 let mut d
= Decoder
::new(Table(map
! {
628 a
, Array(vec
![Table(map
! {
633 assert_eq
!(v
, Decodable
::decode(&mut d
).unwrap());
635 assert_eq
!(d
.toml
, Some(Table(map
! {
636 a
, Array(vec
![Table(map
! {
643 fn unused_fields8() {
644 #[derive(RustcEncodable, RustcDecodable, PartialEq, Debug)]
645 struct Foo { a: BTreeMap<String, Bar> }
646 #[derive(RustcEncodable, RustcDecodable, PartialEq, Debug)]
647 struct Bar { a: isize }
649 let v
= Foo { a: map! { a, Bar { a: 2 }
} };
650 let mut d
= Decoder
::new(Table(map
! {
658 assert_eq
!(v
, Decodable
::decode(&mut d
).unwrap());
660 assert_eq
!(d
.toml
, Some(Table(map
! {
671 #[derive(RustcEncodable, RustcDecodable, PartialEq, Debug)]
672 struct Foo { a: Vec<Bar> }
673 #[derive(RustcEncodable, RustcDecodable, PartialEq, Debug)]
676 let v
= Foo { a: vec![] }
;
677 let mut d
= Decoder
::new(Table(map
! {}
));
678 assert_eq
!(v
, Decodable
::decode(&mut d
).unwrap());
683 #[derive(RustcEncodable, RustcDecodable, PartialEq, Debug)]
684 struct Foo { a: Option<Vec<Bar>> }
685 #[derive(RustcEncodable, RustcDecodable, PartialEq, Debug)]
688 let v
= Foo { a: None }
;
689 let mut d
= Decoder
::new(Table(map
! {}
));
690 assert_eq
!(v
, Decodable
::decode(&mut d
).unwrap());
692 let v
= Foo { a: Some(vec![]) }
;
693 let mut d
= Decoder
::new(Table(map
! {
696 assert_eq
!(v
, Decodable
::decode(&mut d
).unwrap());
712 let value
: Value
= toml
.parse().unwrap();
713 let val2
= ::encode_str(&value
).parse().unwrap();
714 assert_eq
!(value
, val2
);