in avro/src/ser_schema.rs [1106:1152]
fn serialize_unit_struct_with_schema(
&mut self,
name: &'static str,
schema: &Schema,
) -> Result<usize, Error> {
let create_error = |cause: String| Error::SerializeValueWithSchema {
value_type: "unit struct",
value: format!("{name}. Cause: {cause}"),
schema: schema.clone(),
};
match schema {
Schema::Record(sch) => match sch.fields.len() {
0 => Ok(0),
too_many => Err(create_error(format!(
"Too many fields: {}. Expected: 0",
too_many
))),
},
Schema::Null => Ok(0),
Schema::Ref { name: ref_name } => {
let ref_schema = self.get_ref_schema(ref_name)?;
self.serialize_unit_struct_with_schema(name, ref_schema)
}
Schema::Union(union_schema) => {
for (i, variant_schema) in union_schema.schemas.iter().enumerate() {
match variant_schema {
Schema::Record(record_schema) if record_schema.fields.is_empty() => {
encode_int(i as i32, &mut *self.writer)?;
return self.serialize_unit_struct_with_schema(name, variant_schema);
}
Schema::Null | Schema::Ref { name: _ } => {
encode_int(i as i32, &mut *self.writer)?;
return self.serialize_unit_struct_with_schema(name, variant_schema);
}
_ => { /* skip */ }
}
}
Err(create_error(format!(
"Cannot find a matching Null schema in {union_schema:?}"
)))
}
unsupported => Err(create_error(format!(
"Expected Null or Union schema. Got: {unsupported}"
))),
}
}