@@ -3,7 +3,6 @@ use crate::error;
33use ordered_float;
44use serde;
55use serde_json;
6- use std:: collections;
76use std:: fmt;
87use std:: io;
98
@@ -17,7 +16,7 @@ pub mod raw;
1716pub mod toml;
1817pub mod yaml;
1918
20- #[ derive( Clone , Debug , Eq , Ord , PartialEq , PartialOrd ) ]
19+ #[ derive( Debug ) ]
2120pub enum Value {
2221 Unit ,
2322 Bool ( bool ) ,
@@ -40,8 +39,10 @@ pub enum Value {
4039 Bytes ( Vec < u8 > ) ,
4140
4241 Sequence ( Vec < Value > ) ,
43- // TODO: Use a container that preserves insertion order
44- Map ( collections:: BTreeMap < Value , Value > ) ,
42+
43+ // A sequence of pairs is appropriate for representing an object/a map:
44+ // there is no need to deduplicate keys, and it is nice to preserve order.
45+ Map ( Vec < ( Value , Value ) > ) ,
4546}
4647
4748pub trait Source {
@@ -159,7 +160,14 @@ impl serde::ser::Serialize for Value {
159160 Self :: Bytes ( ref v) => v. serialize ( s) ,
160161
161162 Self :: Sequence ( ref v) => v. serialize ( s) ,
162- Self :: Map ( ref v) => v. serialize ( s) ,
163+ Self :: Map ( ref v) => {
164+ use serde:: ser:: SerializeMap ;
165+ let mut s = s. serialize_map ( Some ( v. len ( ) ) ) ?;
166+ for ( key, value) in v {
167+ SerializeMap :: serialize_entry ( & mut s, key, value) ?;
168+ }
169+ SerializeMap :: end ( s)
170+ }
163171 }
164172 }
165173}
@@ -353,10 +361,10 @@ impl<'de> serde::de::Visitor<'de> for ValueVisitor {
353361 where
354362 V : serde:: de:: MapAccess < ' de > ,
355363 {
356- let mut values = collections :: BTreeMap :: new ( ) ;
364+ let mut values = Vec :: new ( ) ;
357365
358- while let Some ( ( key , value ) ) = v. next_entry ( ) ? {
359- values. insert ( key , value ) ;
366+ while let Some ( entry ) = v. next_entry ( ) ? {
367+ values. push ( entry ) ;
360368 }
361369
362370 Ok ( Value :: Map ( values) )
0 commit comments