@@ -4,7 +4,7 @@ use serde::de::value::{MapDeserializer, SeqDeserializer};
44use serde:: de:: {
55 DeserializeSeed , EnumAccess , Expected , IntoDeserializer , Unexpected , VariantAccess , Visitor ,
66} ;
7- use serde:: { Deserialize , Deserializer } ;
7+ use serde:: Deserializer ;
88
99use crate :: qdrant:: value:: Kind ;
1010use crate :: qdrant:: { Struct , Value } ;
@@ -353,10 +353,6 @@ impl<'de> Deserializer<'de> for Value {
353353 let _ = visitor;
354354 Err ( serde:: de:: Error :: custom ( "u128 is not supported" ) )
355355 }
356-
357- fn is_human_readable ( & self ) -> bool {
358- true
359- }
360356}
361357
362358struct EnumDeserializer {
@@ -372,80 +368,52 @@ impl<'de> EnumAccess<'de> for EnumDeserializer {
372368 V : DeserializeSeed < ' de > ,
373369 {
374370 let variant = self . variant . into_deserializer ( ) ;
375- let visitor = VariantDeserializer { value : None } ;
371+ let visitor = VariantDeserializer ;
376372 seed. deserialize ( variant) . map ( |v| ( v, visitor) )
377373 }
378374}
379375
380- struct VariantDeserializer {
381- value : Option < Value > ,
382- }
376+ struct VariantDeserializer ;
383377
384378impl < ' de > VariantAccess < ' de > for VariantDeserializer {
385379 type Error = DeserPayloadError ;
386380
387381 fn unit_variant ( self ) -> Result < ( ) , Self :: Error > {
388- match self . value {
389- Some ( value) => Deserialize :: deserialize ( value) ,
390- None => Ok ( ( ) ) ,
391- }
382+ Ok ( ( ) )
392383 }
393384
394- fn newtype_variant_seed < T > ( self , seed : T ) -> Result < T :: Value , Self :: Error >
385+ fn newtype_variant_seed < T > ( self , _seed : T ) -> Result < T :: Value , Self :: Error >
395386 where
396387 T : DeserializeSeed < ' de > ,
397388 {
398- match self . value {
399- Some ( value) => seed. deserialize ( value) ,
400- None => Err ( serde:: de:: Error :: invalid_type (
401- Unexpected :: UnitVariant ,
402- & "newtype variant" ,
403- ) ) ,
404- }
389+ Err ( serde:: de:: Error :: invalid_type (
390+ Unexpected :: UnitVariant ,
391+ & "newtype variant" ,
392+ ) )
405393 }
406394
407- fn tuple_variant < V > ( self , _len : usize , visitor : V ) -> Result < V :: Value , Self :: Error >
395+ fn tuple_variant < V > ( self , _len : usize , _visitor : V ) -> Result < V :: Value , Self :: Error >
408396 where
409397 V : Visitor < ' de > ,
410398 {
411- match self . value . and_then ( |i| i. kind ) {
412- Some ( Kind :: ListValue ( list) ) => {
413- if list. is_empty ( ) {
414- visitor. visit_unit ( )
415- } else {
416- visit_array ( list. values , visitor)
417- }
418- }
419- Some ( other) => Err ( serde:: de:: Error :: invalid_type (
420- Value :: unexpected_kind ( & other) ,
421- & "tuple variant" ,
422- ) ) ,
423- None => Err ( serde:: de:: Error :: invalid_type (
424- Unexpected :: UnitVariant ,
425- & "tuple variant" ,
426- ) ) ,
427- }
399+ Err ( serde:: de:: Error :: invalid_type (
400+ Unexpected :: UnitVariant ,
401+ & "tuple variant" ,
402+ ) )
428403 }
429404
430405 fn struct_variant < V > (
431406 self ,
432407 _fields : & ' static [ & ' static str ] ,
433- visitor : V ,
408+ _visitor : V ,
434409 ) -> Result < V :: Value , Self :: Error >
435410 where
436411 V : Visitor < ' de > ,
437412 {
438- match self . value . and_then ( |i| i. kind ) {
439- Some ( Kind :: StructValue ( v) ) => v. into_deserializer ( ) . deserialize_any ( visitor) ,
440- Some ( other) => Err ( serde:: de:: Error :: invalid_type (
441- Value :: unexpected_kind ( & other) ,
442- & "struct variant" ,
443- ) ) ,
444- None => Err ( serde:: de:: Error :: invalid_type (
445- Unexpected :: UnitVariant ,
446- & "struct variant" ,
447- ) ) ,
448- }
413+ Err ( serde:: de:: Error :: invalid_type (
414+ Unexpected :: UnitVariant ,
415+ & "struct variant" ,
416+ ) )
449417 }
450418}
451419
@@ -758,6 +726,40 @@ mod test {
758726 assert ! ( dst_err. is_err( ) )
759727 }
760728
729+ #[ test]
730+ fn test_enum_struct_tagged ( ) {
731+ let payload = make_payload (
732+ json ! ( { "items" : [ { "t" : "First" , "c" : { "key" : "Major" } } , { "t" : "Second" , "c" : { "other" : 32 } } , { "t" : "Bool" , "c" : true } ] } ) ,
733+ ) ;
734+
735+ #[ derive( Deserialize , Debug ) ]
736+ #[ allow( dead_code) ]
737+ struct Dst {
738+ items : Vec < DstEnum > ,
739+ }
740+
741+ #[ derive( Deserialize , PartialEq , Debug ) ]
742+ #[ allow( dead_code) ]
743+ #[ serde( tag = "t" , content = "c" ) ]
744+ enum DstEnum {
745+ First { key : String } ,
746+ Second { other : u32 } ,
747+ Bool ( bool ) ,
748+ }
749+
750+ let dst: Dst = payload. deserialize ( ) . unwrap ( ) ;
751+ assert_eq ! (
752+ dst. items,
753+ vec![
754+ DstEnum :: First {
755+ key: "Major" . to_string( )
756+ } ,
757+ DstEnum :: Second { other: 32 } ,
758+ DstEnum :: Bool ( true )
759+ ]
760+ ) ;
761+ }
762+
761763 #[ test]
762764 fn test_option ( ) {
763765 let payload = make_payload ( json ! ( {
0 commit comments