@@ -118,31 +118,83 @@ impl Serialize for AnyValue<'_> {
118
118
let name = "AnyValue" ;
119
119
match self {
120
120
AnyValue :: Null => serializer. serialize_unit_variant ( name, 0 , "Null" ) ,
121
+
121
122
AnyValue :: Int8 ( v) => serializer. serialize_newtype_variant ( name, 1 , "Int8" , v) ,
122
123
AnyValue :: Int16 ( v) => serializer. serialize_newtype_variant ( name, 2 , "Int16" , v) ,
123
124
AnyValue :: Int32 ( v) => serializer. serialize_newtype_variant ( name, 3 , "Int32" , v) ,
124
125
AnyValue :: Int64 ( v) => serializer. serialize_newtype_variant ( name, 4 , "Int64" , v) ,
125
- AnyValue :: Int128 ( v) => serializer. serialize_newtype_variant ( name, 4 , "Int128" , v) ,
126
- AnyValue :: UInt8 ( v) => serializer. serialize_newtype_variant ( name, 5 , "UInt8" , v) ,
127
- AnyValue :: UInt16 ( v) => serializer. serialize_newtype_variant ( name, 6 , "UInt16" , v) ,
128
- AnyValue :: UInt32 ( v) => serializer. serialize_newtype_variant ( name, 7 , "UInt32" , v) ,
129
- AnyValue :: UInt64 ( v) => serializer. serialize_newtype_variant ( name, 8 , "UInt64" , v) ,
130
- AnyValue :: Float32 ( v) => serializer. serialize_newtype_variant ( name, 9 , "Float32" , v) ,
131
- AnyValue :: Float64 ( v) => serializer. serialize_newtype_variant ( name, 10 , "Float64" , v) ,
132
- AnyValue :: List ( v) => serializer. serialize_newtype_variant ( name, 11 , "List" , v) ,
133
- AnyValue :: Boolean ( v) => serializer. serialize_newtype_variant ( name, 12 , "Bool" , v) ,
134
- // both string variants same number
135
- AnyValue :: String ( v) => serializer. serialize_newtype_variant ( name, 13 , "StringOwned" , v) ,
126
+ AnyValue :: Int128 ( v) => serializer. serialize_newtype_variant ( name, 5 , "Int128" , v) ,
127
+ AnyValue :: UInt8 ( v) => serializer. serialize_newtype_variant ( name, 6 , "UInt8" , v) ,
128
+ AnyValue :: UInt16 ( v) => serializer. serialize_newtype_variant ( name, 7 , "UInt16" , v) ,
129
+ AnyValue :: UInt32 ( v) => serializer. serialize_newtype_variant ( name, 8 , "UInt32" , v) ,
130
+ AnyValue :: UInt64 ( v) => serializer. serialize_newtype_variant ( name, 9 , "UInt64" , v) ,
131
+ AnyValue :: Float32 ( v) => serializer. serialize_newtype_variant ( name, 10 , "Float32" , v) ,
132
+ AnyValue :: Float64 ( v) => serializer. serialize_newtype_variant ( name, 11 , "Float64" , v) ,
133
+ AnyValue :: List ( v) => serializer. serialize_newtype_variant ( name, 12 , "List" , v) ,
134
+ AnyValue :: Boolean ( v) => serializer. serialize_newtype_variant ( name, 13 , "Bool" , v) ,
135
+
136
+ // both variants same number
137
+ AnyValue :: String ( v) => serializer. serialize_newtype_variant ( name, 14 , "StringOwned" , v) ,
136
138
AnyValue :: StringOwned ( v) => {
137
- serializer. serialize_newtype_variant ( name, 13 , "StringOwned" , v. as_str ( ) )
139
+ serializer. serialize_newtype_variant ( name, 14 , "StringOwned" , v. as_str ( ) )
138
140
} ,
139
- AnyValue :: Binary ( v) => serializer. serialize_newtype_variant ( name, 14 , "BinaryOwned" , v) ,
141
+
142
+ // both variants same number
143
+ AnyValue :: Binary ( v) => serializer. serialize_newtype_variant ( name, 15 , "BinaryOwned" , v) ,
140
144
AnyValue :: BinaryOwned ( v) => {
141
- serializer. serialize_newtype_variant ( name, 14 , "BinaryOwned" , v)
145
+ serializer. serialize_newtype_variant ( name, 15 , "BinaryOwned" , v)
146
+ } ,
147
+
148
+ #[ cfg( feature = "dtype-date" ) ]
149
+ AnyValue :: Date ( v) => serializer. serialize_newtype_variant ( name, 16 , "Date" , v) ,
150
+ // both variants same number
151
+ #[ cfg( feature = "dtype-datetime" ) ]
152
+ AnyValue :: Datetime ( v, tu, tz) => serializer. serialize_newtype_variant (
153
+ name,
154
+ 17 ,
155
+ "DatetimeOwned" ,
156
+ & ( * v, * tu, tz. map ( |v| v. as_str ( ) ) ) ,
157
+ ) ,
158
+ #[ cfg( feature = "dtype-datetime" ) ]
159
+ AnyValue :: DatetimeOwned ( v, tu, tz) => serializer. serialize_newtype_variant (
160
+ name,
161
+ 17 ,
162
+ "DatetimeOwned" ,
163
+ & ( * v, * tu, tz. as_deref ( ) . map ( |v| v. as_str ( ) ) ) ,
164
+ ) ,
165
+ #[ cfg( feature = "dtype-duration" ) ]
166
+ AnyValue :: Duration ( v, tu) => {
167
+ serializer. serialize_newtype_variant ( name, 18 , "Duration" , & ( * v, * tu) )
168
+ } ,
169
+ #[ cfg( feature = "dtype-time" ) ]
170
+ AnyValue :: Time ( v) => serializer. serialize_newtype_variant ( name, 19 , "Time" , v) ,
171
+
172
+ // Not 100% sure how to deal with these.
173
+ #[ cfg( feature = "dtype-categorical" ) ]
174
+ AnyValue :: Categorical ( ..) | AnyValue :: CategoricalOwned ( ..) => Err (
175
+ serde:: ser:: Error :: custom ( "Cannot serialize categorical value." ) ,
176
+ ) ,
177
+ #[ cfg( feature = "dtype-categorical" ) ]
178
+ AnyValue :: Enum ( ..) | AnyValue :: EnumOwned ( ..) => {
179
+ Err ( serde:: ser:: Error :: custom ( "Cannot serialize enum value." ) )
180
+ } ,
181
+
182
+ #[ cfg( feature = "dtype-array" ) ]
183
+ AnyValue :: Array ( v, width) => {
184
+ serializer. serialize_newtype_variant ( name, 22 , "Array" , & ( v, * width) )
185
+ } ,
186
+ #[ cfg( feature = "object" ) ]
187
+ AnyValue :: Object ( _) | AnyValue :: ObjectOwned ( _) => {
188
+ Err ( serde:: ser:: Error :: custom ( "Cannot serialize object value." ) )
189
+ } ,
190
+ #[ cfg( feature = "dtype-struct" ) ]
191
+ AnyValue :: Struct ( _, _, _) | AnyValue :: StructOwned ( _) => {
192
+ Err ( serde:: ser:: Error :: custom ( "Cannot serialize struct value." ) )
193
+ } ,
194
+ #[ cfg( feature = "dtype-decimal" ) ]
195
+ AnyValue :: Decimal ( v, scale) => {
196
+ serializer. serialize_newtype_variant ( name, 25 , "Decimal" , & ( * v, * scale) )
142
197
} ,
143
- _ => Err ( serde:: ser:: Error :: custom (
144
- "Unknown data type. Cannot serialize" ,
145
- ) ) ,
146
198
}
147
199
}
148
200
}
@@ -153,8 +205,18 @@ impl<'a> Deserialize<'a> for AnyValue<'static> {
153
205
where
154
206
D : Deserializer < ' a > ,
155
207
{
156
- #[ repr( u8 ) ]
157
- enum AvField {
208
+ macro_rules! define_av_field {
209
+ ( $( $variant: ident, ) +) => {
210
+ #[ derive( Deserialize , Serialize ) ]
211
+ enum AvField {
212
+ $( $variant, ) +
213
+ }
214
+ const VARIANTS : & ' static [ & ' static str ] = & [
215
+ $( stringify!( $variant) , ) +
216
+ ] ;
217
+ } ;
218
+ }
219
+ define_av_field ! {
158
220
Null ,
159
221
Int8 ,
160
222
Int16 ,
@@ -171,109 +233,17 @@ impl<'a> Deserialize<'a> for AnyValue<'static> {
171
233
Bool ,
172
234
StringOwned ,
173
235
BinaryOwned ,
174
- }
175
- const VARIANTS : & [ & str ] = & [
176
- "Null" ,
177
- "UInt8" ,
178
- "UInt16" ,
179
- "UInt32" ,
180
- "UInt64" ,
181
- "Int8" ,
182
- "Int16" ,
183
- "Int32" ,
184
- "Int64" ,
185
- "Int128" ,
186
- "Float32" ,
187
- "Float64" ,
188
- "List" ,
189
- "Boolean" ,
190
- "StringOwned" ,
191
- "BinaryOwned" ,
192
- ] ;
193
- const LAST : u8 = unsafe { std:: mem:: transmute :: < _ , u8 > ( AvField :: BinaryOwned ) } ;
194
-
195
- struct FieldVisitor ;
196
-
197
- impl Visitor < ' _ > for FieldVisitor {
198
- type Value = AvField ;
199
-
200
- fn expecting ( & self , formatter : & mut Formatter ) -> std:: fmt:: Result {
201
- write ! ( formatter, "an integer between 0-{LAST}" )
202
- }
203
-
204
- fn visit_i64 < E > ( self , v : i64 ) -> std:: result:: Result < Self :: Value , E >
205
- where
206
- E : Error ,
207
- {
208
- let field: u8 = NumCast :: from ( v) . ok_or_else ( || {
209
- serde:: de:: Error :: invalid_value (
210
- Unexpected :: Signed ( v) ,
211
- & "expected value that fits into u8" ,
212
- )
213
- } ) ?;
214
-
215
- // SAFETY:
216
- // we are repr: u8 and check last value that we are in bounds
217
- let field = unsafe {
218
- if field <= LAST {
219
- std:: mem:: transmute :: < u8 , AvField > ( field)
220
- } else {
221
- return Err ( serde:: de:: Error :: invalid_value (
222
- Unexpected :: Signed ( v) ,
223
- & "expected value that fits into AnyValue's number of fields" ,
224
- ) ) ;
225
- }
226
- } ;
227
- Ok ( field)
228
- }
229
-
230
- fn visit_str < E > ( self , v : & str ) -> std:: result:: Result < Self :: Value , E >
231
- where
232
- E : Error ,
233
- {
234
- self . visit_bytes ( v. as_bytes ( ) )
235
- }
236
-
237
- fn visit_bytes < E > ( self , v : & [ u8 ] ) -> std:: result:: Result < Self :: Value , E >
238
- where
239
- E : Error ,
240
- {
241
- let field = match v {
242
- b"Null" => AvField :: Null ,
243
- b"Int8" => AvField :: Int8 ,
244
- b"Int16" => AvField :: Int16 ,
245
- b"Int32" => AvField :: Int32 ,
246
- b"Int64" => AvField :: Int64 ,
247
- b"Int128" => AvField :: Int128 ,
248
- b"UInt8" => AvField :: UInt8 ,
249
- b"UInt16" => AvField :: UInt16 ,
250
- b"UInt32" => AvField :: UInt32 ,
251
- b"UInt64" => AvField :: UInt64 ,
252
- b"Float32" => AvField :: Float32 ,
253
- b"Float64" => AvField :: Float64 ,
254
- b"List" => AvField :: List ,
255
- b"Bool" => AvField :: Bool ,
256
- b"StringOwned" | b"String" => AvField :: StringOwned ,
257
- b"BinaryOwned" | b"Binary" => AvField :: BinaryOwned ,
258
- _ => {
259
- return Err ( serde:: de:: Error :: unknown_variant (
260
- & String :: from_utf8_lossy ( v) ,
261
- VARIANTS ,
262
- ) ) ;
263
- } ,
264
- } ;
265
- Ok ( field)
266
- }
267
- }
268
-
269
- impl < ' a > Deserialize < ' a > for AvField {
270
- fn deserialize < D > ( deserializer : D ) -> std:: result:: Result < Self , D :: Error >
271
- where
272
- D : Deserializer < ' a > ,
273
- {
274
- deserializer. deserialize_identifier ( FieldVisitor )
275
- }
276
- }
236
+ Date ,
237
+ DatetimeOwned ,
238
+ Duration ,
239
+ Time ,
240
+ CategoricalOwned ,
241
+ EnumOwned ,
242
+ Array ,
243
+ Object ,
244
+ Struct ,
245
+ Decimal ,
246
+ } ;
277
247
278
248
struct OuterVisitor ;
279
249
@@ -350,6 +320,44 @@ impl<'a> Deserialize<'a> for AnyValue<'static> {
350
320
let value = variant. newtype_variant ( ) ?;
351
321
AnyValue :: BinaryOwned ( value)
352
322
} ,
323
+ ( AvField :: Date , variant) => feature_gated ! ( "dtype-date" , {
324
+ let value = variant. newtype_variant( ) ?;
325
+ AnyValue :: Date ( value)
326
+ } ) ,
327
+ ( AvField :: DatetimeOwned , variant) => feature_gated ! ( "dtype-datetime" , {
328
+ let ( value, time_unit, time_zone) = variant. newtype_variant( ) ?;
329
+ AnyValue :: DatetimeOwned ( value, time_unit, time_zone)
330
+ } ) ,
331
+ ( AvField :: Duration , variant) => feature_gated ! ( "dtype-duration" , {
332
+ let ( value, time_unit) = variant. newtype_variant( ) ?;
333
+ AnyValue :: Duration ( value, time_unit)
334
+ } ) ,
335
+ ( AvField :: Time , variant) => feature_gated ! ( "dtype-time" , {
336
+ let value = variant. newtype_variant( ) ?;
337
+ AnyValue :: Time ( value)
338
+ } ) ,
339
+ ( AvField :: CategoricalOwned , _) => feature_gated ! ( "dtype-categorical" , {
340
+ return Err ( serde:: de:: Error :: custom(
341
+ "unable to deserialize categorical" ,
342
+ ) ) ;
343
+ } ) ,
344
+ ( AvField :: EnumOwned , _) => feature_gated ! ( "dtype-categorical" , {
345
+ return Err ( serde:: de:: Error :: custom( "unable to deserialize enum" ) ) ;
346
+ } ) ,
347
+ ( AvField :: Array , variant) => feature_gated ! ( "dtype-array" , {
348
+ let ( s, width) = variant. newtype_variant( ) ?;
349
+ AnyValue :: Array ( s, width)
350
+ } ) ,
351
+ ( AvField :: Object , _) => feature_gated ! ( "object" , {
352
+ return Err ( serde:: de:: Error :: custom( "unable to deserialize object" ) ) ;
353
+ } ) ,
354
+ ( AvField :: Struct , _) => feature_gated ! ( "dtype-struct" , {
355
+ return Err ( serde:: de:: Error :: custom( "unable to deserialize struct" ) ) ;
356
+ } ) ,
357
+ ( AvField :: Decimal , variant) => feature_gated ! ( "dtype-decimal" , {
358
+ let ( v, scale) = variant. newtype_variant( ) ?;
359
+ AnyValue :: Decimal ( v, scale)
360
+ } ) ,
353
361
} ;
354
362
Ok ( out)
355
363
}
0 commit comments