@@ -21,7 +21,7 @@ impl<'de> de::Deserializer<'de> for Value {
21
21
ValueKind :: Float ( f) => visitor. visit_f64 ( f) ,
22
22
ValueKind :: String ( s) => visitor. visit_string ( s) ,
23
23
ValueKind :: Array ( values) => visitor. visit_seq ( SeqAccess :: new ( values) ) ,
24
- ValueKind :: Table ( map) => visitor. visit_map ( MapAccess :: new ( map) ) ,
24
+ ValueKind :: Table ( map) => visitor. visit_map ( MapAccess :: new ( map, self . keys_case_sensitive , self . enum_variants_case_sensitive ) ) ,
25
25
}
26
26
}
27
27
@@ -126,6 +126,7 @@ impl<'de> de::Deserializer<'de> for Value {
126
126
V : de:: Visitor < ' de > ,
127
127
{
128
128
visitor. visit_enum ( EnumAccess {
129
+ variants_case_sensitive : self . enum_variants_case_sensitive ,
129
130
value : self ,
130
131
name,
131
132
variants,
@@ -200,12 +201,16 @@ impl<'de> de::SeqAccess<'de> for SeqAccess {
200
201
201
202
struct MapAccess {
202
203
elements : VecDeque < ( String , Value ) > ,
204
+ keys_case_sensitive : bool ,
205
+ enum_variants_case_sensitive : bool ,
203
206
}
204
207
205
208
impl MapAccess {
206
- fn new ( table : HashMap < String , Value > ) -> Self {
209
+ fn new ( table : HashMap < String , Value > , keys_case_sensitive : bool , enum_variants_case_sensitive : bool ) -> Self {
207
210
MapAccess {
208
211
elements : table. into_iter ( ) . collect ( ) ,
212
+ keys_case_sensitive,
213
+ enum_variants_case_sensitive,
209
214
}
210
215
}
211
216
}
@@ -218,7 +223,9 @@ impl<'de> de::MapAccess<'de> for MapAccess {
218
223
K : de:: DeserializeSeed < ' de > ,
219
224
{
220
225
if let Some ( & ( ref key_s, _) ) = self . elements . front ( ) {
221
- let key_de = Value :: new ( None , key_s as & str ) ;
226
+ let mut key_de = Value :: new ( None , key_s as & str ) ;
227
+ key_de. keys_case_sensitive = self . keys_case_sensitive ;
228
+ key_de. enum_variants_case_sensitive = self . enum_variants_case_sensitive ;
222
229
let key = de:: DeserializeSeed :: deserialize ( seed, key_de) ?;
223
230
224
231
Ok ( Some ( key) )
@@ -240,13 +247,14 @@ struct EnumAccess {
240
247
value : Value ,
241
248
name : & ' static str ,
242
249
variants : & ' static [ & ' static str ] ,
250
+ variants_case_sensitive : bool ,
243
251
}
244
252
245
253
impl EnumAccess {
246
254
fn variant_deserializer ( & self , name : & str ) -> Result < StrDeserializer > {
247
255
self . variants
248
256
. iter ( )
249
- . find ( |& & s| s == name)
257
+ . find ( |& & s| s == name || ( ! self . variants_case_sensitive && s . eq_ignore_ascii_case ( name ) ) )
250
258
. map ( |& s| StrDeserializer ( s) )
251
259
. ok_or_else ( || self . no_constructor_error ( name) )
252
260
}
@@ -353,7 +361,7 @@ impl<'de> de::Deserializer<'de> for Config {
353
361
ValueKind :: Float ( f) => visitor. visit_f64 ( f) ,
354
362
ValueKind :: String ( s) => visitor. visit_string ( s) ,
355
363
ValueKind :: Array ( values) => visitor. visit_seq ( SeqAccess :: new ( values) ) ,
356
- ValueKind :: Table ( map) => visitor. visit_map ( MapAccess :: new ( map) ) ,
364
+ ValueKind :: Table ( map) => visitor. visit_map ( MapAccess :: new ( map, self . keys_case_sensitive , self . enum_variants_case_sensitive ) ) ,
357
365
}
358
366
}
359
367
@@ -454,6 +462,7 @@ impl<'de> de::Deserializer<'de> for Config {
454
462
value : self . cache ,
455
463
name,
456
464
variants,
465
+ variants_case_sensitive : self . enum_variants_case_sensitive ,
457
466
} )
458
467
}
459
468
0 commit comments