@@ -57,15 +57,15 @@ pub(crate) mod serializers {
57
57
Ok ( s) => s,
58
58
Err ( e) => return Err ( e) , // Handle the error or return it
59
59
} ;
60
-
60
+
61
61
// Attempt to serialize the intValue field
62
62
if let Err ( e) = state. serialize_field ( "intValue" , & i. to_string ( ) ) {
63
63
return Err ( e) ; // Handle the error or return it
64
64
}
65
-
65
+
66
66
// Finalize the struct serialization
67
67
state. end ( )
68
- } ,
68
+ }
69
69
Some ( value) => value. serialize ( serializer) ,
70
70
None => serializer. serialize_none ( ) ,
71
71
} ,
@@ -74,76 +74,95 @@ pub(crate) mod serializers {
74
74
}
75
75
76
76
pub fn deserialize_from_value < ' de , D > ( deserializer : D ) -> Result < Option < AnyValue > , D :: Error >
77
- where
78
- D : Deserializer < ' de > ,
79
- {
80
- struct ValueVisitor ;
77
+ where
78
+ D : Deserializer < ' de > ,
79
+ {
80
+ struct ValueVisitor ;
81
81
82
- impl < ' de > de:: Visitor < ' de > for ValueVisitor {
83
- type Value = AnyValue ;
82
+ #[ derive( Deserialize ) ]
83
+ #[ serde( untagged) ]
84
+ enum StringOrInt {
85
+ Int ( i64 ) ,
86
+ String ( String ) ,
87
+ }
84
88
85
- fn expecting ( & self , formatter : & mut fmt:: Formatter ) -> fmt:: Result {
86
- formatter. write_str ( "a JSON object for AnyValue" )
89
+ impl StringOrInt {
90
+ fn get_int < ' de , V > ( & self ) -> Result < i64 , V :: Error >
91
+ where
92
+ V : de:: MapAccess < ' de > ,
93
+ {
94
+ match self {
95
+ Self :: Int ( val) => Ok ( * val) ,
96
+ Self :: String ( val) => Ok ( val. parse :: < i64 > ( ) . map_err ( de:: Error :: custom) ?) ,
97
+ }
98
+ }
87
99
}
88
100
89
- fn visit_map < V > ( self , mut map : V ) -> Result < AnyValue , V :: Error >
90
- where
91
- V : de:: MapAccess < ' de > ,
92
- {
93
- let mut value: Option < any_value:: Value > = None ;
94
-
95
- while let Some ( key) = map. next_key :: < String > ( ) ? {
96
- let key_str = key. as_str ( ) ;
97
- match key_str {
98
- "stringValue" => {
99
- let s = map. next_value ( ) ?;
100
- value = Some ( any_value:: Value :: StringValue ( s) ) ;
101
- } ,
102
- "boolValue" => {
103
- let b = map. next_value ( ) ?;
104
- value = Some ( any_value:: Value :: BoolValue ( b) ) ;
105
- } ,
106
- "intValue" => {
107
- let value_str = map. next_value :: < String > ( ) ?;
108
- let int_value = value_str. parse :: < i64 > ( )
109
- . map_err ( de:: Error :: custom) ?;
110
- value = Some ( any_value:: Value :: IntValue ( int_value) ) ;
111
- } ,
112
- "doubleValue" => {
113
- let d = map. next_value ( ) ?;
114
- value = Some ( any_value:: Value :: DoubleValue ( d) ) ;
115
- } ,
116
- "arrayValue" => {
117
- let a = map. next_value ( ) ?;
118
- value = Some ( any_value:: Value :: ArrayValue ( a) ) ;
119
- } ,
120
- "kvlistValue" => {
121
- let kv = map. next_value ( ) ?;
122
- value = Some ( any_value:: Value :: KvlistValue ( kv) ) ;
123
- } ,
124
- "bytesValue" => {
125
- let bytes = map. next_value ( ) ?;
126
- value = Some ( any_value:: Value :: BytesValue ( bytes) ) ;
127
- } ,
128
- _ => {
129
- //skip unknown keys, and handle error later.
130
- continue
101
+ impl < ' de > de:: Visitor < ' de > for ValueVisitor {
102
+ type Value = AnyValue ;
103
+
104
+ fn expecting ( & self , formatter : & mut fmt:: Formatter ) -> fmt:: Result {
105
+ formatter. write_str ( "a JSON object for AnyValue" )
106
+ }
107
+
108
+ fn visit_map < V > ( self , mut map : V ) -> Result < AnyValue , V :: Error >
109
+ where
110
+ V : de:: MapAccess < ' de > ,
111
+ {
112
+ let mut value: Option < any_value:: Value > = None ;
113
+
114
+ while let Some ( key) = map. next_key :: < String > ( ) ? {
115
+ let key_str = key. as_str ( ) ;
116
+ match key_str {
117
+ "stringValue" => {
118
+ let s = map. next_value ( ) ?;
119
+ value = Some ( any_value:: Value :: StringValue ( s) ) ;
120
+ }
121
+ "boolValue" => {
122
+ let b = map. next_value ( ) ?;
123
+ value = Some ( any_value:: Value :: BoolValue ( b) ) ;
124
+ }
125
+ "intValue" => {
126
+ let int_value = map. next_value :: < StringOrInt > ( ) ?. get_int :: < V > ( ) ?;
127
+ value = Some ( any_value:: Value :: IntValue ( int_value) ) ;
128
+ }
129
+ "doubleValue" => {
130
+ let d = map. next_value ( ) ?;
131
+ value = Some ( any_value:: Value :: DoubleValue ( d) ) ;
132
+ }
133
+ "arrayValue" => {
134
+ let a = map. next_value ( ) ?;
135
+ value = Some ( any_value:: Value :: ArrayValue ( a) ) ;
136
+ }
137
+ "kvlistValue" => {
138
+ let kv = map. next_value ( ) ?;
139
+ value = Some ( any_value:: Value :: KvlistValue ( kv) ) ;
140
+ }
141
+ "bytesValue" => {
142
+ let bytes = map. next_value ( ) ?;
143
+ value = Some ( any_value:: Value :: BytesValue ( bytes) ) ;
144
+ }
145
+ _ => {
146
+ //skip unknown keys, and handle error later.
147
+ continue ;
148
+ }
131
149
}
132
150
}
133
- }
134
151
135
- if let Some ( v) = value {
136
- Ok ( AnyValue { value : Some ( v) } )
137
- } else {
138
- Err ( de:: Error :: custom ( "Invalid data for AnyValue, no known keys found" ) )
152
+ if let Some ( v) = value {
153
+ Ok ( AnyValue { value : Some ( v) } )
154
+ } else {
155
+ Err ( de:: Error :: custom (
156
+ "Invalid data for AnyValue, no known keys found" ,
157
+ ) )
158
+ }
139
159
}
140
160
}
161
+
162
+ let value = deserializer. deserialize_map ( ValueVisitor ) ?;
163
+ Ok ( Some ( value) )
141
164
}
142
165
143
- let value = deserializer. deserialize_map ( ValueVisitor ) ?;
144
- Ok ( Some ( value) )
145
- }
146
-
147
166
pub fn serialize_u64_to_string < S > ( value : & u64 , serializer : S ) -> Result < S :: Ok , S :: Error >
148
167
where
149
168
S : Serializer ,
@@ -167,7 +186,7 @@ where
167
186
let s = value. to_string ( ) ;
168
187
serializer. serialize_str ( & s)
169
188
}
170
-
189
+
171
190
pub fn deserialize_string_to_i64 < ' de , D > ( deserializer : D ) -> Result < i64 , D :: Error >
172
191
where
173
192
D : Deserializer < ' de > ,
0 commit comments