You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@avro.apache.org by mg...@apache.org on 2022/12/14 23:28:26 UTC

[avro] 01/02: AVRO-3683: WIP compiles

This is an automated email from the ASF dual-hosted git repository.

mgrigorov pushed a commit to branch avro-3683-multiple-schemas
in repository https://gitbox.apache.org/repos/asf/avro.git

commit 2aebeab25ec9028a7c9d257debaa620b868b7942
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
AuthorDate: Thu Dec 15 01:00:31 2022 +0200

    AVRO-3683: WIP compiles
    
    Signed-off-by: Martin Tzvetanov Grigorov <mg...@apache.org>
---
 lang/rust/avro/src/schema.rs | 32 ++++++++++++++++----------------
 lang/rust/avro/src/writer.rs |  5 +++--
 2 files changed, 19 insertions(+), 18 deletions(-)

diff --git a/lang/rust/avro/src/schema.rs b/lang/rust/avro/src/schema.rs
index 5784f1901..1ffb9e6ea 100644
--- a/lang/rust/avro/src/schema.rs
+++ b/lang/rust/avro/src/schema.rs
@@ -401,7 +401,7 @@ impl Serialize for Alias {
 
 pub(crate) struct ResolvedSchema<'s> {
     names_ref: NamesRef<'s>,
-    schemata: &'s [&'s Schema],
+    schemata: Vec<&'s Schema>,
 }
 
 impl<'s> TryFrom<&'s Schema> for ResolvedSchema<'s> {
@@ -411,9 +411,9 @@ impl<'s> TryFrom<&'s Schema> for ResolvedSchema<'s> {
         let names = HashMap::new();
         let mut rs = ResolvedSchema {
             names_ref: names,
-            schemata: &[schema],
+            schemata: vec![schema],
         };
-        Self::from_internal(rs.schemata, &mut rs.names_ref, &None)?;
+        Self::from_internal(rs.get_schemata(), &mut rs.names_ref, &None)?;
         Ok(rs)
     }
 }
@@ -425,34 +425,35 @@ impl<'s> TryFrom<&'s [&'s Schema]> for ResolvedSchema<'s> {
         let names = HashMap::new();
         let mut rs = ResolvedSchema {
             names_ref: names,
-            schemata,
+            schemata: schemata.to_vec(),
         };
-        Self::from_internal(rs.schemata, &mut rs.names_ref, &None)?;
+        Self::from_internal(rs.get_schemata(), &mut rs.names_ref, &None)?;
         Ok(rs)
     }
 }
 
 impl<'s> ResolvedSchema<'s> {
-    pub(crate) fn get_schemata(&self) -> &'s [&'s Schema] {
-        self.schemata
+    pub(crate) fn get_schemata(&self) -> Vec<&'s Schema> {
+        self.schemata.clone()
     }
+
     pub(crate) fn get_names(&self) -> &NamesRef<'s> {
         &self.names_ref
     }
 
     fn from_internal(
-        schemata: &'s [&'s Schema],
+        schemata: Vec<&'s Schema>,
         names_ref: &mut NamesRef<'s>,
         enclosing_namespace: &Namespace,
     ) -> AvroResult<()> {
         for schema in schemata {
             match schema {
                 Schema::Array(schema) | Schema::Map(schema) => {
-                    Self::from_internal(&[schema], names_ref, enclosing_namespace)?
+                    Self::from_internal(vec![schema], names_ref, enclosing_namespace)?
                 }
                 Schema::Union(UnionSchema { schemas, .. }) => {
                     for schema in schemas {
-                        Self::from_internal(&[schema], names_ref, enclosing_namespace)?
+                        Self::from_internal(vec![schema], names_ref, enclosing_namespace)?
                     }
                 }
                 Schema::Enum { name, .. } | Schema::Fixed { name, .. } => {
@@ -474,18 +475,17 @@ impl<'s> ResolvedSchema<'s> {
                     } else {
                         let record_namespace = fully_qualified_name.namespace;
                         for field in fields {
-                            Self::from_internal(&[&field.schema], names_ref, &record_namespace)?
+                            Self::from_internal(vec![&field.schema], names_ref, &record_namespace)?
                         }
                     }
                 }
                 Schema::Ref { name } => {
                     let fully_qualified_name = name.fully_qualified_name(enclosing_namespace);
-                    names_ref
-                        .get(&fully_qualified_name)
-                        .map(|_| ())
-                        .ok_or_else(|| return Error::SchemaResolutionError(fully_qualified_name))
+                    if let None = names_ref.get(&fully_qualified_name) {
+                        return Err(Error::SchemaResolutionError(fully_qualified_name));
+                    }
                 }
-                _ => Ok(()),
+                _ => (),
             }
         }
         Ok(())
diff --git a/lang/rust/avro/src/writer.rs b/lang/rust/avro/src/writer.rs
index c777e31cd..6264e07de 100644
--- a/lang/rust/avro/src/writer.rs
+++ b/lang/rust/avro/src/writer.rs
@@ -1285,7 +1285,8 @@ mod tests {
         ]
     }"#;
 
-        let schemata = Schema::parse_list(&[schema_a_str, schema_b_str]).unwrap();
+        let schemata: Vec<Schema> = Schema::parse_list(&[schema_a_str, schema_b_str]).unwrap();
+        let schemata: Vec<&Schema> = schemata.iter().collect();
         let record = Value::Record(vec![(
             "field_b".into(),
             Value::Record(vec![("field_a".into(), Value::Float(1.0))]),
@@ -1293,7 +1294,7 @@ mod tests {
 
         let expected: Vec<u8> = Vec::new();
         assert_eq!(
-            to_avro_datum_schemata(&schemata[..], record).unwrap(),
+            to_avro_datum_schemata(&schemata.as_slice(), record).unwrap(),
             expected
         );
     }