@@ -2231,6 +2231,8 @@ mod timestamptz {
22312231}
22322232
22332233mod _serde {
2234+ use std:: collections:: HashMap ;
2235+
22342236 use serde:: de:: Visitor ;
22352237 use serde:: ser:: { SerializeMap , SerializeSeq , SerializeStruct } ;
22362238 use serde:: { Deserialize , Serialize } ;
@@ -2241,7 +2243,7 @@ mod _serde {
22412243 use crate :: spec:: { PrimitiveType , Type , MAP_KEY_FIELD_NAME , MAP_VALUE_FIELD_NAME } ;
22422244 use crate :: { Error , ErrorKind } ;
22432245
2244- #[ derive( SerializeDerive , DeserializeDerive , Debug ) ]
2246+ #[ derive( SerializeDerive , DeserializeDerive , Debug , Clone ) ]
22452247 #[ serde( transparent) ]
22462248 /// Raw literal representation used for serde. The serialize way is used for Avro serializer.
22472249 pub struct RawLiteral ( RawLiteralEnum ) ;
@@ -2826,22 +2828,24 @@ mod _serde {
28262828 optional : _,
28272829 } ) => match ty {
28282830 Type :: Struct ( struct_ty) => {
2829- let iters: Vec < Option < Literal > > = required
2830- . into_iter ( )
2831- . map ( |( field_name, value) | {
2832- let field = struct_ty
2833- . field_by_name ( field_name. as_str ( ) )
2834- . ok_or_else ( || {
2835- invalid_err_with_reason (
2836- "record" ,
2837- & format ! ( "field {} is not exist" , & field_name) ,
2838- )
2839- } ) ?;
2840- let value = value. try_into ( & field. field_type ) ?;
2841- Ok ( value)
2831+ let mut value_map: HashMap < String , RawLiteralEnum > =
2832+ required. into_iter ( ) . collect ( ) ;
2833+ let values = struct_ty
2834+ . fields ( )
2835+ . iter ( )
2836+ . map ( |f| {
2837+ if let Some ( raw_value) = value_map. remove ( & f. name ) {
2838+ let value = raw_value. try_into ( & f. field_type ) ?;
2839+ Ok ( value)
2840+ } else {
2841+ Err ( invalid_err_with_reason (
2842+ "record" ,
2843+ & format ! ( "field {} is not exist" , & f. name) ,
2844+ ) )
2845+ }
28422846 } )
2843- . collect :: < Result < _ , Error > > ( ) ?;
2844- Ok ( Some ( Literal :: Struct ( super :: Struct :: from_iter ( iters ) ) ) )
2847+ . collect :: < Result < Vec < _ > , Error > > ( ) ?;
2848+ Ok ( Some ( Literal :: Struct ( super :: Struct :: from_iter ( values ) ) ) )
28452849 }
28462850 Type :: Map ( map_ty) => {
28472851 if * map_ty. key_field . field_type != Type :: Primitive ( PrimitiveType :: String ) {
0 commit comments