in avro/src/ser_schema.rs [324:385]
fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>
where
T: ?Sized + ser::Serialize,
{
if self.item_count >= self.record_schema.fields.len() {
return Err(Error::FieldName(String::from(key)));
}
let next_field = &self.record_schema.fields[self.item_count];
let next_field_matches = match &next_field.aliases {
Some(aliases) => {
key == next_field.name.as_str() || aliases.iter().any(|a| key == a.as_str())
}
None => key == next_field.name.as_str(),
};
if next_field_matches {
self.serialize_next_field(&value).map_err(|e| {
Error::SerializeRecordFieldWithSchema {
field_name: key,
record_schema: Schema::Record(self.record_schema.clone()),
error: Box::new(e),
}
})?;
Ok(())
} else {
if self.item_count < self.record_schema.fields.len() {
for i in self.item_count..self.record_schema.fields.len() {
let field = &self.record_schema.fields[i];
let field_matches = match &field.aliases {
Some(aliases) => {
key == field.name.as_str() || aliases.iter().any(|a| key == a.as_str())
}
None => key == field.name.as_str(),
};
if field_matches {
let mut buffer: Vec<u8> = Vec::with_capacity(RECORD_FIELD_INIT_BUFFER_SIZE);
let mut value_ser = SchemaAwareWriteSerializer::new(
&mut buffer,
&field.schema,
self.ser.names,
self.ser.enclosing_namespace.clone(),
);
value.serialize(&mut value_ser).map_err(|e| {
Error::SerializeRecordFieldWithSchema {
field_name: key,
record_schema: Schema::Record(self.record_schema.clone()),
error: Box::new(e),
}
})?;
self.buffered_fields[i] = Some(buffer);
return Ok(());
}
}
}
Err(Error::FieldName(String::from(key)))
}
}