MCPcopy Create free account
hub / github.com/apache/avro-rs / parse_record

Method parse_record

avro/src/schema/parser.rs:540–595  ·  view source on GitHub ↗

Parse a `serde_json::Value` representing an Avro record type into a `Schema`.

(
        &mut self,
        complex: &Map<String, Value>,
        enclosing_namespace: NamespaceRef,
    )

Source from the content-addressed store, hash-verified

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 }

Callers 1

parse_complexMethod · 0.80

Calls 12

RecordClass · 0.85
getMethod · 0.80
fix_aliases_namespaceMethod · 0.80
get_custom_attributesMethod · 0.80
cloneMethod · 0.45
aliasesMethod · 0.45
namespaceMethod · 0.45
mapMethod · 0.45
docMethod · 0.45

Tested by

no test coverage detected