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

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


The following commit(s) were added to refs/heads/feat/enums by this push:
     new ff1ca34  better testing
ff1ca34 is described below

commit ff1ca3437c8584733c1efa732e51720e4f8d5743
Author: Kriskras99 <[email protected]>
AuthorDate: Thu Mar 5 08:12:23 2026 +0100

    better testing
---
 Cargo.lock                                         |  24 +++
 avro/src/serde/deser_schema/enums/union.rs         |   4 +
 avro/src/serde/deser_schema/identifier.rs          |   4 +-
 avro/src/serde/deser_schema/mod.rs                 |  21 ++-
 avro/src/serde/deser_schema/record.rs              |  27 ++-
 avro/src/serde/ser_schema/mod.rs                   |   5 +
 avro_derive/Cargo.toml                             |   1 +
 avro_derive/src/enums/bare_union.rs                |  19 +-
 avro_derive/src/enums/mod.rs                       |   4 +-
 avro_derive/src/enums/union_of_records.rs          |  94 +++++++++-
 avro_derive/src/lib.rs                             | 206 +--------------------
 .../{ui/avro_rs_373_tag_enum.rs => expand.rs}      |  12 +-
 .../avro_3687_basic_enum_with_default.expanded.rs  |  59 ++++++
 .../avro_3687_basic_enum_with_default.rs}          |  17 +-
 .../avro_3709_record_field_attributes.expanded.rs  | 192 +++++++++++++++++++
 .../avro_3709_record_field_attributes.rs}          |  15 +-
 .../avro_rs_207_rename_all_attribute.expanded.rs   | 180 ++++++++++++++++++
 .../avro_rs_207_rename_all_attribute.rs}           |  15 +-
 ...name_attr_over_rename_all_attribute.expanded.rs | 133 +++++++++++++
 ...s_207_rename_attr_over_rename_all_attribute.rs} |  11 +-
 .../tests/expanded/avro_rs_xxx_basic.expanded.rs   | 131 +++++++++++++
 .../avro_rs_xxx_basic.rs}                          |   9 +-
 .../avro_rs_373_tag_enum.rs => expanded/mod.rs}    |  16 +-
 .../tests/ui/avro_rs_226_skip_serializing.stderr   |   2 +-
 .../ui/avro_rs_226_skip_serializing_if.stderr      |   2 +-
 avro_derive/tests/ui/avro_rs_373_alias.stderr      |   2 +-
 .../tests/ui/avro_rs_373_field_rename.stderr       |   2 +-
 avro_derive/tests/ui/avro_rs_373_flatten.stderr    |   2 +-
 avro_derive/tests/ui/avro_rs_373_name.stderr       |   2 +-
 avro_derive/tests/ui/avro_rs_373_remote.stderr     |   2 +-
 avro_derive/tests/ui/avro_rs_373_rename_all.stderr |   2 +-
 .../tests/ui/avro_rs_373_rename_all_fields.stderr  |   5 -
 avro_derive/tests/ui/avro_rs_373_skip.stderr       |   2 +-
 .../tests/ui/avro_rs_373_tag_content_enum.stderr   |   9 -
 avro_derive/tests/ui/avro_rs_373_tag_enum.stderr   |   9 -
 avro_derive/tests/ui/avro_rs_373_tag_struct.stderr |   2 +-
 .../tests/ui/avro_rs_373_untagged_enum.stderr      |  12 +-
 .../tests/ui/avro_rs_373_variant_rename.stderr     |   2 +-
 .../ui/avro_rs_397_with_word_without_serde.stderr  |   2 +-
 39 files changed, 941 insertions(+), 317 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock
index 670f8f6..f2b6d63 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -102,6 +102,7 @@ dependencies = [
  "apache-avro",
  "darling",
  "hexdump",
+ "macrotest",
  "pretty_assertions",
  "proc-macro2",
  "proptest",
@@ -544,6 +545,12 @@ version = "1.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
 
+[[package]]
+name = "fastrand"
+version = "2.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
+
 [[package]]
 name = "find-msvc-tools"
 version = "0.1.9"
@@ -801,6 +808,23 @@ version = "0.4.29"
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
 
+[[package]]
+name = "macrotest"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "cd198afd908012e57564b66e43e7d4d19056cec7e6232e9e6d54a1798622f81d"
+dependencies = [
+ "diff",
+ "fastrand",
+ "glob",
+ "prettyplease",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "syn",
+ "toml",
+]
+
 [[package]]
 name = "md-5"
 version = "0.10.6"
diff --git a/avro/src/serde/deser_schema/enums/union.rs 
b/avro/src/serde/deser_schema/enums/union.rs
index be09d2a..8712128 100644
--- a/avro/src/serde/deser_schema/enums/union.rs
+++ b/avro/src/serde/deser_schema/enums/union.rs
@@ -101,6 +101,10 @@ impl<'de, 's, 'r, R: Read, S: Borrow<Schema>> 
VariantAccess<'de>
         if let Schema::Record(record) = self.schema
             && record.fields.len() == 1
             && record.fields[0].name == "field_0"
+            && record
+                .attributes
+                .get("org.apache.avro.rust.union_of_records")
+                == Some(&serde_json::Value::Bool(true))
         {
             // Most likely a Union of Records
             seed.deserialize(SchemaAwareDeserializer::new(
diff --git a/avro/src/serde/deser_schema/identifier.rs 
b/avro/src/serde/deser_schema/identifier.rs
index 1082a18..fd175c4 100644
--- a/avro/src/serde/deser_schema/identifier.rs
+++ b/avro/src/serde/deser_schema/identifier.rs
@@ -24,11 +24,11 @@ impl<'s> IdentifierDeserializer<'s> {
 impl<'de, 's> Deserializer<'de> for IdentifierDeserializer<'s> {
     type Error = Error;
 
-    fn deserialize_any<V>(self, _visitor: V) -> Result<V::Value, Self::Error>
+    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
     where
         V: Visitor<'de>,
     {
-        Err(self.error("deserialize_any"))
+        self.deserialize_identifier(visitor)
     }
 
     fn deserialize_bool<V>(self, _visitor: V) -> Result<V::Value, Self::Error>
diff --git a/avro/src/serde/deser_schema/mod.rs 
b/avro/src/serde/deser_schema/mod.rs
index 7e61686..8fb8bb5 100644
--- a/avro/src/serde/deser_schema/mod.rs
+++ b/avro/src/serde/deser_schema/mod.rs
@@ -712,11 +712,14 @@ impl<'de, 's, 'r, R: Read, S: Borrow<Schema>> 
Deserializer<'de>
         self.config.human_readable
     }
 
-    fn deserialize_identifier<V>(self, _visitor: V) -> Result<V::Value, 
Self::Error>
+    fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, 
Self::Error>
     where
         V: serde::de::Visitor<'de>,
     {
-        panic!("deserialize_identifier: {:?}", self.schema);
+        match self.schema {
+            Schema::String => self.deserialize_string(visitor),
+            _ => Err(self.error("identifier", "Expected Schema::String")),
+        }
     }
 
     fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, 
Self::Error>
@@ -1008,11 +1011,7 @@ mod tests {
                     "name": "UnitInternalEnum",
                     "fields": [{
                         "name": "t",
-                        "type": {
-                            "type": "enum",
-                            "name": "t",
-                            "symbols": ["Val1", "Val2"]
-                        }
+                        "type": "string"
                     }]
                 }
             }]
@@ -1170,6 +1169,7 @@ mod tests {
                     {
                         "name": "Val3",
                         "type": "record",
+                        "org.apache.avro.rust.union_of_records": true,
                         "fields": [{
                             "name": "field_0",
                             "type": "null"
@@ -1178,6 +1178,7 @@ mod tests {
                     {
                         "name": "Val4",
                         "type": "record",
+                        "org.apache.avro.rust.union_of_records": true,
                         "fields": [{
                             "name": "field_0",
                             "type": {
@@ -1238,16 +1239,18 @@ mod tests {
                 "name": "a",
                 "type": [
                     {
-                        "name": "Val1",
+                        "name": "Double",
                         "type": "record",
+                        "org.apache.avro.rust.union_of_records": true,
                         "fields": [{
                             "name": "field_0",
                             "type": "double"
                         }]
                     },
                     {
-                        "name": "Val2",
+                        "name": "String",
                         "type": "record",
+                        "org.apache.avro.rust.union_of_records": true,
                         "fields": [{
                             "name": "field_0",
                             "type": "string"
diff --git a/avro/src/serde/deser_schema/record.rs 
b/avro/src/serde/deser_schema/record.rs
index 86e6000..f2771f3 100644
--- a/avro/src/serde/deser_schema/record.rs
+++ b/avro/src/serde/deser_schema/record.rs
@@ -89,11 +89,28 @@ impl<'de, 's, 'r, R: Read, S: Borrow<Schema>> 
MapAccess<'de> for RecordDeseriali
         let State::Value(index) = self.current_field else {
             panic!("`next_key_seed` and `next_value_seed` where called in the 
wrong error")
         };
-        let v = seed.deserialize(SchemaAwareDeserializer::new(
-            self.reader,
-            &self.schema.fields[index].schema,
-            self.config,
-        )?)?;
+        let schema = &self.schema.fields[index].schema;
+        let v = if let Schema::Record(record) = schema
+            && record.fields.len() == 1
+            && record.fields[0].name == "field_0"
+            && record
+                .attributes
+                .get("org.apache.avro.rust.union_of_records")
+                == Some(&serde_json::Value::Bool(true))
+        {
+            // Most likely a Union of Records
+            seed.deserialize(SchemaAwareDeserializer::new(
+                self.reader,
+                &record.fields[0].schema,
+                self.config,
+            )?)?
+        } else {
+            seed.deserialize(SchemaAwareDeserializer::new(
+                self.reader,
+                schema,
+                self.config,
+            )?)?
+        };
         self.current_field = State::Key(index + 1);
         Ok(v)
     }
diff --git a/avro/src/serde/ser_schema/mod.rs b/avro/src/serde/ser_schema/mod.rs
index 8a1e511..870aa14 100644
--- a/avro/src/serde/ser_schema/mod.rs
+++ b/avro/src/serde/ser_schema/mod.rs
@@ -538,6 +538,11 @@ impl<'s, 'w, W: Write> Serializer for 
SchemaAwareSerializer<'s, 'w, W> {
                 if let Some(Schema::Record(record)) = 
union.variants().get(variant_index as usize)
                     && record.name.name() == variant
                     && record.fields.len() == 1
+                    && record.fields[0].name == "field_0"
+                    && record
+                        .attributes
+                        .get("org.apache.avro.rust.union_of_records")
+                        == Some(&serde_json::Value::Bool(true))
                 {
                     // Union of records
                     let mut bytes_written = encode_int(variant_index as i32, 
&mut *self.writer)?;
diff --git a/avro_derive/Cargo.toml b/avro_derive/Cargo.toml
index e6bb82d..8ac3133 100644
--- a/avro_derive/Cargo.toml
+++ b/avro_derive/Cargo.toml
@@ -47,6 +47,7 @@ rustversion = "1.0.22"
 serde = { workspace = true }
 trybuild = "1.0.116"
 hexdump = "0.1.2"
+macrotest = "1.2.1"
 
 [build-dependencies]
 rustversion = "1.0.22"
diff --git a/avro_derive/src/enums/bare_union.rs 
b/avro_derive/src/enums/bare_union.rs
index a9e5c93..b0342b2 100644
--- a/avro_derive/src/enums/bare_union.rs
+++ b/avro_derive/src/enums/bare_union.rs
@@ -21,19 +21,32 @@ pub fn get_data_enum_schema_def(
         });
         match variant.fields {
             Fields::Named(named) => {
+                let mut fields = Vec::with_capacity(named.named.len());
                 for field in named.named {
                     let ident = field_attrs
                         .rename_all
                         .or(container_attrs.rename_all_fields)
                         .apply_to_field(&field.ident.unwrap().to_string());
                     let schema_expr = type_to_schema_expr(&field.ty)?;
-                    variant_expr.push(quote! {
-                        
fields.push(::apache_avro::schema::RecordField::builder()
+                    fields.push(quote! {
+                        ::apache_avro::schema::RecordField::builder()
                             .name(#ident.to_string())
                             .schema(#schema_expr)
-                            .build())
+                            .build()
                     });
                 }
+
+                let schema_expr = quote! {
+                    ::apache_avro::schema::Schema::Record(
+                        ::apache_avro::schema::RecordSchema::builder()
+                            
.name(::apache_avro::schema::Name::new_with_enclosing_namespace(#name, 
enclosing_namespace).expect(&format!("Unable to parse variant record name for 
schema {}", #name)[..]))
+                            .fields(vec![
+                                #(#fields,)*
+                            ])
+                            .build()
+                    )
+                };
+                variant_expr.push(schema_expr);
             }
             Fields::Unnamed(unnamed) => {
                 if unnamed.unnamed.is_empty() {
diff --git a/avro_derive/src/enums/mod.rs b/avro_derive/src/enums/mod.rs
index 83af7a4..e9c2418 100644
--- a/avro_derive/src/enums/mod.rs
+++ b/avro_derive/src/enums/mod.rs
@@ -36,7 +36,7 @@ pub fn get_data_enum_schema_def(
             if data_enum.variants.iter().all(|v| Fields::Unit == v.fields) {
                 plain::schema_def(container_attrs, data_enum, ident_span)
             } else {
-                union_of_records::get_data_enum_schema_def(container_attrs, 
data_enum, ident_span)
+                union_of_records::get_data_enum_schema_def(container_attrs, 
data_enum)
             }
         }
         Some(EnumRepr::Enum) => plain::schema_def(container_attrs, data_enum, 
ident_span),
@@ -44,7 +44,7 @@ pub fn get_data_enum_schema_def(
             bare_union::get_data_enum_schema_def(container_attrs, data_enum, 
ident_span)
         }
         Some(EnumRepr::UnionOfRecords) => {
-            union_of_records::get_data_enum_schema_def(container_attrs, 
data_enum, ident_span)
+            union_of_records::get_data_enum_schema_def(container_attrs, 
data_enum)
         }
         Some(EnumRepr::RecordTagContent { tag, content }) => {
             record_tag_content::get_data_enum_schema_def(container_attrs, 
data_enum, tag, content)
diff --git a/avro_derive/src/enums/union_of_records.rs 
b/avro_derive/src/enums/union_of_records.rs
index 7b92631..4a68a0e 100644
--- a/avro_derive/src/enums/union_of_records.rs
+++ b/avro_derive/src/enums/union_of_records.rs
@@ -1,14 +1,98 @@
-use crate::attributes::NamedTypeOptions;
-use proc_macro2::{Span, TokenStream};
+use crate::attributes::{NamedTypeOptions, VariantOptions};
+use crate::type_to_schema_expr;
+use proc_macro2::TokenStream;
 use quote::quote;
-use syn::DataEnum;
+use syn::spanned::Spanned;
+use syn::{DataEnum, Fields};
 
 pub fn get_data_enum_schema_def(
     container_attrs: &NamedTypeOptions,
     data_enum: DataEnum,
-    ident_span: Span,
 ) -> Result<TokenStream, Vec<syn::Error>> {
+    let mut variant_expr = Vec::new();
+    for variant in data_enum.variants {
+        let field_attrs = VariantOptions::new(&variant.attrs, variant.span())?;
+        let name = field_attrs.rename.unwrap_or_else(|| {
+            container_attrs
+                .rename_all
+                .apply_to_variant(&variant.ident.to_string())
+        });
+        match variant.fields {
+            Fields::Named(named) => {
+                let mut fields = Vec::with_capacity(named.named.len());
+                for field in named.named {
+                    let ident = field_attrs
+                        .rename_all
+                        .or(container_attrs.rename_all_fields)
+                        .apply_to_field(&field.ident.unwrap().to_string());
+                    let schema_expr = type_to_schema_expr(&field.ty)?;
+                    fields.push(quote! {
+                        ::apache_avro::schema::RecordField::builder()
+                            .name(#ident.to_string())
+                            .schema(#schema_expr)
+                            .build()
+                    });
+                }
+
+                let schema_expr = quote! {
+                    ::apache_avro::schema::Schema::Record(
+                        ::apache_avro::schema::RecordSchema::builder()
+                            
.name(::apache_avro::schema::Name::new_with_enclosing_namespace(#name, 
enclosing_namespace).expect(&format!("Unable to parse variant record name for 
schema {}", #name)[..]))
+                            .fields(vec![
+                                #(#fields,)*
+                            ])
+                            .build()
+                    )
+                };
+                variant_expr.push(schema_expr);
+            }
+            Fields::Unnamed(unnamed) => {
+                let mut fields = Vec::with_capacity(unnamed.unnamed.len());
+                for (index, field) in unnamed.unnamed.iter().enumerate() {
+                    let field_schema_expr = type_to_schema_expr(&field.ty)?;
+                    fields.push(quote! {
+                        ::apache_avro::schema::RecordField::builder()
+                            .name(format!("field_{}", #index))
+                            .schema(#field_schema_expr)
+                            .build()
+                    });
+                }
+
+                let amount_of_fields = unnamed.unnamed.len();
+
+                let schema_expr = quote! {
+                    let mut builder = 
::apache_avro::schema::RecordSchema::builder()
+                            
.name(::apache_avro::schema::Name::new_with_enclosing_namespace(#name, 
enclosing_namespace).expect(&format!("Unable to parse variant record name for 
schema {}", #name)[..]))
+                            .fields(vec![
+                                #(#fields,)*
+                            ]);
+                    if #amount_of_fields == 1 {
+                        builder = 
builder.attributes([("org.apache.avro.rust.union_of_records".to_string(), 
::serde_json::value::Value::Bool(true))].into());
+                    } else if #amount_of_fields > 1 {
+                        builder = 
builder.attributes([("org.apache.avro.rust.tuple".to_string(), 
::serde_json::value::Value::Bool(true))].into());
+                    }
+
+                    ::apache_avro::schema::Schema::Record(builder.build())
+                };
+                variant_expr.push(schema_expr);
+            }
+            Fields::Unit => {
+                let schema_expr = quote! {
+                    ::apache_avro::schema::Schema::Record(
+                        ::apache_avro::schema::RecordSchema::builder()
+                            
.name(::apache_avro::schema::Name::new_with_enclosing_namespace(#name, 
enclosing_namespace).expect(&format!("Unable to parse variant record name for 
schema {}", #name)[..]))
+                            .build()
+                    )
+                };
+                variant_expr.push(schema_expr);
+            }
+        }
+    }
     Ok(quote! {
-        panic!("Hello world")
+        let mut builder = ::apache_avro::schema::UnionSchema::builder();
+
+        #(builder.variant(#variant_expr).expect("Duplicate Schema found");)*
+
+        ::apache_avro::schema::Schema::Union(builder.build())
     })
 }
diff --git a/avro_derive/src/lib.rs b/avro_derive/src/lib.rs
index cebfe24..a592f3a 100644
--- a/avro_derive/src/lib.rs
+++ b/avro_derive/src/lib.rs
@@ -239,7 +239,7 @@ fn get_struct_schema_def(
                         default: #default_value,
                         aliases: #aliases,
                         schema: #schema_expr,
-                        custom_attributes: Default::default(),
+                        custom_attributes: ::std::collections::BTreeMap::new(),
                     });
                 });
             }
@@ -268,23 +268,23 @@ fn get_struct_schema_def(
 
     let schema_def = quote! {
         {
-            let mut schema_fields = Vec::with_capacity(#minimum_fields);
+            let mut schema_fields = 
::std::vec::Vec::with_capacity(#minimum_fields);
             #(#record_field_exprs)*
             let schema_field_set: ::std::collections::HashSet<_> = 
schema_fields.iter().map(|rf| &rf.name).collect();
             assert_eq!(schema_fields.len(), schema_field_set.len(), "Duplicate 
field names found: {schema_fields:?}");
             let name = 
::apache_avro::schema::Name::new(#full_schema_name).expect(&format!("Unable to 
parse struct name for schema {}", #full_schema_name)[..]);
-            let lookup: std::collections::BTreeMap<String, usize> = 
schema_fields
+            let lookup: ::std::collections::BTreeMap<String, usize> = 
schema_fields
                 .iter()
                 .enumerate()
                 .map(|(position, field)| (field.name.to_owned(), position))
                 .collect();
-            
::apache_avro::schema::Schema::Record(apache_avro::schema::RecordSchema {
+            
::apache_avro::schema::Schema::Record(::apache_avro::schema::RecordSchema {
                 name,
                 aliases: #record_aliases,
                 doc: #record_doc,
                 fields: schema_fields,
                 lookup,
-                attributes: Default::default(),
+                attributes: ::std::collections::BTreeMap::new(),
             })
         }
     };
@@ -475,8 +475,8 @@ fn to_compile_errors(errors: Vec<syn::Error>) -> 
proc_macro2::TokenStream {
 
 fn preserve_optional(op: Option<impl quote::ToTokens>) -> TokenStream {
     match op {
-        Some(tt) => quote! {Some(#tt.into())},
-        None => quote! {None},
+        Some(tt) => quote! {::std::option::Option::Some(#tt.into())},
+        None => quote! {::std::option::Option::None},
     }
 }
 
@@ -509,25 +509,6 @@ mod tests {
     use super::*;
     use pretty_assertions::assert_eq;
 
-    #[test]
-    fn basic_case() {
-        let test_struct = quote! {
-            struct A {
-                a: i32,
-                b: String
-            }
-        };
-
-        match syn::parse2::<DeriveInput>(test_struct) {
-            Ok(input) => {
-                assert!(derive_avro_schema(input).is_ok())
-            }
-            Err(error) => panic!(
-                "Failed to parse as derive input when it should be able to. 
Error: {error:?}"
-            ),
-        };
-    }
-
     #[test]
     fn tuple_struct_unsupported() {
         let test_tuple_struct = quote! {
@@ -597,70 +578,6 @@ mod tests {
         };
     }
 
-    #[test]
-    fn avro_3687_basic_enum_with_default() {
-        let basic_enum = quote! {
-            enum Basic {
-                #[default]
-                A,
-                B,
-                C,
-                D
-            }
-        };
-        match syn::parse2::<DeriveInput>(basic_enum) {
-            Ok(input) => {
-                let derived = derive_avro_schema(input);
-                assert!(derived.is_ok());
-                assert_eq!(derived.unwrap().to_string(), quote! {
-                    #[automatically_derived]
-                    impl ::apache_avro::AvroSchemaComponent for Basic {
-                        fn get_schema_in_ctxt(
-                            named_schemas: &mut 
::std::collections::HashSet<::apache_avro::schema::Name>,
-                            enclosing_namespace: 
::apache_avro::schema::NamespaceRef
-                        ) -> ::apache_avro::schema::Schema {
-                            let name = 
::apache_avro::schema::Name::new_with_enclosing_namespace("Basic", 
enclosing_namespace)
-                                .expect(concat!("Unable to parse schema name 
", "Basic"));
-                            if named_schemas.contains(&name) {
-                                ::apache_avro::schema::Schema::Ref { name }
-                            } else {
-                                let enclosing_namespace = name.namespace();
-                                named_schemas.insert(name.clone());
-                                
::apache_avro::schema::Schema::Enum(apache_avro::schema::EnumSchema {
-                                    name,
-                                    aliases: ::std::option::Option::None,
-                                    doc: None,
-                                    symbols: vec![
-                                        "A".to_owned(),
-                                        "B".to_owned(),
-                                        "C".to_owned(),
-                                        "D".to_owned()
-                                    ],
-                                    default: Some("A".into()),
-                                    attributes: Default::default(),
-                                })
-                            }
-                        }
-
-                        fn get_record_fields_in_ctxt(
-                            named_schemas: &mut 
::std::collections::HashSet<::apache_avro::schema::Name>,
-                            enclosing_namespace: 
::apache_avro::schema::NamespaceRef
-                        ) -> ::std::option::Option 
<::std::vec::Vec<::apache_avro::schema::RecordField>> {
-                            None
-                        }
-
-                        fn field_default () -> 
::std::option::Option<::serde_json::Value> {
-                            ::std::option::Option::None
-                        }
-                    }
-                }.to_string());
-            }
-            Err(error) => panic!(
-                "Failed to parse as derive input when it should be able to. 
Error: {error:?}"
-            ),
-        };
-    }
-
     #[test]
     fn avro_3687_basic_enum_with_default_twice() {
         let non_basic_enum = quote! {
@@ -764,113 +681,4 @@ mod tests {
         
assert_eq!(type_to_schema_expr(&syn::parse2::<Type>(quote!{Vec<T>}).unwrap()).unwrap().to_string(),
 quote!{<Vec<T> as :: 
apache_avro::AvroSchemaComponent>::get_schema_in_ctxt(named_schemas, 
enclosing_namespace)}.to_string());
         
assert_eq!(type_to_schema_expr(&syn::parse2::<Type>(quote!{AnyType}).unwrap()).unwrap().to_string(),
 quote!{<AnyType as :: 
apache_avro::AvroSchemaComponent>::get_schema_in_ctxt(named_schemas, 
enclosing_namespace)}.to_string());
     }
-
-    #[test]
-    fn test_avro_3709_record_field_attributes() {
-        let test_struct = quote! {
-            struct A {
-                #[serde(alias = "a1", alias = "a2", rename = "a3")]
-                #[avro(doc = "a doc", default = "123")]
-                a: i32
-            }
-        };
-
-        match syn::parse2::<DeriveInput>(test_struct) {
-            Ok(input) => {
-                let schema_res = derive_avro_schema(input);
-                let expected_token_stream = r#"# [automatically_derived] impl 
:: apache_avro :: AvroSchemaComponent for A { fn get_schema_in_ctxt 
(named_schemas : & mut :: std :: collections :: HashSet < :: apache_avro :: 
schema :: Name > , enclosing_namespace : :: apache_avro :: schema :: 
NamespaceRef) -> :: apache_avro :: schema :: Schema { let name = :: apache_avro 
:: schema :: Name :: new_with_enclosing_namespace ("A" , enclosing_namespace) . 
expect (concat ! ("Unable to parse schema [...]
-                let schema_token_stream = schema_res.unwrap().to_string();
-                assert_eq!(schema_token_stream, expected_token_stream);
-            }
-            Err(error) => panic!(
-                "Failed to parse as derive input when it should be able to. 
Error: {error:?}"
-            ),
-        };
-
-        let test_enum = quote! {
-            enum A {
-                #[serde(rename = "A3")]
-                Item1,
-            }
-        };
-
-        match syn::parse2::<DeriveInput>(test_enum) {
-            Ok(input) => {
-                let schema_res = derive_avro_schema(input);
-                let expected_token_stream = r#"# [automatically_derived] impl 
:: apache_avro :: AvroSchemaComponent for A { fn get_schema_in_ctxt 
(named_schemas : & mut :: std :: collections :: HashSet < :: apache_avro :: 
schema :: Name > , enclosing_namespace : :: apache_avro :: schema :: 
NamespaceRef) -> :: apache_avro :: schema :: Schema { let name = :: apache_avro 
:: schema :: Name :: new_with_enclosing_namespace ("A" , enclosing_namespace) . 
expect (concat ! ("Unable to parse schema [...]
-                let schema_token_stream = schema_res.unwrap().to_string();
-                assert_eq!(schema_token_stream, expected_token_stream);
-            }
-            Err(error) => panic!(
-                "Failed to parse as derive input when it should be able to. 
Error: {error:?}"
-            ),
-        };
-    }
-
-    #[test]
-    fn test_avro_rs_207_rename_all_attribute() {
-        let test_struct = quote! {
-            #[serde(rename_all="SCREAMING_SNAKE_CASE")]
-            struct A {
-                item: i32,
-                double_item: i32
-            }
-        };
-
-        match syn::parse2::<DeriveInput>(test_struct) {
-            Ok(input) => {
-                let schema_res = derive_avro_schema(input);
-                let expected_token_stream = r#"# [automatically_derived] impl 
:: apache_avro :: AvroSchemaComponent for A { fn get_schema_in_ctxt 
(named_schemas : & mut :: std :: collections :: HashSet < :: apache_avro :: 
schema :: Name > , enclosing_namespace : :: apache_avro :: schema :: 
NamespaceRef) -> :: apache_avro :: schema :: Schema { let name = :: apache_avro 
:: schema :: Name :: new_with_enclosing_namespace ("A" , enclosing_namespace) . 
expect (concat ! ("Unable to parse schema [...]
-                let schema_token_stream = schema_res.unwrap().to_string();
-                assert_eq!(schema_token_stream, expected_token_stream);
-            }
-            Err(error) => panic!(
-                "Failed to parse as derive input when it should be able to. 
Error: {error:?}"
-            ),
-        };
-
-        let test_enum = quote! {
-            #[serde(rename_all="SCREAMING_SNAKE_CASE")]
-            enum B {
-                Item,
-                DoubleItem,
-            }
-        };
-
-        match syn::parse2::<DeriveInput>(test_enum) {
-            Ok(input) => {
-                let schema_res = derive_avro_schema(input);
-                let expected_token_stream = r#"# [automatically_derived] impl 
:: apache_avro :: AvroSchemaComponent for B { fn get_schema_in_ctxt 
(named_schemas : & mut :: std :: collections :: HashSet < :: apache_avro :: 
schema :: Name > , enclosing_namespace : :: apache_avro :: schema :: 
NamespaceRef) -> :: apache_avro :: schema :: Schema { let name = :: apache_avro 
:: schema :: Name :: new_with_enclosing_namespace ("B" , enclosing_namespace) . 
expect (concat ! ("Unable to parse schema [...]
-                let schema_token_stream = schema_res.unwrap().to_string();
-                assert_eq!(schema_token_stream, expected_token_stream);
-            }
-            Err(error) => panic!(
-                "Failed to parse as derive input when it should be able to. 
Error: {error:?}"
-            ),
-        };
-    }
-
-    #[test]
-    fn test_avro_rs_207_rename_attr_has_priority_over_rename_all_attribute() {
-        let test_struct = quote! {
-            #[serde(rename_all="SCREAMING_SNAKE_CASE")]
-            struct A {
-                item: i32,
-                #[serde(rename="DoubleItem")]
-                double_item: i32
-            }
-        };
-
-        match syn::parse2::<DeriveInput>(test_struct) {
-            Ok(input) => {
-                let schema_res = derive_avro_schema(input);
-                let expected_token_stream = r#"# [automatically_derived] impl 
:: apache_avro :: AvroSchemaComponent for A { fn get_schema_in_ctxt 
(named_schemas : & mut :: std :: collections :: HashSet < :: apache_avro :: 
schema :: Name > , enclosing_namespace : :: apache_avro :: schema :: 
NamespaceRef) -> :: apache_avro :: schema :: Schema { let name = :: apache_avro 
:: schema :: Name :: new_with_enclosing_namespace ("A" , enclosing_namespace) . 
expect (concat ! ("Unable to parse schema [...]
-                let schema_token_stream = schema_res.unwrap().to_string();
-                assert_eq!(schema_token_stream, expected_token_stream);
-            }
-            Err(error) => panic!(
-                "Failed to parse as derive input when it should be able to. 
Error: {error:?}"
-            ),
-        };
-    }
 }
diff --git a/avro_derive/tests/ui/avro_rs_373_tag_enum.rs 
b/avro_derive/tests/expand.rs
similarity index 87%
copy from avro_derive/tests/ui/avro_rs_373_tag_enum.rs
copy to avro_derive/tests/expand.rs
index 1c5e46a..d972743 100644
--- a/avro_derive/tests/ui/avro_rs_373_tag_enum.rs
+++ b/avro_derive/tests/expand.rs
@@ -15,13 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
-use apache_avro::AvroSchema;
+mod expanded;
 
-#[derive(AvroSchema)]
-#[serde(tag = "bar")]
-enum Foo {
-    One,
-    Two,
+#[test]
+pub fn expand() {
+    macrotest::expand("tests/expanded/avro_*.rs");
 }
-
-pub fn main() {}
diff --git 
a/avro_derive/tests/expanded/avro_3687_basic_enum_with_default.expanded.rs 
b/avro_derive/tests/expanded/avro_3687_basic_enum_with_default.expanded.rs
new file mode 100644
index 0000000..dc355c1
--- /dev/null
+++ b/avro_derive/tests/expanded/avro_3687_basic_enum_with_default.expanded.rs
@@ -0,0 +1,59 @@
+use apache_avro::AvroSchema;
+#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
+enum Basic {
+    #[default]
+    A,
+    B,
+    C,
+    D,
+}
+#[automatically_derived]
+impl ::apache_avro::AvroSchemaComponent for Basic {
+    fn get_schema_in_ctxt(
+        named_schemas: &mut 
::std::collections::HashSet<::apache_avro::schema::Name>,
+        enclosing_namespace: ::apache_avro::schema::NamespaceRef,
+    ) -> ::apache_avro::schema::Schema {
+        let name = ::apache_avro::schema::Name::new_with_enclosing_namespace(
+                "Basic",
+                enclosing_namespace,
+            )
+            .expect("Unable to parse schema name Basic");
+        if named_schemas.contains(&name) {
+            ::apache_avro::schema::Schema::Ref {
+                name,
+            }
+        } else {
+            let enclosing_namespace = name.namespace();
+            named_schemas.insert(name.clone());
+            
::apache_avro::schema::Schema::Enum(apache_avro::schema::EnumSchema {
+                name,
+                aliases: ::std::option::Option::None,
+                doc: ::std::option::Option::None,
+                symbols: ::alloc::boxed::box_assume_init_into_vec_unsafe(
+                    ::alloc::intrinsics::write_box_via_move(
+                        ::alloc::boxed::Box::new_uninit(),
+                        ["A".to_owned(), "B".to_owned(), "C".to_owned(), 
"D".to_owned()],
+                    ),
+                ),
+                default: ::std::option::Option::Some("A".into()),
+                attributes: Default::default(),
+            })
+        }
+    }
+    fn get_record_fields_in_ctxt(
+        named_schemas: &mut 
::std::collections::HashSet<::apache_avro::schema::Name>,
+        enclosing_namespace: ::apache_avro::schema::NamespaceRef,
+    ) -> 
::std::option::Option<::std::vec::Vec<::apache_avro::schema::RecordField>> {
+        None
+    }
+    fn field_default() -> ::std::option::Option<::serde_json::Value> {
+        ::std::option::Option::None
+    }
+}
+#[automatically_derived]
+impl ::core::default::Default for Basic {
+    #[inline]
+    fn default() -> Basic {
+        Self::A
+    }
+}
diff --git a/avro_derive/tests/ui/avro_rs_373_rename_all_fields.rs 
b/avro_derive/tests/expanded/avro_3687_basic_enum_with_default.rs
similarity index 85%
rename from avro_derive/tests/ui/avro_rs_373_rename_all_fields.rs
rename to avro_derive/tests/expanded/avro_3687_basic_enum_with_default.rs
index e705461..21f2617 100644
--- a/avro_derive/tests/ui/avro_rs_373_rename_all_fields.rs
+++ b/avro_derive/tests/expanded/avro_3687_basic_enum_with_default.rs
@@ -17,13 +17,12 @@
 
 use apache_avro::AvroSchema;
 
-#[derive(AvroSchema)]
-#[serde(rename_all_fields = "UPPERCASE")]
-enum Foo {
-    Bar {
-        a: String,
-        b: i32,
-    }
+#[derive(AvroSchema, Default)]
+#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
+enum Basic {
+    #[default]
+    A,
+    B,
+    C,
+    D,
 }
-
-pub fn main() {}
diff --git 
a/avro_derive/tests/expanded/avro_3709_record_field_attributes.expanded.rs 
b/avro_derive/tests/expanded/avro_3709_record_field_attributes.expanded.rs
new file mode 100644
index 0000000..e0e46b5
--- /dev/null
+++ b/avro_derive/tests/expanded/avro_3709_record_field_attributes.expanded.rs
@@ -0,0 +1,192 @@
+use apache_avro::AvroSchema;
+#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
+struct A {
+    #[serde(alias = "a1", alias = "a2", rename = "a3")]
+    #[avro(doc = "a doc", default = "123")]
+    a: i32,
+}
+#[automatically_derived]
+impl ::apache_avro::AvroSchemaComponent for A {
+    fn get_schema_in_ctxt(
+        named_schemas: &mut 
::std::collections::HashSet<::apache_avro::schema::Name>,
+        enclosing_namespace: ::apache_avro::schema::NamespaceRef,
+    ) -> ::apache_avro::schema::Schema {
+        let name = ::apache_avro::schema::Name::new_with_enclosing_namespace(
+                "A",
+                enclosing_namespace,
+            )
+            .expect("Unable to parse schema name A");
+        if named_schemas.contains(&name) {
+            ::apache_avro::schema::Schema::Ref {
+                name,
+            }
+        } else {
+            let enclosing_namespace = name.namespace();
+            named_schemas.insert(name.clone());
+            {
+                let mut schema_fields = ::std::vec::Vec::with_capacity(1usize);
+                schema_fields
+                    .push(::apache_avro::schema::RecordField {
+                        name: "a3".to_string(),
+                        doc: ::std::option::Option::Some("a doc".into()),
+                        default: Some(
+                            ::serde_json::from_str("123")
+                                .expect(
+                                    ::alloc::__export::must_use({
+                                            ::alloc::fmt::format(
+                                                format_args!("Invalid JSON: 
{0:?}", "123"),
+                                            )
+                                        })
+                                        .as_str(),
+                                ),
+                        ),
+                        aliases: 
::alloc::boxed::box_assume_init_into_vec_unsafe(
+                            ::alloc::intrinsics::write_box_via_move(
+                                ::alloc::boxed::Box::new_uninit(),
+                                [
+                                    "a1".try_into().expect("Alias is invalid"),
+                                    "a2".try_into().expect("Alias is invalid"),
+                                ],
+                            ),
+                        ),
+                        schema: <i32 as 
::apache_avro::AvroSchemaComponent>::get_schema_in_ctxt(
+                            named_schemas,
+                            enclosing_namespace,
+                        ),
+                        custom_attributes: ::std::collections::BTreeMap::new(),
+                    });
+                let schema_field_set: ::std::collections::HashSet<_> = 
schema_fields
+                    .iter()
+                    .map(|rf| &rf.name)
+                    .collect();
+                match (&schema_fields.len(), &schema_field_set.len()) {
+                    (left_val, right_val) => {
+                        if !(*left_val == *right_val) {
+                            let kind = ::core::panicking::AssertKind::Eq;
+                            ::core::panicking::assert_failed(
+                                kind,
+                                &*left_val,
+                                &*right_val,
+                                ::core::option::Option::Some(
+                                    format_args!(
+                                        "Duplicate field names found: {0:?}", 
schema_fields,
+                                    ),
+                                ),
+                            );
+                        }
+                    }
+                };
+                let name = ::apache_avro::schema::Name::new("A")
+                    .expect(
+                        &::alloc::__export::must_use({
+                            ::alloc::fmt::format(
+                                format_args!(
+                                    "Unable to parse struct name for schema 
{0}", "A",
+                                ),
+                            )
+                        })[..],
+                    );
+                let lookup: ::std::collections::BTreeMap<String, usize> = 
schema_fields
+                    .iter()
+                    .enumerate()
+                    .map(|(position, field)| (field.name.to_owned(), position))
+                    .collect();
+                
::apache_avro::schema::Schema::Record(::apache_avro::schema::RecordSchema {
+                    name,
+                    aliases: ::std::option::Option::None,
+                    doc: ::std::option::Option::None,
+                    fields: schema_fields,
+                    lookup,
+                    attributes: ::std::collections::BTreeMap::new(),
+                })
+            }
+        }
+    }
+    fn get_record_fields_in_ctxt(
+        named_schemas: &mut 
::std::collections::HashSet<::apache_avro::schema::Name>,
+        enclosing_namespace: ::apache_avro::schema::NamespaceRef,
+    ) -> 
::std::option::Option<::std::vec::Vec<::apache_avro::schema::RecordField>> {
+        let mut schema_fields = Vec::with_capacity(1usize);
+        schema_fields
+            .push(::apache_avro::schema::RecordField {
+                name: "a3".to_string(),
+                doc: ::std::option::Option::Some("a doc".into()),
+                default: Some(
+                    ::serde_json::from_str("123")
+                        .expect(
+                            ::alloc::__export::must_use({
+                                    ::alloc::fmt::format(
+                                        format_args!("Invalid JSON: {0:?}", 
"123"),
+                                    )
+                                })
+                                .as_str(),
+                        ),
+                ),
+                aliases: ::alloc::boxed::box_assume_init_into_vec_unsafe(
+                    ::alloc::intrinsics::write_box_via_move(
+                        ::alloc::boxed::Box::new_uninit(),
+                        [
+                            "a1".try_into().expect("Alias is invalid"),
+                            "a2".try_into().expect("Alias is invalid"),
+                        ],
+                    ),
+                ),
+                schema: <i32 as 
::apache_avro::AvroSchemaComponent>::get_schema_in_ctxt(
+                    named_schemas,
+                    enclosing_namespace,
+                ),
+                custom_attributes: ::std::collections::BTreeMap::new(),
+            });
+        Some(schema_fields)
+    }
+    fn field_default() -> ::std::option::Option<::serde_json::Value> {
+        ::std::option::Option::None
+    }
+}
+enum B {
+    #[serde(rename = "A3")]
+    Item1,
+}
+#[automatically_derived]
+impl ::apache_avro::AvroSchemaComponent for B {
+    fn get_schema_in_ctxt(
+        named_schemas: &mut 
::std::collections::HashSet<::apache_avro::schema::Name>,
+        enclosing_namespace: ::apache_avro::schema::NamespaceRef,
+    ) -> ::apache_avro::schema::Schema {
+        let name = ::apache_avro::schema::Name::new_with_enclosing_namespace(
+                "B",
+                enclosing_namespace,
+            )
+            .expect("Unable to parse schema name B");
+        if named_schemas.contains(&name) {
+            ::apache_avro::schema::Schema::Ref {
+                name,
+            }
+        } else {
+            let enclosing_namespace = name.namespace();
+            named_schemas.insert(name.clone());
+            
::apache_avro::schema::Schema::Enum(apache_avro::schema::EnumSchema {
+                name,
+                aliases: ::std::option::Option::None,
+                doc: ::std::option::Option::None,
+                symbols: ::alloc::boxed::box_assume_init_into_vec_unsafe(
+                    ::alloc::intrinsics::write_box_via_move(
+                        ::alloc::boxed::Box::new_uninit(),
+                        ["A3".to_owned()],
+                    ),
+                ),
+                default: ::std::option::Option::None,
+                attributes: Default::default(),
+            })
+        }
+    }
+    fn get_record_fields_in_ctxt(
+        named_schemas: &mut 
::std::collections::HashSet<::apache_avro::schema::Name>,
+        enclosing_namespace: ::apache_avro::schema::NamespaceRef,
+    ) -> 
::std::option::Option<::std::vec::Vec<::apache_avro::schema::RecordField>> {
+        None
+    }
+    fn field_default() -> ::std::option::Option<::serde_json::Value> {
+        ::std::option::Option::None
+    }
+}
diff --git a/avro_derive/tests/ui/avro_rs_373_tag_content_enum.rs 
b/avro_derive/tests/expanded/avro_3709_record_field_attributes.rs
similarity index 78%
copy from avro_derive/tests/ui/avro_rs_373_tag_content_enum.rs
copy to avro_derive/tests/expanded/avro_3709_record_field_attributes.rs
index 2efee54..240d71a 100644
--- a/avro_derive/tests/ui/avro_rs_373_tag_content_enum.rs
+++ b/avro_derive/tests/expanded/avro_3709_record_field_attributes.rs
@@ -18,10 +18,15 @@
 use apache_avro::AvroSchema;
 
 #[derive(AvroSchema)]
-#[serde(tag = "bar", content = "spam")]
-enum Foo {
-    One,
-    Two,
+#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
+struct A {
+    #[serde(alias = "a1", alias = "a2", rename = "a3")]
+    #[avro(doc = "a doc", default = "123")]
+    a: i32,
 }
 
-pub fn main() {}
+#[derive(AvroSchema)]
+enum B {
+    #[serde(rename = "A3")]
+    Item1,
+}
diff --git 
a/avro_derive/tests/expanded/avro_rs_207_rename_all_attribute.expanded.rs 
b/avro_derive/tests/expanded/avro_rs_207_rename_all_attribute.expanded.rs
new file mode 100644
index 0000000..3da7be9
--- /dev/null
+++ b/avro_derive/tests/expanded/avro_rs_207_rename_all_attribute.expanded.rs
@@ -0,0 +1,180 @@
+use apache_avro::AvroSchema;
+#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
+struct A {
+    item: i32,
+    double_item: i32,
+}
+#[automatically_derived]
+impl ::apache_avro::AvroSchemaComponent for A {
+    fn get_schema_in_ctxt(
+        named_schemas: &mut 
::std::collections::HashSet<::apache_avro::schema::Name>,
+        enclosing_namespace: ::apache_avro::schema::NamespaceRef,
+    ) -> ::apache_avro::schema::Schema {
+        let name = ::apache_avro::schema::Name::new_with_enclosing_namespace(
+                "A",
+                enclosing_namespace,
+            )
+            .expect("Unable to parse schema name A");
+        if named_schemas.contains(&name) {
+            ::apache_avro::schema::Schema::Ref {
+                name,
+            }
+        } else {
+            let enclosing_namespace = name.namespace();
+            named_schemas.insert(name.clone());
+            {
+                let mut schema_fields = ::std::vec::Vec::with_capacity(2usize);
+                schema_fields
+                    .push(::apache_avro::schema::RecordField {
+                        name: "ITEM".to_string(),
+                        doc: ::std::option::Option::None,
+                        default: <i32 as 
::apache_avro::AvroSchemaComponent>::field_default(),
+                        aliases: ::std::vec::Vec::new(),
+                        schema: <i32 as 
::apache_avro::AvroSchemaComponent>::get_schema_in_ctxt(
+                            named_schemas,
+                            enclosing_namespace,
+                        ),
+                        custom_attributes: ::std::collections::BTreeMap::new(),
+                    });
+                schema_fields
+                    .push(::apache_avro::schema::RecordField {
+                        name: "DOUBLE_ITEM".to_string(),
+                        doc: ::std::option::Option::None,
+                        default: <i32 as 
::apache_avro::AvroSchemaComponent>::field_default(),
+                        aliases: ::std::vec::Vec::new(),
+                        schema: <i32 as 
::apache_avro::AvroSchemaComponent>::get_schema_in_ctxt(
+                            named_schemas,
+                            enclosing_namespace,
+                        ),
+                        custom_attributes: ::std::collections::BTreeMap::new(),
+                    });
+                let schema_field_set: ::std::collections::HashSet<_> = 
schema_fields
+                    .iter()
+                    .map(|rf| &rf.name)
+                    .collect();
+                match (&schema_fields.len(), &schema_field_set.len()) {
+                    (left_val, right_val) => {
+                        if !(*left_val == *right_val) {
+                            let kind = ::core::panicking::AssertKind::Eq;
+                            ::core::panicking::assert_failed(
+                                kind,
+                                &*left_val,
+                                &*right_val,
+                                ::core::option::Option::Some(
+                                    format_args!(
+                                        "Duplicate field names found: {0:?}", 
schema_fields,
+                                    ),
+                                ),
+                            );
+                        }
+                    }
+                };
+                let name = ::apache_avro::schema::Name::new("A")
+                    .expect(
+                        &::alloc::__export::must_use({
+                            ::alloc::fmt::format(
+                                format_args!(
+                                    "Unable to parse struct name for schema 
{0}", "A",
+                                ),
+                            )
+                        })[..],
+                    );
+                let lookup: ::std::collections::BTreeMap<String, usize> = 
schema_fields
+                    .iter()
+                    .enumerate()
+                    .map(|(position, field)| (field.name.to_owned(), position))
+                    .collect();
+                
::apache_avro::schema::Schema::Record(::apache_avro::schema::RecordSchema {
+                    name,
+                    aliases: ::std::option::Option::None,
+                    doc: ::std::option::Option::None,
+                    fields: schema_fields,
+                    lookup,
+                    attributes: ::std::collections::BTreeMap::new(),
+                })
+            }
+        }
+    }
+    fn get_record_fields_in_ctxt(
+        named_schemas: &mut 
::std::collections::HashSet<::apache_avro::schema::Name>,
+        enclosing_namespace: ::apache_avro::schema::NamespaceRef,
+    ) -> 
::std::option::Option<::std::vec::Vec<::apache_avro::schema::RecordField>> {
+        let mut schema_fields = Vec::with_capacity(2usize);
+        schema_fields
+            .push(::apache_avro::schema::RecordField {
+                name: "ITEM".to_string(),
+                doc: ::std::option::Option::None,
+                default: <i32 as 
::apache_avro::AvroSchemaComponent>::field_default(),
+                aliases: ::std::vec::Vec::new(),
+                schema: <i32 as 
::apache_avro::AvroSchemaComponent>::get_schema_in_ctxt(
+                    named_schemas,
+                    enclosing_namespace,
+                ),
+                custom_attributes: ::std::collections::BTreeMap::new(),
+            });
+        schema_fields
+            .push(::apache_avro::schema::RecordField {
+                name: "DOUBLE_ITEM".to_string(),
+                doc: ::std::option::Option::None,
+                default: <i32 as 
::apache_avro::AvroSchemaComponent>::field_default(),
+                aliases: ::std::vec::Vec::new(),
+                schema: <i32 as 
::apache_avro::AvroSchemaComponent>::get_schema_in_ctxt(
+                    named_schemas,
+                    enclosing_namespace,
+                ),
+                custom_attributes: ::std::collections::BTreeMap::new(),
+            });
+        Some(schema_fields)
+    }
+    fn field_default() -> ::std::option::Option<::serde_json::Value> {
+        ::std::option::Option::None
+    }
+}
+#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
+enum B {
+    Item,
+    DoubleItem,
+}
+#[automatically_derived]
+impl ::apache_avro::AvroSchemaComponent for B {
+    fn get_schema_in_ctxt(
+        named_schemas: &mut 
::std::collections::HashSet<::apache_avro::schema::Name>,
+        enclosing_namespace: ::apache_avro::schema::NamespaceRef,
+    ) -> ::apache_avro::schema::Schema {
+        let name = ::apache_avro::schema::Name::new_with_enclosing_namespace(
+                "B",
+                enclosing_namespace,
+            )
+            .expect("Unable to parse schema name B");
+        if named_schemas.contains(&name) {
+            ::apache_avro::schema::Schema::Ref {
+                name,
+            }
+        } else {
+            let enclosing_namespace = name.namespace();
+            named_schemas.insert(name.clone());
+            
::apache_avro::schema::Schema::Enum(apache_avro::schema::EnumSchema {
+                name,
+                aliases: ::std::option::Option::None,
+                doc: ::std::option::Option::None,
+                symbols: ::alloc::boxed::box_assume_init_into_vec_unsafe(
+                    ::alloc::intrinsics::write_box_via_move(
+                        ::alloc::boxed::Box::new_uninit(),
+                        ["ITEM".to_owned(), "DOUBLE_ITEM".to_owned()],
+                    ),
+                ),
+                default: ::std::option::Option::None,
+                attributes: Default::default(),
+            })
+        }
+    }
+    fn get_record_fields_in_ctxt(
+        named_schemas: &mut 
::std::collections::HashSet<::apache_avro::schema::Name>,
+        enclosing_namespace: ::apache_avro::schema::NamespaceRef,
+    ) -> 
::std::option::Option<::std::vec::Vec<::apache_avro::schema::RecordField>> {
+        None
+    }
+    fn field_default() -> ::std::option::Option<::serde_json::Value> {
+        ::std::option::Option::None
+    }
+}
diff --git a/avro_derive/tests/ui/avro_rs_373_tag_content_enum.rs 
b/avro_derive/tests/expanded/avro_rs_207_rename_all_attribute.rs
similarity index 81%
copy from avro_derive/tests/ui/avro_rs_373_tag_content_enum.rs
copy to avro_derive/tests/expanded/avro_rs_207_rename_all_attribute.rs
index 2efee54..6657f60 100644
--- a/avro_derive/tests/ui/avro_rs_373_tag_content_enum.rs
+++ b/avro_derive/tests/expanded/avro_rs_207_rename_all_attribute.rs
@@ -18,10 +18,15 @@
 use apache_avro::AvroSchema;
 
 #[derive(AvroSchema)]
-#[serde(tag = "bar", content = "spam")]
-enum Foo {
-    One,
-    Two,
+#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
+struct A {
+    item: i32,
+    double_item: i32,
 }
 
-pub fn main() {}
+#[derive(AvroSchema)]
+#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
+enum B {
+    Item,
+    DoubleItem,
+}
diff --git 
a/avro_derive/tests/expanded/avro_rs_207_rename_attr_over_rename_all_attribute.expanded.rs
 
b/avro_derive/tests/expanded/avro_rs_207_rename_attr_over_rename_all_attribute.expanded.rs
new file mode 100644
index 0000000..6568d95
--- /dev/null
+++ 
b/avro_derive/tests/expanded/avro_rs_207_rename_attr_over_rename_all_attribute.expanded.rs
@@ -0,0 +1,133 @@
+use apache_avro::AvroSchema;
+#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
+struct A {
+    item: i32,
+    #[serde(rename = "DoubleItem")]
+    double_item: i32,
+}
+#[automatically_derived]
+impl ::apache_avro::AvroSchemaComponent for A {
+    fn get_schema_in_ctxt(
+        named_schemas: &mut 
::std::collections::HashSet<::apache_avro::schema::Name>,
+        enclosing_namespace: ::apache_avro::schema::NamespaceRef,
+    ) -> ::apache_avro::schema::Schema {
+        let name = ::apache_avro::schema::Name::new_with_enclosing_namespace(
+                "A",
+                enclosing_namespace,
+            )
+            .expect("Unable to parse schema name A");
+        if named_schemas.contains(&name) {
+            ::apache_avro::schema::Schema::Ref {
+                name,
+            }
+        } else {
+            let enclosing_namespace = name.namespace();
+            named_schemas.insert(name.clone());
+            {
+                let mut schema_fields = ::std::vec::Vec::with_capacity(2usize);
+                schema_fields
+                    .push(::apache_avro::schema::RecordField {
+                        name: "ITEM".to_string(),
+                        doc: ::std::option::Option::None,
+                        default: <i32 as 
::apache_avro::AvroSchemaComponent>::field_default(),
+                        aliases: ::std::vec::Vec::new(),
+                        schema: <i32 as 
::apache_avro::AvroSchemaComponent>::get_schema_in_ctxt(
+                            named_schemas,
+                            enclosing_namespace,
+                        ),
+                        custom_attributes: ::std::collections::BTreeMap::new(),
+                    });
+                schema_fields
+                    .push(::apache_avro::schema::RecordField {
+                        name: "DoubleItem".to_string(),
+                        doc: ::std::option::Option::None,
+                        default: <i32 as 
::apache_avro::AvroSchemaComponent>::field_default(),
+                        aliases: ::std::vec::Vec::new(),
+                        schema: <i32 as 
::apache_avro::AvroSchemaComponent>::get_schema_in_ctxt(
+                            named_schemas,
+                            enclosing_namespace,
+                        ),
+                        custom_attributes: ::std::collections::BTreeMap::new(),
+                    });
+                let schema_field_set: ::std::collections::HashSet<_> = 
schema_fields
+                    .iter()
+                    .map(|rf| &rf.name)
+                    .collect();
+                match (&schema_fields.len(), &schema_field_set.len()) {
+                    (left_val, right_val) => {
+                        if !(*left_val == *right_val) {
+                            let kind = ::core::panicking::AssertKind::Eq;
+                            ::core::panicking::assert_failed(
+                                kind,
+                                &*left_val,
+                                &*right_val,
+                                ::core::option::Option::Some(
+                                    format_args!(
+                                        "Duplicate field names found: {0:?}", 
schema_fields,
+                                    ),
+                                ),
+                            );
+                        }
+                    }
+                };
+                let name = ::apache_avro::schema::Name::new("A")
+                    .expect(
+                        &::alloc::__export::must_use({
+                            ::alloc::fmt::format(
+                                format_args!(
+                                    "Unable to parse struct name for schema 
{0}", "A",
+                                ),
+                            )
+                        })[..],
+                    );
+                let lookup: ::std::collections::BTreeMap<String, usize> = 
schema_fields
+                    .iter()
+                    .enumerate()
+                    .map(|(position, field)| (field.name.to_owned(), position))
+                    .collect();
+                
::apache_avro::schema::Schema::Record(::apache_avro::schema::RecordSchema {
+                    name,
+                    aliases: ::std::option::Option::None,
+                    doc: ::std::option::Option::None,
+                    fields: schema_fields,
+                    lookup,
+                    attributes: ::std::collections::BTreeMap::new(),
+                })
+            }
+        }
+    }
+    fn get_record_fields_in_ctxt(
+        named_schemas: &mut 
::std::collections::HashSet<::apache_avro::schema::Name>,
+        enclosing_namespace: ::apache_avro::schema::NamespaceRef,
+    ) -> 
::std::option::Option<::std::vec::Vec<::apache_avro::schema::RecordField>> {
+        let mut schema_fields = Vec::with_capacity(2usize);
+        schema_fields
+            .push(::apache_avro::schema::RecordField {
+                name: "ITEM".to_string(),
+                doc: ::std::option::Option::None,
+                default: <i32 as 
::apache_avro::AvroSchemaComponent>::field_default(),
+                aliases: ::std::vec::Vec::new(),
+                schema: <i32 as 
::apache_avro::AvroSchemaComponent>::get_schema_in_ctxt(
+                    named_schemas,
+                    enclosing_namespace,
+                ),
+                custom_attributes: ::std::collections::BTreeMap::new(),
+            });
+        schema_fields
+            .push(::apache_avro::schema::RecordField {
+                name: "DoubleItem".to_string(),
+                doc: ::std::option::Option::None,
+                default: <i32 as 
::apache_avro::AvroSchemaComponent>::field_default(),
+                aliases: ::std::vec::Vec::new(),
+                schema: <i32 as 
::apache_avro::AvroSchemaComponent>::get_schema_in_ctxt(
+                    named_schemas,
+                    enclosing_namespace,
+                ),
+                custom_attributes: ::std::collections::BTreeMap::new(),
+            });
+        Some(schema_fields)
+    }
+    fn field_default() -> ::std::option::Option<::serde_json::Value> {
+        ::std::option::Option::None
+    }
+}
diff --git a/avro_derive/tests/ui/avro_rs_373_tag_content_enum.rs 
b/avro_derive/tests/expanded/avro_rs_207_rename_attr_over_rename_all_attribute.rs
similarity index 86%
rename from avro_derive/tests/ui/avro_rs_373_tag_content_enum.rs
rename to 
avro_derive/tests/expanded/avro_rs_207_rename_attr_over_rename_all_attribute.rs
index 2efee54..283b223 100644
--- a/avro_derive/tests/ui/avro_rs_373_tag_content_enum.rs
+++ 
b/avro_derive/tests/expanded/avro_rs_207_rename_attr_over_rename_all_attribute.rs
@@ -18,10 +18,9 @@
 use apache_avro::AvroSchema;
 
 #[derive(AvroSchema)]
-#[serde(tag = "bar", content = "spam")]
-enum Foo {
-    One,
-    Two,
+#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
+struct A {
+    item: i32,
+    #[serde(rename = "DoubleItem")]
+    double_item: i32,
 }
-
-pub fn main() {}
diff --git a/avro_derive/tests/expanded/avro_rs_xxx_basic.expanded.rs 
b/avro_derive/tests/expanded/avro_rs_xxx_basic.expanded.rs
new file mode 100644
index 0000000..11d4cc5
--- /dev/null
+++ b/avro_derive/tests/expanded/avro_rs_xxx_basic.expanded.rs
@@ -0,0 +1,131 @@
+use apache_avro::AvroSchema;
+struct A {
+    a: i32,
+    b: String,
+}
+#[automatically_derived]
+impl ::apache_avro::AvroSchemaComponent for A {
+    fn get_schema_in_ctxt(
+        named_schemas: &mut 
::std::collections::HashSet<::apache_avro::schema::Name>,
+        enclosing_namespace: ::apache_avro::schema::NamespaceRef,
+    ) -> ::apache_avro::schema::Schema {
+        let name = ::apache_avro::schema::Name::new_with_enclosing_namespace(
+                "A",
+                enclosing_namespace,
+            )
+            .expect("Unable to parse schema name A");
+        if named_schemas.contains(&name) {
+            ::apache_avro::schema::Schema::Ref {
+                name,
+            }
+        } else {
+            let enclosing_namespace = name.namespace();
+            named_schemas.insert(name.clone());
+            {
+                let mut schema_fields = ::std::vec::Vec::with_capacity(2usize);
+                schema_fields
+                    .push(::apache_avro::schema::RecordField {
+                        name: "a".to_string(),
+                        doc: ::std::option::Option::None,
+                        default: <i32 as 
::apache_avro::AvroSchemaComponent>::field_default(),
+                        aliases: ::std::vec::Vec::new(),
+                        schema: <i32 as 
::apache_avro::AvroSchemaComponent>::get_schema_in_ctxt(
+                            named_schemas,
+                            enclosing_namespace,
+                        ),
+                        custom_attributes: ::std::collections::BTreeMap::new(),
+                    });
+                schema_fields
+                    .push(::apache_avro::schema::RecordField {
+                        name: "b".to_string(),
+                        doc: ::std::option::Option::None,
+                        default: <String as 
::apache_avro::AvroSchemaComponent>::field_default(),
+                        aliases: ::std::vec::Vec::new(),
+                        schema: <String as 
::apache_avro::AvroSchemaComponent>::get_schema_in_ctxt(
+                            named_schemas,
+                            enclosing_namespace,
+                        ),
+                        custom_attributes: ::std::collections::BTreeMap::new(),
+                    });
+                let schema_field_set: ::std::collections::HashSet<_> = 
schema_fields
+                    .iter()
+                    .map(|rf| &rf.name)
+                    .collect();
+                match (&schema_fields.len(), &schema_field_set.len()) {
+                    (left_val, right_val) => {
+                        if !(*left_val == *right_val) {
+                            let kind = ::core::panicking::AssertKind::Eq;
+                            ::core::panicking::assert_failed(
+                                kind,
+                                &*left_val,
+                                &*right_val,
+                                ::core::option::Option::Some(
+                                    format_args!(
+                                        "Duplicate field names found: {0:?}", 
schema_fields,
+                                    ),
+                                ),
+                            );
+                        }
+                    }
+                };
+                let name = ::apache_avro::schema::Name::new("A")
+                    .expect(
+                        &::alloc::__export::must_use({
+                            ::alloc::fmt::format(
+                                format_args!(
+                                    "Unable to parse struct name for schema 
{0}", "A",
+                                ),
+                            )
+                        })[..],
+                    );
+                let lookup: ::std::collections::BTreeMap<String, usize> = 
schema_fields
+                    .iter()
+                    .enumerate()
+                    .map(|(position, field)| (field.name.to_owned(), position))
+                    .collect();
+                
::apache_avro::schema::Schema::Record(::apache_avro::schema::RecordSchema {
+                    name,
+                    aliases: ::std::option::Option::None,
+                    doc: ::std::option::Option::None,
+                    fields: schema_fields,
+                    lookup,
+                    attributes: ::std::collections::BTreeMap::new(),
+                })
+            }
+        }
+    }
+    fn get_record_fields_in_ctxt(
+        named_schemas: &mut 
::std::collections::HashSet<::apache_avro::schema::Name>,
+        enclosing_namespace: ::apache_avro::schema::NamespaceRef,
+    ) -> 
::std::option::Option<::std::vec::Vec<::apache_avro::schema::RecordField>> {
+        let mut schema_fields = Vec::with_capacity(2usize);
+        schema_fields
+            .push(::apache_avro::schema::RecordField {
+                name: "a".to_string(),
+                doc: ::std::option::Option::None,
+                default: <i32 as 
::apache_avro::AvroSchemaComponent>::field_default(),
+                aliases: ::std::vec::Vec::new(),
+                schema: <i32 as 
::apache_avro::AvroSchemaComponent>::get_schema_in_ctxt(
+                    named_schemas,
+                    enclosing_namespace,
+                ),
+                custom_attributes: ::std::collections::BTreeMap::new(),
+            });
+        schema_fields
+            .push(::apache_avro::schema::RecordField {
+                name: "b".to_string(),
+                doc: ::std::option::Option::None,
+                default: <String as 
::apache_avro::AvroSchemaComponent>::field_default(),
+                aliases: ::std::vec::Vec::new(),
+                schema: <String as 
::apache_avro::AvroSchemaComponent>::get_schema_in_ctxt(
+                    named_schemas,
+                    enclosing_namespace,
+                ),
+                custom_attributes: ::std::collections::BTreeMap::new(),
+            });
+        Some(schema_fields)
+    }
+    fn field_default() -> ::std::option::Option<::serde_json::Value> {
+        ::std::option::Option::None
+    }
+}
diff --git a/avro_derive/tests/ui/avro_rs_373_tag_enum.rs 
b/avro_derive/tests/expanded/avro_rs_xxx_basic.rs
similarity index 92%
copy from avro_derive/tests/ui/avro_rs_373_tag_enum.rs
copy to avro_derive/tests/expanded/avro_rs_xxx_basic.rs
index 1c5e46a..05c4fbd 100644
--- a/avro_derive/tests/ui/avro_rs_373_tag_enum.rs
+++ b/avro_derive/tests/expanded/avro_rs_xxx_basic.rs
@@ -18,10 +18,7 @@
 use apache_avro::AvroSchema;
 
 #[derive(AvroSchema)]
-#[serde(tag = "bar")]
-enum Foo {
-    One,
-    Two,
+struct A {
+    a: i32,
+    b: String,
 }
-
-pub fn main() {}
diff --git a/avro_derive/tests/ui/avro_rs_373_tag_enum.rs 
b/avro_derive/tests/expanded/mod.rs
similarity index 74%
rename from avro_derive/tests/ui/avro_rs_373_tag_enum.rs
rename to avro_derive/tests/expanded/mod.rs
index 1c5e46a..5715bfd 100644
--- a/avro_derive/tests/ui/avro_rs_373_tag_enum.rs
+++ b/avro_derive/tests/expanded/mod.rs
@@ -1,4 +1,3 @@
-// Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
 // distributed with this work for additional information
 // regarding copyright ownership.  The ASF licenses this file
@@ -15,13 +14,10 @@
 // specific language governing permissions and limitations
 // under the License.
 
-use apache_avro::AvroSchema;
+#![expect(dead_code, reason = "Only code generation is tested")]
 
-#[derive(AvroSchema)]
-#[serde(tag = "bar")]
-enum Foo {
-    One,
-    Two,
-}
-
-pub fn main() {}
+mod avro_3687_basic_enum_with_default;
+mod avro_3709_record_field_attributes;
+mod avro_rs_207_rename_all_attribute;
+mod avro_rs_207_rename_attr_over_rename_all_attribute;
+mod avro_rs_xxx_basic;
diff --git a/avro_derive/tests/ui/avro_rs_226_skip_serializing.stderr 
b/avro_derive/tests/ui/avro_rs_226_skip_serializing.stderr
index d5316b5..858fbe4 100644
--- a/avro_derive/tests/ui/avro_rs_226_skip_serializing.stderr
+++ b/avro_derive/tests/ui/avro_rs_226_skip_serializing.stderr
@@ -1,4 +1,4 @@
-error: `#[serde(skip_serializing)]` and `#[serde(skip_serializing_if)]` are 
incompatible with `#[avro(default = false)]`
+error: AvroSchema: `#[serde(skip_serializing)]` and 
`#[serde(skip_serializing_if)]` are incompatible with `#[avro(default = false)]`
   --> tests/ui/avro_rs_226_skip_serializing.rs:24:5
    |
 24 | /     #[serde(skip_serializing)]
diff --git a/avro_derive/tests/ui/avro_rs_226_skip_serializing_if.stderr 
b/avro_derive/tests/ui/avro_rs_226_skip_serializing_if.stderr
index f3094d0..1cb8322 100644
--- a/avro_derive/tests/ui/avro_rs_226_skip_serializing_if.stderr
+++ b/avro_derive/tests/ui/avro_rs_226_skip_serializing_if.stderr
@@ -1,4 +1,4 @@
-error: `#[serde(skip_serializing)]` and `#[serde(skip_serializing_if)]` are 
incompatible with `#[avro(default = false)]`
+error: AvroSchema: `#[serde(skip_serializing)]` and 
`#[serde(skip_serializing_if)]` are incompatible with `#[avro(default = false)]`
   --> tests/ui/avro_rs_226_skip_serializing_if.rs:23:5
    |
 23 | /     #[serde(skip_serializing_if = "Option::is_none")]
diff --git a/avro_derive/tests/ui/avro_rs_373_alias.stderr 
b/avro_derive/tests/ui/avro_rs_373_alias.stderr
index 3c741f2..87d2e94 100644
--- a/avro_derive/tests/ui/avro_rs_373_alias.stderr
+++ b/avro_derive/tests/ui/avro_rs_373_alias.stderr
@@ -7,7 +7,7 @@ warning: `#[avro(alias = "..")]` is deprecated
    |
    = help: Use `#[serde(alias = "..")]` instead
 
-error: `#[avro(alias = "..")]` must match `#[serde(alias = "..")]`, it's also 
deprecated. Please use only `#[serde(alias = "..")]`
+error: AvroSchema: `#[avro(alias = "..")]` must match `#[serde(alias = 
"..")]`, it's also deprecated. Please use only `#[serde(alias = "..")]`
   --> tests/ui/avro_rs_373_alias.rs:22:5
    |
 22 | /     #[avro(alias = "c")]
diff --git a/avro_derive/tests/ui/avro_rs_373_field_rename.stderr 
b/avro_derive/tests/ui/avro_rs_373_field_rename.stderr
index 2429447..68147c7 100644
--- a/avro_derive/tests/ui/avro_rs_373_field_rename.stderr
+++ b/avro_derive/tests/ui/avro_rs_373_field_rename.stderr
@@ -7,7 +7,7 @@ warning: `#[avro(rename = "..")]` is deprecated
    |
    = help: Use `#[serde(rename = "..")]` instead
 
-error: `#[avro(rename = "..")]` must match `#[serde(rename = "..")]`, it's 
also deprecated. Please use only `#[serde(rename = "..")]`
+error: AvroSchema: `#[avro(rename = "..")]` must match `#[serde(rename = 
"..")]`, it's also deprecated. Please use only `#[serde(rename = "..")]`
   --> tests/ui/avro_rs_373_field_rename.rs:22:5
    |
 22 | /     #[avro(rename = "c")]
diff --git a/avro_derive/tests/ui/avro_rs_373_flatten.stderr 
b/avro_derive/tests/ui/avro_rs_373_flatten.stderr
index f9f14e1..12c181f 100644
--- a/avro_derive/tests/ui/avro_rs_373_flatten.stderr
+++ b/avro_derive/tests/ui/avro_rs_373_flatten.stderr
@@ -7,7 +7,7 @@ warning: `#[avro(flatten)]` is deprecated
    |
    = help: Use `#[serde(flatten)]` instead
 
-error: `#[avro(flatten)]` requires `#[serde(flatten)]`, it's also deprecated. 
Please use only `#[serde(flatten)]`
+error: AvroSchema: `#[avro(flatten)]` requires `#[serde(flatten)]`, it's also 
deprecated. Please use only `#[serde(flatten)]`
   --> tests/ui/avro_rs_373_flatten.rs:22:5
    |
 22 | /     #[avro(flatten)]
diff --git a/avro_derive/tests/ui/avro_rs_373_name.stderr 
b/avro_derive/tests/ui/avro_rs_373_name.stderr
index 26d6a0a..f6de093 100644
--- a/avro_derive/tests/ui/avro_rs_373_name.stderr
+++ b/avro_derive/tests/ui/avro_rs_373_name.stderr
@@ -10,7 +10,7 @@ warning: `#[avro(name = "...")]` is deprecated.
    |
    = help: Use `#[serde(rename = "...")]` instead.
 
-error: #[avro(name = "..")] must match #[serde(rename = "..")], it's also 
deprecated. Please use only `#[serde(rename = "..")]`
+error: AvroSchema: #[avro(name = "..")] must match #[serde(rename = "..")], 
it's also deprecated. Please use only `#[serde(rename = "..")]`
   --> tests/ui/avro_rs_373_name.rs:21:1
    |
 21 | / #[avro(name = "Something")]
diff --git a/avro_derive/tests/ui/avro_rs_373_remote.stderr 
b/avro_derive/tests/ui/avro_rs_373_remote.stderr
index fe4fd10..8dbb630 100644
--- a/avro_derive/tests/ui/avro_rs_373_remote.stderr
+++ b/avro_derive/tests/ui/avro_rs_373_remote.stderr
@@ -1,4 +1,4 @@
-error: AvroSchema derive does not support the Serde `remote` attribute
+error: AvroSchema: `#[serde(remote = "..")]` is not supported
   --> tests/ui/avro_rs_373_remote.rs:27:1
    |
 27 | / #[serde(remote = "Foo")]
diff --git a/avro_derive/tests/ui/avro_rs_373_rename_all.stderr 
b/avro_derive/tests/ui/avro_rs_373_rename_all.stderr
index 26a8233..4379747 100644
--- a/avro_derive/tests/ui/avro_rs_373_rename_all.stderr
+++ b/avro_derive/tests/ui/avro_rs_373_rename_all.stderr
@@ -10,7 +10,7 @@ warning: `#[avro(rename_all = "..")]` is deprecated
    |
    = help: Use `#[serde(rename_all = "..")]` instead
 
-error: #[avro(rename_all = "..")] must match #[serde(rename_all = "..")], it's 
also deprecated. Please use only `#[serde(rename_all = "..")]`
+error: AvroSchema: #[avro(rename_all = "..")] must match #[serde(rename_all = 
"..")], it's also deprecated. Please use only `#[serde(rename_all = "..")]`
   --> tests/ui/avro_rs_373_rename_all.rs:21:1
    |
 21 | / #[avro(rename_all = "snake_case")]
diff --git a/avro_derive/tests/ui/avro_rs_373_rename_all_fields.stderr 
b/avro_derive/tests/ui/avro_rs_373_rename_all_fields.stderr
deleted file mode 100644
index 7a5a531..0000000
--- a/avro_derive/tests/ui/avro_rs_373_rename_all_fields.stderr
+++ /dev/null
@@ -1,5 +0,0 @@
-error: AvroSchema: derive does not work for enums with non unit structs
-  --> tests/ui/avro_rs_373_rename_all_fields.rs:22:6
-   |
-22 | enum Foo {
-   |      ^^^
diff --git a/avro_derive/tests/ui/avro_rs_373_skip.stderr 
b/avro_derive/tests/ui/avro_rs_373_skip.stderr
index 1f3cfb3..cc5707c 100644
--- a/avro_derive/tests/ui/avro_rs_373_skip.stderr
+++ b/avro_derive/tests/ui/avro_rs_373_skip.stderr
@@ -7,7 +7,7 @@ warning: `#[avro(skip)]` is deprecated
    |
    = help: Use `#[serde(skip)]` instead
 
-error: `#[avro(skip)]` requires `#[serde(skip)]`, it's also deprecated. Please 
use only `#[serde(skip)]`
+error: AvroSchema: `#[avro(skip)]` requires `#[serde(skip)]`, it's also 
deprecated. Please use only `#[serde(skip)]`
   --> tests/ui/avro_rs_373_skip.rs:22:5
    |
 22 | /     #[avro(skip)]
diff --git a/avro_derive/tests/ui/avro_rs_373_tag_content_enum.stderr 
b/avro_derive/tests/ui/avro_rs_373_tag_content_enum.stderr
deleted file mode 100644
index f3850b6..0000000
--- a/avro_derive/tests/ui/avro_rs_373_tag_content_enum.stderr
+++ /dev/null
@@ -1,9 +0,0 @@
-error: AvroSchema derive does not support changing the tagging Serde generates 
(`tag`, `content`, `untagged`, `variant_identifier`, `field_identifier`)
-  --> tests/ui/avro_rs_373_tag_content_enum.rs:21:1
-   |
-21 | / #[serde(tag = "bar", content = "spam")]
-22 | | enum Foo {
-23 | |     One,
-24 | |     Two,
-25 | | }
-   | |_^
diff --git a/avro_derive/tests/ui/avro_rs_373_tag_enum.stderr 
b/avro_derive/tests/ui/avro_rs_373_tag_enum.stderr
deleted file mode 100644
index 3c4bb50..0000000
--- a/avro_derive/tests/ui/avro_rs_373_tag_enum.stderr
+++ /dev/null
@@ -1,9 +0,0 @@
-error: AvroSchema derive does not support changing the tagging Serde generates 
(`tag`, `content`, `untagged`, `variant_identifier`, `field_identifier`)
-  --> tests/ui/avro_rs_373_tag_enum.rs:21:1
-   |
-21 | / #[serde(tag = "bar")]
-22 | | enum Foo {
-23 | |     One,
-24 | |     Two,
-25 | | }
-   | |_^
diff --git a/avro_derive/tests/ui/avro_rs_373_tag_struct.stderr 
b/avro_derive/tests/ui/avro_rs_373_tag_struct.stderr
index 5c34abb..9f359c4 100644
--- a/avro_derive/tests/ui/avro_rs_373_tag_struct.stderr
+++ b/avro_derive/tests/ui/avro_rs_373_tag_struct.stderr
@@ -1,4 +1,4 @@
-error: AvroSchema derive does not support changing the tagging Serde generates 
(`tag`, `content`, `untagged`, `variant_identifier`, `field_identifier`)
+error: AvroSchema: `#[avro(repr = "..")]`, `#[serde(tag = "..")]`, 
`#[serde(content = "..")]`, and `#[serde(untagged)]` are only supported on enums
   --> tests/ui/avro_rs_373_tag_struct.rs:21:1
    |
 21 | / #[serde(tag = "bar")]
diff --git a/avro_derive/tests/ui/avro_rs_373_untagged_enum.stderr 
b/avro_derive/tests/ui/avro_rs_373_untagged_enum.stderr
index b3f7e62..fd0b34f 100644
--- a/avro_derive/tests/ui/avro_rs_373_untagged_enum.stderr
+++ b/avro_derive/tests/ui/avro_rs_373_untagged_enum.stderr
@@ -1,9 +1,5 @@
-error: AvroSchema derive does not support changing the tagging Serde generates 
(`tag`, `content`, `untagged`, `variant_identifier`, `field_identifier`)
-  --> tests/ui/avro_rs_373_untagged_enum.rs:21:1
+error: More than one variant maps to Schema::Null, this is not supported for 
bare unions
+  --> tests/ui/avro_rs_373_untagged_enum.rs:22:6
    |
-21 | / #[serde(untagged)]
-22 | | enum Foo {
-23 | |     One,
-24 | |     Two,
-25 | | }
-   | |_^
+22 | enum Foo {
+   |      ^^^
diff --git a/avro_derive/tests/ui/avro_rs_373_variant_rename.stderr 
b/avro_derive/tests/ui/avro_rs_373_variant_rename.stderr
index 4774685..46d055e 100644
--- a/avro_derive/tests/ui/avro_rs_373_variant_rename.stderr
+++ b/avro_derive/tests/ui/avro_rs_373_variant_rename.stderr
@@ -7,7 +7,7 @@ warning: `#[avro(rename = "..")]` is deprecated
    |
    = help: Use `#[serde(rename = "..")]` instead
 
-error: `#[avro(rename = "..")]` must match `#[serde(rename = "..")]`, it's 
also deprecated. Please use only `#[serde(rename = "..")]`
+error: AvroSchema: `#[avro(rename = "..")]` must match `#[serde(rename = 
"..")]`, it's also deprecated. Please use only `#[serde(rename = "..")]`
   --> tests/ui/avro_rs_373_variant_rename.rs:23:5
    |
 23 | /     #[avro(rename = "Scam")]
diff --git a/avro_derive/tests/ui/avro_rs_397_with_word_without_serde.stderr 
b/avro_derive/tests/ui/avro_rs_397_with_word_without_serde.stderr
index febd45e..b72e923 100644
--- a/avro_derive/tests/ui/avro_rs_397_with_word_without_serde.stderr
+++ b/avro_derive/tests/ui/avro_rs_397_with_word_without_serde.stderr
@@ -1,4 +1,4 @@
-error: `#[avro(with)]` requires `#[serde(with = "some_module")]` or provide a 
function to call `#[avro(with = some_fn)]`
+error: AvroSchema: `#[avro(with)]` requires `#[serde(with = "some_module")]` 
or provide a function to call `#[avro(with = some_fn)]`
   --> tests/ui/avro_rs_397_with_word_without_serde.rs:22:5
    |
 22 | /     #[avro(with)]

Reply via email to