1- //! An optional implementation of serialization/deserialization. Reference
2- //! implementations used:
3- //!
4- //! - [Serialize][1].
5- //! - [Deserialize][2].
6- //!
7- //! [1]: https://github.com/serde-rs/serde/blob/97856462467db2e90cf368e407c7ebcc726a01a9/serde/src/ser/impls.rs#L601-L611
8- //! [2]: https://github.com/serde-rs/serde/blob/97856462467db2e90cf368e407c7ebcc726a01a9/serde/src/de/impls.rs#L694-L746
1+ //! An optional implementation of serialization/deserialization.
92
103extern crate serde;
114
@@ -17,7 +10,7 @@ use super::LinkedHashMap;
1710
1811use self :: serde:: { Serialize , Serializer , Deserialize , Deserializer } ;
1912use self :: serde:: ser:: SerializeMap ;
20- use self :: serde:: de:: { Visitor , MapVisitor , Error } ;
13+ use self :: serde:: de:: { Visitor , MapAccess , Error } ;
2114
2215impl < K , V , S > Serialize for LinkedHashMap < K , V , S >
2316 where K : Serialize + Eq + Hash ,
@@ -37,6 +30,7 @@ impl<K, V, S> Serialize for LinkedHashMap<K, V, S>
3730 }
3831}
3932
33+ #[ derive( Debug ) ]
4034/// `serde::de::Visitor` for a linked hash map.
4135pub struct LinkedHashMapVisitor < K , V > {
4236 marker : PhantomData < LinkedHashMap < K , V > > ,
@@ -51,9 +45,15 @@ impl<K, V> LinkedHashMapVisitor<K, V> {
5145 }
5246}
5347
54- impl < K , V > Visitor for LinkedHashMapVisitor < K , V >
55- where K : Deserialize + Eq + Hash ,
56- V : Deserialize ,
48+ impl < K , V > Default for LinkedHashMapVisitor < K , V > {
49+ fn default ( ) -> Self {
50+ LinkedHashMapVisitor :: new ( )
51+ }
52+ }
53+
54+ impl < ' de , K , V > Visitor < ' de > for LinkedHashMapVisitor < K , V >
55+ where K : Deserialize < ' de > + Eq + Hash ,
56+ V : Deserialize < ' de > ,
5757{
5858 type Value = LinkedHashMap < K , V > ;
5959
@@ -69,25 +69,25 @@ impl<K, V> Visitor for LinkedHashMapVisitor<K, V>
6969 }
7070
7171 #[ inline]
72- fn visit_map < Visitor > ( self , mut visitor : Visitor ) -> Result < Self :: Value , Visitor :: Error >
73- where Visitor : MapVisitor ,
72+ fn visit_map < M > ( self , mut map : M ) -> Result < Self :: Value , M :: Error >
73+ where M : MapAccess < ' de > ,
7474 {
75- let mut values = LinkedHashMap :: with_capacity ( visitor . size_hint ( ) . 0 ) ;
75+ let mut values = LinkedHashMap :: with_capacity ( map . size_hint ( ) . unwrap_or ( 0 ) ) ;
7676
77- while let Some ( ( key, value) ) = try! ( visitor . visit ( ) ) {
77+ while let Some ( ( key, value) ) = map . next_entry ( ) ? {
7878 values. insert ( key, value) ;
7979 }
8080
8181 Ok ( values)
8282 }
8383}
8484
85- impl < K , V > Deserialize for LinkedHashMap < K , V >
86- where K : Deserialize + Eq + Hash ,
87- V : Deserialize ,
85+ impl < ' de , K , V > Deserialize < ' de > for LinkedHashMap < K , V >
86+ where K : Deserialize < ' de > + Eq + Hash ,
87+ V : Deserialize < ' de > ,
8888{
8989 fn deserialize < D > ( deserializer : D ) -> Result < LinkedHashMap < K , V > , D :: Error >
90- where D : Deserializer ,
90+ where D : Deserializer < ' de > ,
9191 {
9292 deserializer. deserialize_map ( LinkedHashMapVisitor :: new ( ) )
9393 }
0 commit comments