Parse a `serde_json::Value` representing a Avro fixed type into a `Schema`.
(
&mut self,
complex: &Map<String, Value>,
enclosing_namespace: NamespaceRef,
)
| 750 | }?; |
| 751 | let size = usize::try_from(size).map_err(|e| Details::ConvertU64ToUsize(e, size))?; |
| 752 | let fully_qualified_name = Name::parse(&mut complex, enclosing_namespace)?; |
| 753 | let aliases = |
| 754 | self.fix_aliases_namespace(complex.aliases()?, fully_qualified_name.namespace())?; |
| 755 | |
| 756 | let schema = Schema::Fixed(FixedSchema { |
| 757 | name: fully_qualified_name.clone(), |
| 758 | aliases: aliases.clone(), |
| 759 | doc, |
| 760 | size, |
| 761 | attributes: self.get_custom_attributes(complex), |
| 762 | }); |
| 763 | |
| 764 | self.register_parsed_schema(&fully_qualified_name, &schema, &aliases); |
| 765 | |
| 766 | Ok(schema) |
| 767 | } |
| 768 | |
| 769 | // A type alias may be specified either as a fully namespace-qualified, or relative |
| 770 | // to the namespace of the name it is an alias for. For example, if a type named "a.b" |
| 771 | // has aliases of "c" and "x.y", then the fully qualified names of its aliases are "a.c" |
| 772 | // and "x.y". |
| 773 | // https://avro.apache.org/docs/++version++/specification/#aliases |
| 774 | fn fix_aliases_namespace( |
| 775 | &self, |
| 776 | aliases: Option<Vec<String>>, |
| 777 | namespace: NamespaceRef, |
| 778 | ) -> AvroResult<Aliases> { |
| 779 | aliases |
| 780 | .map(|aliases| { |
| 781 | aliases |
| 782 | .into_iter() |
| 783 | .map(|alias| { |
| 784 | // An alias that is not a valid Avro name is a schema |
| 785 | // error — propagate it instead of unwrapping (which |
| 786 | // would panic on attacker-controlled schema JSON). |
| 787 | Alias::new_with_enclosing_namespace(alias, namespace) |
| 788 | }) |
| 789 | .collect::<AvroResult<Vec<_>>>() |
| 790 | }) |
| 791 | .transpose() |
| 792 | } |
| 793 | |
| 794 | fn get_schema_type_name(&self, name: Name, value: &Value) -> AvroResult<Name> { |
no test coverage detected