@@ -30,17 +30,100 @@ impl Serialize for PackageId {
30
30
where
31
31
S : serde:: ser:: Serializer ,
32
32
{
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 ( )
34
38
}
35
39
}
36
40
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 >
39
43
where
40
- D : serde:: de:: Deserializer < ' a > ,
44
+ D : serde:: de:: Deserializer < ' de > ,
41
45
{
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 )
44
127
}
45
128
}
46
129
0 commit comments