@@ -65,40 +65,39 @@ impl<'de> de::MapAccess<'de> for MapAccess {
65
65
66
66
struct ObjectAccess {
67
67
obj : ObjectExt ,
68
- fields : std:: iter :: Enumerate < std :: slice:: Iter < ' static , & ' static str > > ,
68
+ fields : std:: slice:: Iter < ' static , & ' static str > ,
69
69
next_value : Option < Deserializer > ,
70
70
}
71
71
72
72
impl ObjectAccess {
73
73
fn new ( obj : ObjectExt , fields : & ' static [ & ' static str ] ) -> Self {
74
74
Self {
75
75
obj,
76
- fields : fields. iter ( ) . enumerate ( ) ,
76
+ fields : fields. iter ( ) ,
77
77
next_value : None ,
78
78
}
79
79
}
80
80
}
81
81
82
+ fn str_deserializer ( s : & str ) -> de:: value:: StrDeserializer < Error > {
83
+ de:: IntoDeserializer :: into_deserializer ( s)
84
+ }
85
+
82
86
impl < ' de > de:: MapAccess < ' de > for ObjectAccess {
83
87
type Error = Error ;
84
88
85
89
fn next_key_seed < K : de:: DeserializeSeed < ' de > > ( & mut self , seed : K ) -> Result < Option < K :: Value > > {
86
90
debug_assert ! ( self . next_value. is_none( ) ) ;
87
91
88
- for ( i , & field) in & mut self . fields {
92
+ for field in & mut self . fields {
89
93
let js_field = static_str_to_js ( field) ;
90
94
let next_value = self . obj . get_with_ref_key ( & js_field) ;
91
95
// If this value is `undefined`, it might be actually a missing field;
92
96
// double-check with an `in` operator if so.
93
97
let is_missing_field = next_value. is_undefined ( ) && !js_field. js_in ( & self . obj ) ;
94
98
if !is_missing_field {
95
99
self . next_value = Some ( Deserializer :: from ( next_value) ) ;
96
- // Serde can deserialize struct fields from their indices.
97
- // Using them allows for more efficient deserialization as it
98
- // avoids string comparisons.
99
- return Ok ( Some ( seed. deserialize (
100
- de:: IntoDeserializer :: < Error > :: into_deserializer ( i) ,
101
- ) ?) ) ;
100
+ return Ok ( Some ( seed. deserialize ( str_deserializer ( field) ) ?) ) ;
102
101
}
103
102
}
104
103
@@ -128,10 +127,8 @@ impl<'de> de::SeqAccess<'de> for PreservedValueAccess {
128
127
match this {
129
128
Self :: OnMagic ( value) => {
130
129
* self = Self :: OnValue ( value) ;
131
- seed. deserialize ( de:: IntoDeserializer :: into_deserializer (
132
- PRESERVED_VALUE_MAGIC ,
133
- ) )
134
- . map ( Some )
130
+ seed. deserialize ( str_deserializer ( PRESERVED_VALUE_MAGIC ) )
131
+ . map ( Some )
135
132
}
136
133
Self :: OnValue ( value) => seed
137
134
. deserialize ( Deserializer {
0 commit comments