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.
9
2
10
3
extern crate serde;
11
4
@@ -17,7 +10,7 @@ use super::LinkedHashMap;
17
10
18
11
use self :: serde:: { Serialize , Serializer , Deserialize , Deserializer } ;
19
12
use self :: serde:: ser:: SerializeMap ;
20
- use self :: serde:: de:: { Visitor , MapVisitor , Error } ;
13
+ use self :: serde:: de:: { Visitor , MapAccess , Error } ;
21
14
22
15
impl < K , V , S > Serialize for LinkedHashMap < K , V , S >
23
16
where K : Serialize + Eq + Hash ,
@@ -37,6 +30,7 @@ impl<K, V, S> Serialize for LinkedHashMap<K, V, S>
37
30
}
38
31
}
39
32
33
+ #[ derive( Debug ) ]
40
34
/// `serde::de::Visitor` for a linked hash map.
41
35
pub struct LinkedHashMapVisitor < K , V > {
42
36
marker : PhantomData < LinkedHashMap < K , V > > ,
@@ -51,9 +45,15 @@ impl<K, V> LinkedHashMapVisitor<K, V> {
51
45
}
52
46
}
53
47
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 > ,
57
57
{
58
58
type Value = LinkedHashMap < K , V > ;
59
59
@@ -69,25 +69,25 @@ impl<K, V> Visitor for LinkedHashMapVisitor<K, V>
69
69
}
70
70
71
71
#[ 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 > ,
74
74
{
75
- let mut values = LinkedHashMap :: with_capacity ( visitor . size_hint ( ) . 0 ) ;
75
+ let mut values = LinkedHashMap :: with_capacity ( map . size_hint ( ) . unwrap_or ( 0 ) ) ;
76
76
77
- while let Some ( ( key, value) ) = try! ( visitor . visit ( ) ) {
77
+ while let Some ( ( key, value) ) = map . next_entry ( ) ? {
78
78
values. insert ( key, value) ;
79
79
}
80
80
81
81
Ok ( values)
82
82
}
83
83
}
84
84
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 > ,
88
88
{
89
89
fn deserialize < D > ( deserializer : D ) -> Result < LinkedHashMap < K , V > , D :: Error >
90
- where D : Deserializer ,
90
+ where D : Deserializer < ' de > ,
91
91
{
92
92
deserializer. deserialize_map ( LinkedHashMapVisitor :: new ( ) )
93
93
}
0 commit comments