in avro/src/schema.rs [1763:1822]
fn parse_record(
&mut self,
complex: &Map<String, Value>,
enclosing_namespace: &Namespace,
) -> AvroResult<Schema> {
let fields_opt = complex.get("fields");
if fields_opt.is_none() {
if let Some(seen) = self.get_already_seen_schema(complex, enclosing_namespace) {
return Ok(seen.clone());
}
}
let fully_qualified_name = Name::parse(complex, enclosing_namespace)?;
let aliases = fix_aliases_namespace(complex.aliases(), &fully_qualified_name.namespace);
let mut lookup = BTreeMap::new();
self.register_resolving_schema(&fully_qualified_name, &aliases);
debug!("Going to parse record schema: {:?}", &fully_qualified_name);
let fields: Vec<RecordField> = fields_opt
.and_then(|fields| fields.as_array())
.ok_or(Error::GetRecordFieldsJson)
.and_then(|fields| {
fields
.iter()
.filter_map(|field| field.as_object())
.enumerate()
.map(|(position, field)| {
RecordField::parse(field, position, self, &fully_qualified_name)
})
.collect::<Result<_, _>>()
})?;
for field in &fields {
if let Some(_old) = lookup.insert(field.name.clone(), field.position) {
return Err(Error::FieldNameDuplicate(field.name.clone()));
}
if let Some(ref field_aliases) = field.aliases {
for alias in field_aliases {
lookup.insert(alias.clone(), field.position);
}
}
}
let schema = Schema::Record(RecordSchema {
name: fully_qualified_name.clone(),
aliases: aliases.clone(),
doc: complex.doc(),
fields,
lookup,
attributes: self.get_custom_attributes(complex, vec!["fields"]),
});
self.register_parsed_schema(&fully_qualified_name, &schema, &aliases);
Ok(schema)
}