Skip to content

Commit 0a5f251

Browse files
author
default
committed
fix: Downgrade assert to debug_assert
I've also added a check that should prevent the debug_assert from ever happening.
1 parent 02ff0c9 commit 0a5f251

File tree

1 file changed

+42
-36
lines changed

1 file changed

+42
-36
lines changed

avro/src/ser_schema.rs

Lines changed: 42 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ use crate::{
2626
};
2727
use bigdecimal::BigDecimal;
2828
use 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

3131
const COLLECTION_SERIALIZER_ITEM_LIMIT: usize = 1024;
3232
const 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

Comments
 (0)