@@ -2242,6 +2242,8 @@ mod timestamptz {
22422242}
22432243
22442244mod _serde {
2245+ use std:: collections:: HashMap ;
2246+
22452247 use serde:: de:: Visitor ;
22462248 use serde:: ser:: { SerializeMap , SerializeSeq , SerializeStruct } ;
22472249 use serde:: { Deserialize , Serialize } ;
@@ -2252,7 +2254,7 @@ mod _serde {
22522254 use crate :: spec:: { MAP_KEY_FIELD_NAME , MAP_VALUE_FIELD_NAME , PrimitiveType , Type } ;
22532255 use crate :: { Error , ErrorKind } ;
22542256
2255- #[ derive( SerializeDerive , DeserializeDerive , Debug ) ]
2257+ #[ derive( SerializeDerive , DeserializeDerive , Debug , Clone ) ]
22562258 #[ serde( transparent) ]
22572259 /// Raw literal representation used for serde. The serialize way is used for Avro serializer.
22582260 pub struct RawLiteral ( RawLiteralEnum ) ;
@@ -2840,22 +2842,24 @@ mod _serde {
28402842 optional : _,
28412843 } ) => match ty {
28422844 Type :: Struct ( struct_ty) => {
2843- let iters: Vec < Option < Literal > > = required
2844- . into_iter ( )
2845- . map ( |( field_name, value) | {
2846- let field = struct_ty
2847- . field_by_name ( field_name. as_str ( ) )
2848- . ok_or_else ( || {
2849- invalid_err_with_reason (
2850- "record" ,
2851- & format ! ( "field {} is not exist" , & field_name) ,
2852- )
2853- } ) ?;
2854- let value = value. try_into ( & field. field_type ) ?;
2855- Ok ( value)
2845+ let mut value_map: HashMap < String , RawLiteralEnum > =
2846+ required. into_iter ( ) . collect ( ) ;
2847+ let values = struct_ty
2848+ . fields ( )
2849+ . iter ( )
2850+ . map ( |f| {
2851+ if let Some ( raw_value) = value_map. remove ( & f. name ) {
2852+ let value = raw_value. try_into ( & f. field_type ) ?;
2853+ Ok ( value)
2854+ } else {
2855+ Err ( invalid_err_with_reason (
2856+ "record" ,
2857+ & format ! ( "field {} is not exist" , & f. name) ,
2858+ ) )
2859+ }
28562860 } )
2857- . collect :: < Result < _ , Error > > ( ) ?;
2858- Ok ( Some ( Literal :: Struct ( super :: Struct :: from_iter ( iters ) ) ) )
2861+ . collect :: < Result < Vec < _ > , Error > > ( ) ?;
2862+ Ok ( Some ( Literal :: Struct ( super :: Struct :: from_iter ( values ) ) ) )
28592863 }
28602864 Type :: Map ( map_ty) => {
28612865 if * map_ty. key_field . field_type != Type :: Primitive ( PrimitiveType :: String ) {
0 commit comments