@@ -26,7 +26,7 @@ use crate::{
2626} ;
2727use bigdecimal:: BigDecimal ;
2828use serde:: ser;
29- use std:: { borrow:: Cow , collections:: HashMap , io:: Write , str:: FromStr } ;
29+ use std:: { borrow:: Cow , cmp :: Ordering , collections:: HashMap , io:: Write , str:: FromStr } ;
3030
3131const COLLECTION_SERIALIZER_ITEM_LIMIT : usize = 1024 ;
3232const COLLECTION_SERIALIZER_DEFAULT_INIT_ITEM_CAPACITY : usize = 32 ;
@@ -273,40 +273,51 @@ impl<'a, 's, W: Write> SchemaAwareWriteSerializeStruct<'a, 's, W> {
273273 where
274274 T : ?Sized + ser:: Serialize ,
275275 {
276- if field. position == self . field_position {
277- // If we receive fields in order, write them directly to the main writer
278- let mut value_ser = SchemaAwareWriteSerializer :: new (
279- & mut * self . ser . writer ,
280- & field. schema ,
281- self . ser . names ,
282- self . ser . enclosing_namespace . clone ( ) ,
283- ) ;
284- self . bytes_written += value. serialize ( & mut value_ser) ?;
276+ match self . field_position . cmp ( & field. position ) {
277+ Ordering :: Equal => {
278+ // If we receive fields in order, write them directly to the main writer
279+ let mut value_ser = SchemaAwareWriteSerializer :: new (
280+ & mut * self . ser . writer ,
281+ & field. schema ,
282+ self . ser . names ,
283+ self . ser . enclosing_namespace . clone ( ) ,
284+ ) ;
285+ self . bytes_written += value. serialize ( & mut value_ser) ?;
285286
286- self . field_position += 1 ;
287- while let Some ( bytes) = self . field_cache . remove ( & self . field_position ) {
288- self . ser
289- . writer
290- . write_all ( & bytes)
291- . map_err ( Details :: WriteBytes ) ?;
292- self . bytes_written += bytes. len ( ) ;
293287 self . field_position += 1 ;
288+ while let Some ( bytes) = self . field_cache . remove ( & self . field_position ) {
289+ self . ser
290+ . writer
291+ . write_all ( & bytes)
292+ . map_err ( Details :: WriteBytes ) ?;
293+ self . bytes_written += bytes. len ( ) ;
294+ self . field_position += 1 ;
295+ }
296+ Ok ( ( ) )
297+ }
298+ Ordering :: Less => {
299+ // Current field position is smaller than this field position,
300+ // so we're still missing at least one field, save this field temporarily
301+ let mut bytes = Vec :: new ( ) ;
302+ let mut value_ser = SchemaAwareWriteSerializer :: new (
303+ & mut bytes,
304+ & field. schema ,
305+ self . ser . names ,
306+ self . ser . enclosing_namespace . clone ( ) ,
307+ ) ;
308+ value. serialize ( & mut value_ser) ?;
309+ if self . field_cache . insert ( field. position , bytes) . is_some ( ) {
310+ Err ( Details :: FieldNameDuplicate ( field. name . clone ( ) ) . into ( ) )
311+ } else {
312+ Ok ( ( ) )
313+ }
294314 }
295- } else {
296- // This field is in the wrong order, write it to a temporary buffer so we can add it at the right time
297- let mut bytes = Vec :: new ( ) ;
298- let mut value_ser = SchemaAwareWriteSerializer :: new (
299- & mut bytes,
300- & field. schema ,
301- self . ser . names ,
302- self . ser . enclosing_namespace . clone ( ) ,
303- ) ;
304- value. serialize ( & mut value_ser) ?;
305- if self . field_cache . insert ( field. position , bytes) . is_some ( ) {
306- return Err ( Details :: FieldNameDuplicate ( field. name . clone ( ) ) . into ( ) ) ;
315+ Ordering :: Greater => {
316+ // Current field position is greater than this field position,
317+ // so we've already had this field
318+ Err ( Details :: FieldNameDuplicate ( field. name . clone ( ) ) . into ( ) )
307319 }
308320 }
309- Ok ( ( ) )
310321 }
311322
312323 fn end ( mut self ) -> Result < usize , Error > {
@@ -336,12 +347,7 @@ impl<'a, 's, W: Write> SchemaAwareWriteSerializeStruct<'a, 's, W> {
336347 }
337348 }
338349
339- // Check if all fields were written
340- if self . field_position != self . record_schema . fields . len ( ) {
341- let name = self . record_schema . fields [ self . field_position ] . name . clone ( ) ;
342- return Err ( Details :: GetField ( name) . into ( ) ) ;
343- }
344- assert ! (
350+ debug_assert ! (
345351 self . field_cache. is_empty( ) ,
346352 "There should be no more unwritten fields at this point: {:?}" ,
347353 self . field_cache
0 commit comments