1
- use std:: iter:: FromIterator ;
1
+ use std:: { iter:: FromIterator , mem } ;
2
2
3
3
use super :: Value ;
4
4
use indexmap:: map:: { IndexMap , IntoIter } ;
5
5
6
6
/// A Object value
7
- #[ derive( Debug , Clone ) ]
7
+ #[ derive( Debug , Clone , PartialEq ) ]
8
8
pub struct Object < S > {
9
9
key_value_list : IndexMap < String , Value < S > > ,
10
10
}
11
11
12
- impl < S : PartialEq > PartialEq for Object < S > {
13
- fn eq ( & self , _: & Object < S > ) -> bool {
14
- match self {
15
- Object { key_value_list } => self . key_value_list == * key_value_list,
16
- }
17
- }
18
- }
19
-
20
12
impl < S > Object < S > {
21
13
/// Create a new Object value with a fixed number of
22
14
/// preallocated slots for field-value pairs
@@ -35,28 +27,18 @@ impl<S> Object<S> {
35
27
/// returned.
36
28
pub fn add_field < K > ( & mut self , k : K , value : Value < S > ) -> Option < Value < S > >
37
29
where
38
- K : Into < String > ,
39
- for < ' a > & ' a str : PartialEq < K > ,
30
+ K : AsRef < str > + Into < String > ,
40
31
{
41
- let key: String = k. into ( ) ;
42
- match ( value, self . key_value_list . get_mut ( & key) ) {
43
- ( Value :: < S > :: Object ( obj_val) , Some ( Value :: < S > :: Object ( existing_obj) ) ) => {
44
- for ( key, val) in obj_val. into_iter ( ) {
45
- existing_obj. add_field :: < String > ( key, val) ;
46
- }
47
- None
48
- }
49
- ( non_obj_val, _) => self . key_value_list . insert ( key, non_obj_val) ,
32
+ if let Some ( v) = self . key_value_list . get_mut ( k. as_ref ( ) ) {
33
+ Some ( mem:: replace ( v, value) )
34
+ } else {
35
+ self . key_value_list . insert ( k. into ( ) , value)
50
36
}
51
37
}
52
38
53
39
/// Check if the object already contains a field with the given name
54
- pub fn contains_field < K > ( & self , f : K ) -> bool
55
- where
56
- K : Into < String > ,
57
- for < ' a > & ' a str : PartialEq < K > ,
58
- {
59
- self . key_value_list . contains_key ( & f. into ( ) )
40
+ pub fn contains_field < K : AsRef < str > > ( & self , k : K ) -> bool {
41
+ self . key_value_list . contains_key ( k. as_ref ( ) )
60
42
}
61
43
62
44
/// Get a iterator over all field value pairs
@@ -75,12 +57,13 @@ impl<S> Object<S> {
75
57
}
76
58
77
59
/// Get the value for a given field
78
- pub fn get_field_value < K > ( & self , key : K ) -> Option < & Value < S > >
79
- where
80
- K : Into < String > ,
81
- for < ' a > & ' a str : PartialEq < K > ,
82
- {
83
- self . key_value_list . get ( & key. into ( ) )
60
+ pub fn get_field_value < K : AsRef < str > > ( & self , key : K ) -> Option < & Value < S > > {
61
+ self . key_value_list . get ( key. as_ref ( ) )
62
+ }
63
+
64
+ /// Get the mutable value for a given field
65
+ pub fn get_mut_field_value < K : AsRef < str > > ( & mut self , key : K ) -> Option < & mut Value < S > > {
66
+ self . key_value_list . get_mut ( key. as_ref ( ) )
84
67
}
85
68
}
86
69
@@ -101,8 +84,7 @@ impl<S> From<Object<S>> for Value<S> {
101
84
102
85
impl < K , S > FromIterator < ( K , Value < S > ) > for Object < S >
103
86
where
104
- K : Into < String > ,
105
- for < ' a > & ' a str : PartialEq < K > ,
87
+ K : AsRef < str > + Into < String > ,
106
88
{
107
89
fn from_iter < I > ( iter : I ) -> Self
108
90
where
0 commit comments