in avro/src/schema.rs [719:766]
fn resolve_default_value(
field_schema: &Schema,
field_name: &str,
record_name: &str,
names: &Names,
default: &Option<Value>,
) -> AvroResult<()> {
if let Some(value) = default {
let avro_value = types::Value::from(value.clone());
match field_schema {
Schema::Union(union_schema) => {
let schemas = &union_schema.schemas;
let resolved = schemas.iter().any(|schema| {
avro_value
.to_owned()
.resolve_internal(schema, names, &schema.namespace(), &None)
.is_ok()
});
if !resolved {
let schema: Option<&Schema> = schemas.first();
return match schema {
Some(first_schema) => Err(Error::GetDefaultUnion(
SchemaKind::from(first_schema),
types::ValueKind::from(avro_value),
)),
None => Err(Error::EmptyUnion),
};
}
}
_ => {
let resolved = avro_value
.resolve_internal(field_schema, names, &field_schema.namespace(), &None)
.is_ok();
if !resolved {
return Err(Error::GetDefaultRecordField(
field_name.to_string(),
record_name.to_string(),
field_schema.canonical_form(),
));
}
}
};
}
Ok(())
}