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

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


The following commit(s) were added to refs/heads/main by this push:
     new ede27ee  feat: Add support for rename of enum variants in AvroSchema 
macro (#205)
ede27ee is described below

commit ede27ee245292306d7b8af4c206a759d934507e8
Author: Vaalla <[email protected]>
AuthorDate: Fri Jun 6 15:02:13 2025 +0300

    feat: Add support for rename of enum variants in AvroSchema macro (#205)
    
    * feat: Add support for rename of enum variants in AvroSchema macro
    
    * Use `?` instead of `.unwrap()`
    
    * formatting
    
    ---------
    
    Co-authored-by: Razvan Rotari <[email protected]>
    Co-authored-by: Martin Grigorov <[email protected]>
---
 avro_derive/src/lib.rs | 42 +++++++++++++++++++++++++++++++++++++-----
 1 file changed, 37 insertions(+), 5 deletions(-)

diff --git a/avro_derive/src/lib.rs b/avro_derive/src/lib.rs
index eeeaa93..6b9914c 100644
--- a/avro_derive/src/lib.rs
+++ b/avro_derive/src/lib.rs
@@ -39,6 +39,13 @@ struct FieldOptions {
     skip: Option<bool>,
 }
 
+#[derive(darling::FromAttributes)]
+#[darling(attributes(avro))]
+struct VariantOptions {
+    #[darling(default)]
+    rename: Option<String>,
+}
+
 #[derive(darling::FromAttributes)]
 #[darling(attributes(avro))]
 struct NamedTypeOptions {
@@ -215,11 +222,17 @@ fn get_data_enum_schema_def(
     if e.variants.iter().all(|v| syn::Fields::Unit == v.fields) {
         let default_value = default_enum_variant(e, error_span)?;
         let default = preserve_optional(default_value);
-        let symbols: Vec<String> = e
-            .variants
-            .iter()
-            .map(|variant| variant.ident.to_string())
-            .collect();
+        let mut symbols = Vec::new();
+        for variant in &e.variants {
+            let field_attrs =
+                
VariantOptions::from_attributes(&variant.attrs[..]).map_err(darling_to_syn)?;
+            let name = if let Some(rename) = field_attrs.rename {
+                rename
+            } else {
+                variant.ident.to_string()
+            };
+            symbols.push(name);
+        }
         Ok(quote! {
             apache_avro::schema::Schema::Enum(apache_avro::schema::EnumSchema {
                 name: 
apache_avro::schema::Name::new(#full_schema_name).expect(&format!("Unable to 
parse enum name for schema {}", #full_schema_name)[..]),
@@ -646,5 +659,24 @@ mod tests {
                 "Failed to parse as derive input when it should be able to. 
Error: {error:?}"
             ),
         };
+
+        let test_enum = quote! {
+            enum A {
+                #[avro(rename = "A3")]
+                Item1,
+            }
+        };
+
+        match syn::parse2::<DeriveInput>(test_enum) {
+            Ok(mut input) => {
+                let schema_res = derive_avro_schema(&mut input);
+                let expected_token_stream = r#"let name = apache_avro :: 
schema :: Name :: new ("A") . expect (& format ! ("Unable to parse schema name 
{}" , "A") [..]) . fully_qualified_name (enclosing_namespace) ; let 
enclosing_namespace = & name . namespace ; if named_schemas . contains_key (& 
name) { apache_avro :: schema :: Schema :: Ref { name : name . clone () } } 
else { named_schemas . insert (name . clone () , apache_avro :: schema :: 
Schema :: Ref { name : name . clone () }) ;  [...]
+                let schema_token_stream = schema_res.unwrap().to_string();
+                assert!(schema_token_stream.contains(expected_token_stream));
+            }
+            Err(error) => panic!(
+                "Failed to parse as derive input when it should be able to. 
Error: {error:?}"
+            ),
+        };
     }
 }

Reply via email to