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

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


The following commit(s) were added to refs/heads/branch-1.11 by this push:
     new 67f6a4cdf AVRO-3492: Add logic to derive the aliases for Schema::Enum 
(#1649)
67f6a4cdf is described below

commit 67f6a4cdf19579dcf3e87de89e5164efdff4343b
Author: Martin Grigorov <[email protected]>
AuthorDate: Tue Apr 19 00:06:13 2022 +0300

    AVRO-3492: Add logic to derive the aliases for Schema::Enum (#1649)
    
    Signed-off-by: Martin Tzvetanov Grigorov <[email protected]>
    (cherry picked from commit e4521514c76a3b501612f376c9e6db356e28836d)
---
 lang/rust/avro_derive/src/lib.rs      |   5 +-
 lang/rust/avro_derive/tests/derive.rs | 104 ++++++++++++++++++++++++++++------
 2 files changed, 92 insertions(+), 17 deletions(-)

diff --git a/lang/rust/avro_derive/src/lib.rs b/lang/rust/avro_derive/src/lib.rs
index 11ab7a616..0055249cb 100644
--- a/lang/rust/avro_derive/src/lib.rs
+++ b/lang/rust/avro_derive/src/lib.rs
@@ -75,6 +75,7 @@ fn derive_avro_schema(input: &mut DeriveInput) -> 
Result<TokenStream, Vec<syn::E
             named_type_options
                 .doc
                 .or_else(|| extract_outer_doc(&input.attrs)),
+            named_type_options.alias,
             e,
             input.ident.span(),
         )?,
@@ -168,10 +169,12 @@ fn get_data_struct_schema_def(
 fn get_data_enum_schema_def(
     full_schema_name: &str,
     doc: Option<String>,
+    aliases: Vec<String>,
     e: &syn::DataEnum,
     error_span: Span,
 ) -> Result<TokenStream, Vec<syn::Error>> {
     let doc = preserve_optional(doc);
+    let enum_aliases = preserve_vec(aliases);
     if e.variants.iter().all(|v| syn::Fields::Unit == v.fields) {
         let symbols: Vec<String> = e
             .variants
@@ -181,7 +184,7 @@ fn get_data_enum_schema_def(
         Ok(quote! {
             apache_avro::schema::Schema::Enum {
                 name: 
apache_avro::schema::Name::new(#full_schema_name).expect(&format!("Unable to 
parse enum name for schema {}", #full_schema_name)[..]),
-                aliases: None,
+                aliases: #enum_aliases,
                 doc: #doc,
                 symbols: vec![#(#symbols.to_owned()),*]
             }
diff --git a/lang/rust/avro_derive/tests/derive.rs 
b/lang/rust/avro_derive/tests/derive.rs
index c058c44c1..284323a2a 100644
--- a/lang/rust/avro_derive/tests/derive.rs
+++ b/lang/rust/avro_derive/tests/derive.rs
@@ -1066,16 +1066,16 @@ mod test_derive {
 
     #[derive(Debug, Serialize, Deserialize, AvroSchema, Clone, PartialEq)]
     #[avro(alias = "a", alias = "b", alias = "c")]
-    struct TestBasicWithAliases {
+    struct TestBasicStructWithAliases {
         a: i32,
     }
 
     #[test]
-    fn test_basic_with_aliases() {
+    fn test_basic_struct_with_aliases() {
         let schema = r#"
         {
             "type":"record",
-            "name":"TestBasicWithAliases",
+            "name":"TestBasicStructWithAliases",
             "aliases":["a", "b", "c"],
             "fields":[
                 {
@@ -1086,34 +1086,34 @@ mod test_derive {
         }
         "#;
         let schema = Schema::parse_str(schema).unwrap();
-        if let Schema::Record { name, aliases, .. } = 
TestBasicWithAliases::get_schema() {
-            assert_eq!("TestBasicWithAliases", name.fullname(None));
+        if let Schema::Record { name, aliases, .. } = 
TestBasicStructWithAliases::get_schema() {
+            assert_eq!("TestBasicStructWithAliases", name.fullname(None));
             assert_eq!(
                 Some(vec!["a".to_owned(), "b".to_owned(), "c".to_owned()]),
                 aliases
             );
         } else {
-            panic!("TestBasicWithAliases schema must be a record schema")
+            panic!("TestBasicStructWithAliases schema must be a record schema")
         }
-        assert_eq!(schema, TestBasicWithAliases::get_schema());
+        assert_eq!(schema, TestBasicStructWithAliases::get_schema());
 
-        serde_assert(TestBasicWithAliases { a: i32::MAX });
+        serde_assert(TestBasicStructWithAliases { a: i32::MAX });
     }
 
     #[derive(Debug, Serialize, Deserialize, AvroSchema, Clone, PartialEq)]
     #[avro(alias = "d")]
     #[avro(alias = "e")]
     #[avro(alias = "f")]
-    struct TestBasicWithAliases2 {
+    struct TestBasicStructWithAliases2 {
         a: i32,
     }
 
     #[test]
-    fn test_basic_with_aliases2() {
+    fn test_basic_struct_with_aliases2() {
         let schema = r#"
         {
             "type":"record",
-            "name":"TestBasicWithAliases2",
+            "name":"TestBasicStructWithAliases2",
             "aliases":["d", "e", "f"],
             "fields":[
                 {
@@ -1124,17 +1124,89 @@ mod test_derive {
         }
         "#;
         let schema = Schema::parse_str(schema).unwrap();
-        if let Schema::Record { name, aliases, .. } = 
TestBasicWithAliases2::get_schema() {
-            assert_eq!("TestBasicWithAliases2", name.fullname(None));
+        if let Schema::Record { name, aliases, .. } = 
TestBasicStructWithAliases2::get_schema() {
+            assert_eq!("TestBasicStructWithAliases2", name.fullname(None));
             assert_eq!(
                 Some(vec!["d".to_owned(), "e".to_owned(), "f".to_owned()]),
                 aliases
             );
         } else {
-            panic!("TestBasicWithAliases2 schema must be a record schema")
+            panic!("TestBasicStructWithAliases2 schema must be a record 
schema")
         }
-        assert_eq!(schema, TestBasicWithAliases2::get_schema());
+        assert_eq!(schema, TestBasicStructWithAliases2::get_schema());
 
-        serde_assert(TestBasicWithAliases2 { a: i32::MAX });
+        serde_assert(TestBasicStructWithAliases2 { a: i32::MAX });
+    }
+
+    #[derive(Debug, Serialize, Deserialize, AvroSchema, Clone, PartialEq)]
+    #[avro(alias = "a", alias = "b", alias = "c")]
+    enum TestBasicEnumWithAliases {
+        A,
+        B,
+    }
+
+    #[test]
+    fn test_basic_enum_with_aliases() {
+        let schema = r#"
+        {
+            "type":"enum",
+            "name":"TestBasicEnumWithAliases",
+            "aliases":["a", "b", "c"],
+            "symbols":[
+                "A",
+                "B"
+            ]
+        }
+        "#;
+        let schema = Schema::parse_str(schema).unwrap();
+        if let Schema::Enum { name, aliases, .. } = 
TestBasicEnumWithAliases::get_schema() {
+            assert_eq!("TestBasicEnumWithAliases", name.fullname(None));
+            assert_eq!(
+                Some(vec!["a".to_owned(), "b".to_owned(), "c".to_owned()]),
+                aliases
+            );
+        } else {
+            panic!("TestBasicEnumWithAliases schema must be an enum schema")
+        }
+        assert_eq!(schema, TestBasicEnumWithAliases::get_schema());
+
+        serde_assert(TestBasicEnumWithAliases::A);
+    }
+
+    #[derive(Debug, Serialize, Deserialize, AvroSchema, Clone, PartialEq)]
+    #[avro(alias = "d")]
+    #[avro(alias = "e")]
+    #[avro(alias = "f")]
+    enum TestBasicEnumWithAliases2 {
+        A,
+        B,
+    }
+
+    #[test]
+    fn test_basic_enum_with_aliases2() {
+        let schema = r#"
+        {
+            "type":"enum",
+            "name":"TestBasicEnumWithAliases2",
+            "aliases":["d", "e", "f"],
+            "symbols":[
+                "A",
+                "B"
+            ]
+        }
+        "#;
+        let schema = Schema::parse_str(schema).unwrap();
+        if let Schema::Enum { name, aliases, .. } = 
TestBasicEnumWithAliases2::get_schema() {
+            assert_eq!("TestBasicEnumWithAliases2", name.fullname(None));
+            assert_eq!(
+                Some(vec!["d".to_owned(), "e".to_owned(), "f".to_owned()]),
+                aliases
+            );
+        } else {
+            panic!("TestBasicEnumWithAliases2 schema must be an enum schema")
+        }
+        assert_eq!(schema, TestBasicEnumWithAliases2::get_schema());
+
+        serde_assert(TestBasicEnumWithAliases2::B);
     }
 }

Reply via email to