@@ -9,6 +9,7 @@ use crate::{
9
9
types:: { GetType , RhsValue , Type } ,
10
10
} ;
11
11
use fnv:: FnvBuildHasher ;
12
+ use serde:: de:: Visitor ;
12
13
use serde:: ser:: SerializeMap ;
13
14
use serde:: { Deserialize , Deserializer , Serialize , Serializer } ;
14
15
use std:: collections:: hash_map:: Entry ;
@@ -139,7 +140,7 @@ impl<'s> FieldRef<'s> {
139
140
/// Returns the field's name as recorded in the [`Scheme`](struct@Scheme).
140
141
#[ inline]
141
142
pub fn name ( & self ) -> & ' s str {
142
- & self . scheme . inner . fields [ self . index ] . 0
143
+ & self . scheme . inner . fields [ self . index ] . name
143
144
}
144
145
145
146
/// Get the field's index in the [`Scheme`](struct@Scheme) identifier's list.
@@ -183,7 +184,7 @@ impl<'s> FieldRef<'s> {
183
184
impl GetType for FieldRef < ' _ > {
184
185
#[ inline]
185
186
fn get_type ( & self ) -> Type {
186
- self . scheme . inner . fields [ self . index ] . 1
187
+ self . scheme . inner . fields [ self . index ] . ty
187
188
}
188
189
}
189
190
@@ -217,7 +218,7 @@ impl Field {
217
218
/// Returns the field's name as recorded in the [`Scheme`](struct@Scheme).
218
219
#[ inline]
219
220
pub fn name ( & self ) -> & str {
220
- & self . scheme . inner . fields [ self . index ] . 0
221
+ & self . scheme . inner . fields [ self . index ] . name
221
222
}
222
223
223
224
/// Get the field's index in the [`Scheme`](struct@Scheme) identifier's list.
@@ -245,7 +246,7 @@ impl Field {
245
246
impl GetType for Field {
246
247
#[ inline]
247
248
fn get_type ( & self ) -> Type {
248
- self . scheme . inner . fields [ self . index ] . 1
249
+ self . scheme . inner . fields [ self . index ] . ty
249
250
}
250
251
}
251
252
@@ -609,10 +610,16 @@ pub struct ListRedefinitionError(Type);
609
610
610
611
type IdentifierName = Arc < str > ;
611
612
613
+ #[ derive( Debug , PartialEq ) ]
614
+ struct FieldDefinition {
615
+ name : IdentifierName ,
616
+ ty : Type ,
617
+ }
618
+
612
619
/// A builder for a [`Scheme`].
613
620
#[ derive( Default , Debug ) ]
614
621
pub struct SchemeBuilder {
615
- fields : Vec < ( IdentifierName , Type ) > ,
622
+ fields : Vec < FieldDefinition > ,
616
623
functions : Vec < ( IdentifierName , Box < dyn FunctionDefinition > ) > ,
617
624
items : HashMap < IdentifierName , SchemeItem , FnvBuildHasher > ,
618
625
@@ -643,7 +650,10 @@ impl SchemeBuilder {
643
650
} ,
644
651
Entry :: Vacant ( entry) => {
645
652
let index = self . fields . len ( ) ;
646
- self . fields . push ( ( entry. key ( ) . clone ( ) , ty) ) ;
653
+ self . fields . push ( FieldDefinition {
654
+ name : entry. key ( ) . clone ( ) ,
655
+ ty,
656
+ } ) ;
647
657
entry. insert ( SchemeItem :: Field ( index) ) ;
648
658
Ok ( ( ) )
649
659
}
@@ -737,14 +747,21 @@ impl Hash for Scheme {
737
747
}
738
748
}
739
749
750
+ #[ derive( Deserialize , Serialize ) ]
751
+ struct SerdeField {
752
+ #[ serde( rename = "type" ) ]
753
+ ty : Type ,
754
+ }
755
+
740
756
impl Serialize for Scheme {
741
757
fn serialize < S > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error >
742
758
where
743
759
S : Serializer ,
744
760
{
745
- let mut map = serializer. serialize_map ( Some ( self . field_count ( ) ) ) ?;
746
- for f in self . fields ( ) {
747
- map. serialize_entry ( f. name ( ) , & f. get_type ( ) ) ?;
761
+ let fields = self . fields ( ) ;
762
+ let mut map = serializer. serialize_map ( Some ( fields. len ( ) ) ) ?;
763
+ for f in fields {
764
+ map. serialize_entry ( f. name ( ) , & SerdeField { ty : f. get_type ( ) } ) ?;
748
765
}
749
766
map. end ( )
750
767
}
@@ -757,12 +774,31 @@ impl<'de> Deserialize<'de> for Scheme {
757
774
{
758
775
use serde:: de:: Error ;
759
776
760
- let mut builder = SchemeBuilder :: new ( ) ;
761
- let map: HashMap < String , Type > = HashMap :: < String , Type > :: deserialize ( deserializer) ?;
762
- for ( name, ty) in map {
763
- builder. add_field ( & name, ty) . map_err ( D :: Error :: custom) ?;
777
+ struct FieldMapVisitor ;
778
+
779
+ impl < ' de > Visitor < ' de > for FieldMapVisitor {
780
+ type Value = SchemeBuilder ;
781
+
782
+ fn expecting ( & self , formatter : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
783
+ formatter. write_str ( "a wirefilter scheme" )
784
+ }
785
+
786
+ fn visit_map < A > ( self , mut map : A ) -> Result < Self :: Value , A :: Error >
787
+ where
788
+ A : serde:: de:: MapAccess < ' de > ,
789
+ {
790
+ let mut builder = SchemeBuilder :: new ( ) ;
791
+ while let Some ( ( name, SerdeField { ty } ) ) = map. next_entry :: < & str , SerdeField > ( ) ? {
792
+ builder. add_field ( name, ty) . map_err ( A :: Error :: custom) ?;
793
+ }
794
+
795
+ Ok ( builder)
796
+ }
764
797
}
765
- Ok ( builder. build ( ) )
798
+
799
+ deserializer
800
+ . deserialize_map ( FieldMapVisitor )
801
+ . map ( |builder| builder. build ( ) )
766
802
}
767
803
}
768
804
@@ -1743,3 +1779,24 @@ fn test_scheme_iter_fields() {
1743
1779
]
1744
1780
) ;
1745
1781
}
1782
+
1783
+ #[ test]
1784
+ fn test_scheme_json_serialization ( ) {
1785
+ let scheme = Scheme ! {
1786
+ bytes: Bytes ,
1787
+ int: Int ,
1788
+ bool : Bool ,
1789
+ ip: Ip ,
1790
+ map_of_bytes: Map ( Bytes ) ,
1791
+ map_of_array_of_bytes: Map ( Array ( Bytes ) ) ,
1792
+ array_of_bytes: Array ( Bytes ) ,
1793
+ array_of_map_of_bytes: Array ( Map ( Bytes ) ) ,
1794
+ }
1795
+ . build ( ) ;
1796
+
1797
+ let json = serde_json:: to_string ( & scheme) . unwrap ( ) ;
1798
+
1799
+ let new_scheme = serde_json:: from_str :: < Scheme > ( & json) . unwrap ( ) ;
1800
+
1801
+ assert_eq ! ( scheme. inner. fields, new_scheme. inner. fields) ;
1802
+ }
0 commit comments