@@ -30,17 +30,100 @@ impl Serialize for PackageId {
3030 where
3131 S : serde:: ser:: Serializer ,
3232 {
33- format ! ( "{}" , self ) . serialize ( serializer)
33+ use serde:: ser:: SerializeStruct ;
34+ let mut state = serializer. serialize_struct ( "PackageId" , 2 ) ?;
35+ state. serialize_field ( "package_name" , & self . package_name ) ?;
36+ state. serialize_field ( "publisher_node" , & self . publisher_node ) ?;
37+ state. end ( )
3438 }
3539}
3640
37- impl < ' a > Deserialize < ' a > for PackageId {
38- fn deserialize < D > ( deserializer : D ) -> Result < PackageId , D :: Error >
41+ impl < ' de > Deserialize < ' de > for PackageId {
42+ fn deserialize < D > ( deserializer : D ) -> Result < Self , D :: Error >
3943 where
40- D : serde:: de:: Deserializer < ' a > ,
44+ D : serde:: de:: Deserializer < ' de > ,
4145 {
42- let s = String :: deserialize ( deserializer) ?;
43- s. parse ( ) . map_err ( serde:: de:: Error :: custom)
46+ use serde:: de:: { Deserialize , Visitor } ;
47+ enum Field {
48+ PackageName ,
49+ PublisherNode ,
50+ }
51+
52+ impl < ' de > Deserialize < ' de > for Field {
53+ fn deserialize < D > ( deserializer : D ) -> Result < Self , D :: Error >
54+ where
55+ D : serde:: de:: Deserializer < ' de > ,
56+ {
57+ struct FieldVisitor ;
58+
59+ impl < ' de > Visitor < ' de > for FieldVisitor {
60+ type Value = Field ;
61+
62+ fn expecting ( & self , formatter : & mut std:: fmt:: Formatter ) -> std:: fmt:: Result {
63+ formatter. write_str ( "`package_name` or `publisher_node`" )
64+ }
65+
66+ fn visit_str < E > ( self , value : & str ) -> Result < Field , E >
67+ where
68+ E : serde:: de:: Error ,
69+ {
70+ match value {
71+ "package_name" => Ok ( Field :: PackageName ) ,
72+ "publisher_node" => Ok ( Field :: PublisherNode ) ,
73+ _ => Err ( serde:: de:: Error :: unknown_field ( value, FIELDS ) ) ,
74+ }
75+ }
76+ }
77+
78+ const FIELDS : & ' static [ & ' static str ] = & [ "package_name" , "publisher_node" ] ;
79+ deserializer. deserialize_identifier ( FieldVisitor )
80+ }
81+ }
82+
83+ struct PackageIdVisitor ;
84+
85+ impl < ' de > Visitor < ' de > for PackageIdVisitor {
86+ type Value = PackageId ;
87+
88+ fn expecting ( & self , formatter : & mut std:: fmt:: Formatter ) -> std:: fmt:: Result {
89+ formatter. write_str ( "struct PackageId" )
90+ }
91+
92+ fn visit_map < V > ( self , mut map : V ) -> Result < PackageId , V :: Error >
93+ where
94+ V : serde:: de:: MapAccess < ' de > ,
95+ {
96+ let mut package_name = None ;
97+ let mut publisher_node = None ;
98+ while let Some ( key) = map. next_key ( ) ? {
99+ match key {
100+ Field :: PackageName => {
101+ if package_name. is_some ( ) {
102+ return Err ( serde:: de:: Error :: duplicate_field ( "package_name" ) ) ;
103+ }
104+ package_name = Some ( map. next_value ( ) ?) ;
105+ }
106+ Field :: PublisherNode => {
107+ if publisher_node. is_some ( ) {
108+ return Err ( serde:: de:: Error :: duplicate_field ( "publisher_node" ) ) ;
109+ }
110+ publisher_node = Some ( map. next_value ( ) ?) ;
111+ }
112+ }
113+ }
114+ let package_name =
115+ package_name. ok_or_else ( || serde:: de:: Error :: missing_field ( "package_name" ) ) ?;
116+ let publisher_node = publisher_node
117+ . ok_or_else ( || serde:: de:: Error :: missing_field ( "publisher_node" ) ) ?;
118+ Ok ( PackageId {
119+ package_name,
120+ publisher_node,
121+ } )
122+ }
123+ }
124+
125+ const FIELDS : & ' static [ & ' static str ] = & [ "package_name" , "publisher_node" ] ;
126+ deserializer. deserialize_struct ( "PackageId" , FIELDS , PackageIdVisitor )
44127 }
45128}
46129
0 commit comments