Parse a `serde_json::Value` representing an Avro record type into a `Schema`.
(
&mut self,
complex: &Map<String, Value>,
enclosing_namespace: NamespaceRef,
)
| 538 | enclosing_namespace: NamespaceRef, |
| 539 | ) -> AvroResult<Schema> { |
| 540 | let fields_opt = complex.remove("fields"); |
| 541 | |
| 542 | if fields_opt.is_none() |
| 543 | && let Some(seen) = self.get_already_seen_schema(&complex, enclosing_namespace) |
| 544 | { |
| 545 | return Ok(seen.clone()); |
| 546 | } |
| 547 | |
| 548 | let fully_qualified_name = Name::parse(&mut complex, enclosing_namespace)?; |
| 549 | let aliases = |
| 550 | self.fix_aliases_namespace(complex.aliases()?, fully_qualified_name.namespace())?; |
| 551 | |
| 552 | let mut lookup = BTreeMap::new(); |
| 553 | |
| 554 | self.register_resolving_schema(&fully_qualified_name, &aliases); |
| 555 | |
| 556 | debug!("Going to parse record schema: {fully_qualified_name:?}"); |
| 557 | |
| 558 | let fields = match fields_opt { |
| 559 | Some(Value::Array(array)) => array |
| 560 | .into_iter() |
| 561 | .map(|v| match v { |
| 562 | Value::Object(o) => RecordField::parse(o, self, &fully_qualified_name), |
| 563 | _ => Err(Details::GetRecordFieldsArrayInvalidType(v.description()).into()), |
| 564 | }) |
| 565 | .collect::<Result<Vec<_>, _>>()?, |
| 566 | Some(value) => { |
| 567 | return Err(Details::GetRecordFieldsInvalidType(value.description()).into()); |
| 568 | } |
| 569 | None => return Err(Details::GetRecordFieldsJson.into()), |
| 570 | }; |
| 571 | |
| 572 | for (position, field) in fields.iter().enumerate() { |
| 573 | if let Some(_old) = lookup.insert(field.name.clone(), position) { |
| 574 | return Err(Details::FieldNameDuplicate(field.name.clone()).into()); |
| 575 | } |
| 576 | |
| 577 | for alias in &field.aliases { |
| 578 | lookup.insert(alias.clone(), position); |
| 579 | } |
| 580 | } |
| 581 | |
| 582 | let schema = Schema::Record(RecordSchema { |
| 583 | name: fully_qualified_name.clone(), |
| 584 | aliases: aliases.clone(), |
| 585 | doc: complex.doc()?, |
| 586 | fields, |
| 587 | lookup, |
| 588 | attributes: self.get_custom_attributes(complex), |
| 589 | }); |
| 590 | |
| 591 | self.register_parsed_schema(&fully_qualified_name, &schema, &aliases); |
| 592 | Ok(schema) |
| 593 | } |
| 594 | |
| 595 | fn get_custom_attributes(&self, complex: Map<String, Value>) -> BTreeMap<String, Value> { |
| 596 | complex.into_iter().collect() |
| 597 | } |
no test coverage detected