@@ -22,7 +22,7 @@ use crate::spanned;
22
22
use crate :: tokens:: { Error as TokenError , Span , Token , Tokenizer } ;
23
23
24
24
/// Type Alias for a TOML Table pair
25
- type TablePair < ' a > = ( Cow < ' a , str > , Value < ' a > ) ;
25
+ type TablePair < ' a > = ( ( Span , Cow < ' a , str > ) , Value < ' a > ) ;
26
26
27
27
/// Deserializes a byte slice into a type.
28
28
///
@@ -318,9 +318,16 @@ impl<'de, 'b> de::Deserializer<'de> for &'b mut Deserializer<'de> {
318
318
}
319
319
}
320
320
321
+ fn headers_equal < ' a , ' b > ( hdr_a : & [ ( Span , Cow < ' a , str > ) ] , hdr_b : & [ ( Span , Cow < ' b , str > ) ] ) -> bool {
322
+ if hdr_a. len ( ) != hdr_b. len ( ) {
323
+ return false ;
324
+ }
325
+ hdr_a. iter ( ) . zip ( hdr_b. iter ( ) ) . all ( |( h1, h2) | h1. 1 == h2. 1 )
326
+ }
327
+
321
328
struct Table < ' a > {
322
329
at : usize ,
323
- header : Vec < Cow < ' a , str > > ,
330
+ header : Vec < ( Span , Cow < ' a , str > ) > ,
324
331
values : Option < Vec < TablePair < ' a > > > ,
325
332
array : bool ,
326
333
}
@@ -351,7 +358,7 @@ impl<'de, 'b> de::MapAccess<'de> for MapVisitor<'de, 'b> {
351
358
loop {
352
359
assert ! ( self . next_value. is_none( ) ) ;
353
360
if let Some ( ( key, value) ) = self . values . next ( ) {
354
- let ret = seed. deserialize ( StrDeserializer :: new ( key. clone ( ) ) ) ?;
361
+ let ret = seed. deserialize ( StrDeserializer :: spanned ( key. clone ( ) ) ) ?;
355
362
self . next_value = Some ( ( key, value) ) ;
356
363
return Ok ( Some ( ret) ) ;
357
364
}
@@ -366,7 +373,7 @@ impl<'de, 'b> de::MapAccess<'de> for MapVisitor<'de, 'b> {
366
373
return false ;
367
374
}
368
375
match t. header . get ( ..self . depth ) {
369
- Some ( header) => header == prefix,
376
+ Some ( header) => headers_equal ( & header, & prefix) ,
370
377
None => false ,
371
378
}
372
379
} )
@@ -382,9 +389,17 @@ impl<'de, 'b> de::MapAccess<'de> for MapVisitor<'de, 'b> {
382
389
// Test to see if we're duplicating our parent's table, and if so
383
390
// then this is an error in the toml format
384
391
if self . cur_parent != pos {
385
- if self . tables [ self . cur_parent ] . header == self . tables [ pos] . header {
392
+ if headers_equal (
393
+ & self . tables [ self . cur_parent ] . header ,
394
+ & self . tables [ pos] . header ,
395
+ ) {
386
396
let at = self . tables [ pos] . at ;
387
- let name = self . tables [ pos] . header . join ( "." ) ;
397
+ let name = self . tables [ pos]
398
+ . header
399
+ . iter ( )
400
+ . map ( |k| k. 1 . to_owned ( ) )
401
+ . collect :: < Vec < _ > > ( )
402
+ . join ( "." ) ;
388
403
return Err ( self . de . error ( at, ErrorKind :: DuplicateTable ( name) ) ) ;
389
404
}
390
405
@@ -408,7 +423,7 @@ impl<'de, 'b> de::MapAccess<'de> for MapVisitor<'de, 'b> {
408
423
// decoding.
409
424
if self . depth != table. header . len ( ) {
410
425
let key = & table. header [ self . depth ] ;
411
- let key = seed. deserialize ( StrDeserializer :: new ( key. clone ( ) ) ) ?;
426
+ let key = seed. deserialize ( StrDeserializer :: spanned ( key. clone ( ) ) ) ?;
412
427
return Ok ( Some ( key) ) ;
413
428
}
414
429
@@ -437,7 +452,7 @@ impl<'de, 'b> de::MapAccess<'de> for MapVisitor<'de, 'b> {
437
452
match seed. deserialize ( ValueDeserializer :: new ( v) ) {
438
453
Ok ( v) => return Ok ( v) ,
439
454
Err ( mut e) => {
440
- e. add_key_context ( & k) ;
455
+ e. add_key_context ( & k. 1 ) ;
441
456
return Err ( e) ;
442
457
}
443
458
}
@@ -458,7 +473,7 @@ impl<'de, 'b> de::MapAccess<'de> for MapVisitor<'de, 'b> {
458
473
de : & mut * self . de ,
459
474
} ) ;
460
475
res. map_err ( |mut e| {
461
- e. add_key_context ( & self . tables [ self . cur - 1 ] . header [ self . depth ] ) ;
476
+ e. add_key_context ( & self . tables [ self . cur - 1 ] . header [ self . depth ] . 1 ) ;
462
477
e
463
478
} )
464
479
}
@@ -482,7 +497,10 @@ impl<'de, 'b> de::SeqAccess<'de> for MapVisitor<'de, 'b> {
482
497
. iter ( )
483
498
. enumerate ( )
484
499
. skip ( self . cur_parent + 1 )
485
- . find ( |& ( _, table) | table. array && table. header == self . tables [ self . cur_parent ] . header )
500
+ . find ( |& ( _, table) | {
501
+ let tables_eq = headers_equal ( & table. header , & self . tables [ self . cur_parent ] . header ) ;
502
+ table. array && tables_eq
503
+ } )
486
504
. map ( |p| p. 0 )
487
505
. unwrap_or ( self . max ) ;
488
506
@@ -560,9 +578,9 @@ impl<'de, 'b> de::Deserializer<'de> for MapVisitor<'de, 'b> {
560
578
if table. header . len ( ) == 0 {
561
579
return Err ( self . de . error ( self . cur , ErrorKind :: EmptyTableKey ) ) ;
562
580
}
563
- let name = table. header [ table. header . len ( ) - 1 ] . to_owned ( ) ;
581
+ let name = table. header [ table. header . len ( ) - 1 ] . 1 . to_owned ( ) ;
564
582
visitor. visit_enum ( DottedTableDeserializer {
565
- name : name ,
583
+ name,
566
584
value : Value {
567
585
e : E :: DottedTable ( values) ,
568
586
start : 0 ,
@@ -579,12 +597,27 @@ impl<'de, 'b> de::Deserializer<'de> for MapVisitor<'de, 'b> {
579
597
}
580
598
581
599
struct StrDeserializer < ' a > {
600
+ span : Option < Span > ,
582
601
key : Cow < ' a , str > ,
583
602
}
584
603
585
604
impl < ' a > StrDeserializer < ' a > {
605
+ fn spanned ( inner : ( Span , Cow < ' a , str > ) ) -> StrDeserializer < ' a > {
606
+ StrDeserializer {
607
+ span : Some ( inner. 0 ) ,
608
+ key : inner. 1 ,
609
+ }
610
+ }
586
611
fn new ( key : Cow < ' a , str > ) -> StrDeserializer < ' a > {
587
- StrDeserializer { key }
612
+ StrDeserializer { span : None , key }
613
+ }
614
+ }
615
+
616
+ impl < ' a , ' b > de:: IntoDeserializer < ' a , Error > for StrDeserializer < ' a > {
617
+ type Deserializer = Self ;
618
+
619
+ fn into_deserializer ( self ) -> Self :: Deserializer {
620
+ self
588
621
}
589
622
}
590
623
@@ -601,9 +634,31 @@ impl<'de> de::Deserializer<'de> for StrDeserializer<'de> {
601
634
}
602
635
}
603
636
637
+ fn deserialize_struct < V > (
638
+ self ,
639
+ name : & ' static str ,
640
+ fields : & ' static [ & ' static str ] ,
641
+ visitor : V ,
642
+ ) -> Result < V :: Value , Error >
643
+ where
644
+ V : de:: Visitor < ' de > ,
645
+ {
646
+ if name == spanned:: NAME && fields == [ spanned:: START , spanned:: END , spanned:: VALUE ] {
647
+ if let Some ( span) = self . span {
648
+ return visitor. visit_map ( SpannedDeserializer {
649
+ phantom_data : PhantomData ,
650
+ start : Some ( span. start ) ,
651
+ value : Some ( StrDeserializer :: new ( self . key ) ) ,
652
+ end : Some ( span. end ) ,
653
+ } ) ;
654
+ }
655
+ }
656
+ self . deserialize_any ( visitor)
657
+ }
658
+
604
659
serde:: forward_to_deserialize_any! {
605
660
bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string seq
606
- bytes byte_buf map struct option unit newtype_struct
661
+ bytes byte_buf map option unit newtype_struct
607
662
ignored_any unit_struct tuple_struct tuple enum identifier
608
663
}
609
664
}
@@ -690,21 +745,21 @@ impl<'de> de::Deserializer<'de> for ValueDeserializer<'de> {
690
745
. iter ( )
691
746
. filter_map ( |key_value| {
692
747
let ( ref key, ref _val) = * key_value;
693
- if !fields. contains ( & & ( * * key) ) {
748
+ if !fields. contains ( & & * ( key. 1 ) ) {
694
749
Some ( key. clone ( ) )
695
750
} else {
696
751
None
697
752
}
698
753
} )
699
- . collect :: < Vec < Cow < ' de , str > > > ( ) ;
754
+ . collect :: < Vec < _ > > ( ) ;
700
755
701
756
if !extra_fields. is_empty ( ) {
702
757
return Err ( Error :: from_kind (
703
758
Some ( self . value . start ) ,
704
759
ErrorKind :: UnexpectedKeys {
705
760
keys : extra_fields
706
761
. iter ( )
707
- . map ( |k| k. to_string ( ) )
762
+ . map ( |k| k. 1 . to_string ( ) )
708
763
. collect :: < Vec < _ > > ( ) ,
709
764
available : fields,
710
765
} ,
@@ -943,7 +998,7 @@ impl<'de> de::MapAccess<'de> for InlineTableDeserializer<'de> {
943
998
None => return Ok ( None ) ,
944
999
} ;
945
1000
self . next_value = Some ( value) ;
946
- seed. deserialize ( StrDeserializer :: new ( key) ) . map ( Some )
1001
+ seed. deserialize ( StrDeserializer :: spanned ( key) ) . map ( Some )
947
1002
}
948
1003
949
1004
fn next_value_seed < V > ( & mut self , seed : V ) -> Result < V :: Value , Error >
@@ -976,7 +1031,7 @@ impl<'de> de::EnumAccess<'de> for InlineTableDeserializer<'de> {
976
1031
}
977
1032
} ;
978
1033
979
- seed. deserialize ( StrDeserializer :: new ( key) )
1034
+ seed. deserialize ( StrDeserializer :: new ( key. 1 ) )
980
1035
. map ( |val| ( val, TableEnumDeserializer { value } ) )
981
1036
}
982
1037
}
@@ -1027,13 +1082,13 @@ impl<'de> de::VariantAccess<'de> for TableEnumDeserializer<'de> {
1027
1082
let tuple_values = values
1028
1083
. into_iter ( )
1029
1084
. enumerate ( )
1030
- . map ( |( index, ( key, value) ) | match key. parse :: < usize > ( ) {
1085
+ . map ( |( index, ( key, value) ) | match key. 1 . parse :: < usize > ( ) {
1031
1086
Ok ( key_index) if key_index == index => Ok ( value) ,
1032
1087
Ok ( _) | Err ( _) => Err ( Error :: from_kind (
1033
- Some ( value . start ) ,
1088
+ Some ( key . 0 . start ) ,
1034
1089
ErrorKind :: ExpectedTupleIndex {
1035
1090
expected : index,
1036
- found : key. to_string ( ) ,
1091
+ found : key. 1 . to_string ( ) ,
1037
1092
} ,
1038
1093
) ) ,
1039
1094
} )
@@ -1350,14 +1405,14 @@ impl<'a> Deserializer<'a> {
1350
1405
. as_ref ( )
1351
1406
. and_then ( |values| values. last ( ) )
1352
1407
. map ( |& ( _, ref val) | val. end )
1353
- . unwrap_or_else ( || header. len ( ) ) ;
1408
+ . unwrap_or_else ( || header. 1 . len ( ) ) ;
1354
1409
Ok ( (
1355
1410
Value {
1356
1411
e : E :: DottedTable ( table. values . unwrap_or_else ( Vec :: new) ) ,
1357
1412
start,
1358
1413
end,
1359
1414
} ,
1360
- Some ( header. clone ( ) ) ,
1415
+ Some ( header. 1 . clone ( ) ) ,
1361
1416
) )
1362
1417
}
1363
1418
Some ( _) => self . value ( ) . map ( |val| ( val, None ) ) ,
@@ -1672,14 +1727,11 @@ impl<'a> Deserializer<'a> {
1672
1727
Ok ( ( span, ret) )
1673
1728
}
1674
1729
1675
- fn table_key ( & mut self ) -> Result < Cow < ' a , str > , Error > {
1676
- self . tokens
1677
- . table_key ( )
1678
- . map ( |t| t. 1 )
1679
- . map_err ( |e| self . token_error ( e) )
1730
+ fn table_key ( & mut self ) -> Result < ( Span , Cow < ' a , str > ) , Error > {
1731
+ self . tokens . table_key ( ) . map_err ( |e| self . token_error ( e) )
1680
1732
}
1681
1733
1682
- fn dotted_key ( & mut self ) -> Result < Vec < Cow < ' a , str > > , Error > {
1734
+ fn dotted_key ( & mut self ) -> Result < Vec < ( Span , Cow < ' a , str > ) > , Error > {
1683
1735
let mut result = Vec :: new ( ) ;
1684
1736
result. push ( self . table_key ( ) ?) ;
1685
1737
self . eat_whitespace ( ) ?;
@@ -1705,7 +1757,7 @@ impl<'a> Deserializer<'a> {
1705
1757
/// * `values`: The `Vec` to store the value in.
1706
1758
fn add_dotted_key (
1707
1759
& self ,
1708
- mut key_parts : Vec < Cow < ' a , str > > ,
1760
+ mut key_parts : Vec < ( Span , Cow < ' a , str > ) > ,
1709
1761
value : Value < ' a > ,
1710
1762
values : & mut Vec < TablePair < ' a > > ,
1711
1763
) -> Result < ( ) , Error > {
@@ -1714,7 +1766,7 @@ impl<'a> Deserializer<'a> {
1714
1766
values. push ( ( key, value) ) ;
1715
1767
return Ok ( ( ) ) ;
1716
1768
}
1717
- match values. iter_mut ( ) . find ( |& & mut ( ref k, _) | * k == key) {
1769
+ match values. iter_mut ( ) . find ( |& & mut ( ref k, _) | * k. 1 == key. 1 ) {
1718
1770
Some ( & mut (
1719
1771
_,
1720
1772
Value {
@@ -2038,7 +2090,7 @@ enum Line<'a> {
2038
2090
header : Header < ' a > ,
2039
2091
array : bool ,
2040
2092
} ,
2041
- KeyValue ( Vec < Cow < ' a , str > > , Value < ' a > ) ,
2093
+ KeyValue ( Vec < ( Span , Cow < ' a , str > ) > , Value < ' a > ) ,
2042
2094
}
2043
2095
2044
2096
struct Header < ' a > {
@@ -2058,13 +2110,13 @@ impl<'a> Header<'a> {
2058
2110
}
2059
2111
}
2060
2112
2061
- fn next ( & mut self ) -> Result < Option < Cow < ' a , str > > , TokenError > {
2113
+ fn next ( & mut self ) -> Result < Option < ( Span , Cow < ' a , str > ) > , TokenError > {
2062
2114
self . tokens . eat_whitespace ( ) ?;
2063
2115
2064
2116
if self . first || self . tokens . eat ( Token :: Period ) ? {
2065
2117
self . first = false ;
2066
2118
self . tokens . eat_whitespace ( ) ?;
2067
- self . tokens . table_key ( ) . map ( |t| t. 1 ) . map ( Some )
2119
+ self . tokens . table_key ( ) . map ( |t| t) . map ( Some )
2068
2120
} else {
2069
2121
self . tokens . expect ( Token :: RightBracket ) ?;
2070
2122
if self . array {
0 commit comments