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:?}"
+ ),
+ };
}
}