in avro/src/schema.rs [1985:2036]
fn parse_fixed(
&mut self,
complex: &Map<String, Value>,
enclosing_namespace: &Namespace,
) -> AvroResult<Schema> {
let size_opt = complex.get("size");
if size_opt.is_none() {
if let Some(seen) = self.get_already_seen_schema(complex, enclosing_namespace) {
return Ok(seen.clone());
}
}
let doc = complex.get("doc").and_then(|v| match &v {
Value::String(ref docstr) => Some(docstr.clone()),
_ => None,
});
let size = match size_opt {
Some(size) => size
.as_u64()
.ok_or_else(|| Error::GetFixedSizeFieldPositive(size.clone())),
None => Err(Error::GetFixedSizeField),
}?;
let default = complex.get("default").and_then(|v| match &v {
Value::String(ref default) => Some(default.clone()),
_ => None,
});
if default.is_some() {
let len = default.clone().unwrap().len();
if len != size as usize {
return Err(Error::FixedDefaultLenSizeMismatch(len, size));
}
}
let fully_qualified_name = Name::parse(complex, enclosing_namespace)?;
let aliases = fix_aliases_namespace(complex.aliases(), &fully_qualified_name.namespace);
let schema = Schema::Fixed(FixedSchema {
name: fully_qualified_name.clone(),
aliases: aliases.clone(),
doc,
size: size as usize,
default,
attributes: self.get_custom_attributes(complex, vec!["size"]),
});
self.register_parsed_schema(&fully_qualified_name, &schema, &aliases);
Ok(schema)
}