You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@avro.apache.org by mg...@apache.org on 2023/02/08 11:42:59 UTC
[avro] 04/04: AVRO-3709: [Rust] Add support for field aliases in avro_derive
This is an automated email from the ASF dual-hosted git repository.
mgrigorov pushed a commit to branch avro-3709-add-aliases-to-record-fields
in repository https://gitbox.apache.org/repos/asf/avro.git
commit fc39fae11e72eb3be7627822c09a5914299fdb1d
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
AuthorDate: Wed Feb 8 13:41:35 2023 +0200
AVRO-3709: [Rust] Add support for field aliases in avro_derive
Signed-off-by: Martin Tzvetanov Grigorov <mg...@apache.org>
---
lang/rust/avro_derive/src/lib.rs | 33 ++++++++++++++++++++++++++++-----
1 file changed, 28 insertions(+), 5 deletions(-)
diff --git a/lang/rust/avro_derive/src/lib.rs b/lang/rust/avro_derive/src/lib.rs
index 5f8c0bc1c..369bcfdb6 100644
--- a/lang/rust/avro_derive/src/lib.rs
+++ b/lang/rust/avro_derive/src/lib.rs
@@ -30,8 +30,8 @@ struct FieldOptions {
doc: Option<String>,
#[darling(default)]
default: Option<String>,
- // #[darling(default)]
- // aliases: Option<Vec<String>>,
+ #[darling(multiple)]
+ alias: Vec<String>,
#[darling(default)]
rename: Option<String>,
#[darling(default)]
@@ -150,7 +150,7 @@ fn get_data_struct_schema_def(
}
None => quote! { None },
};
- let aliases = quote! { None };
+ let aliases = preserve_vec(field_attrs.alias);
let schema_expr = type_to_schema_expr(&field.ty)?;
let position = index;
record_field_exprs.push(quote! {
@@ -459,8 +459,9 @@ mod tests {
match syn::parse2::<DeriveInput>(test_struct) {
Ok(mut input) => {
- assert!(derive_avro_schema(&mut input).is_ok());
- assert!(derive_avro_schema(&mut input)
+ let schema_token_stream = derive_avro_schema(&mut input);
+ assert!(&schema_token_stream.is_ok());
+ assert!(schema_token_stream
.unwrap()
.to_string()
.contains("namespace.testing"))
@@ -496,4 +497,26 @@ mod tests {
assert_eq!(type_path_schema_expr(&syn::parse2::<TypePath>(quote!{Vec<T>}).unwrap()).to_string(), quote!{<Vec<T> as apache_avro::schema::derive::AvroSchemaComponent>::get_schema_in_ctxt(named_schemas, enclosing_namespace)}.to_string());
assert_eq!(type_path_schema_expr(&syn::parse2::<TypePath>(quote!{AnyType}).unwrap()).to_string(), quote!{<AnyType as apache_avro::schema::derive::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 {
+ #[avro(alias = "a1", alias = "a2", doc = "a doc", default = "123", rename = "a3")]
+ a: i32
+ }
+ };
+
+ match syn::parse2::<DeriveInput>(test_struct) {
+ Ok(mut input) => {
+ let schema_res = derive_avro_schema(&mut input);
+ let expected_token_stream = r#"let schema_fields = vec ! [apache_avro :: schema :: RecordField { name : "a3" . to_string () , doc : Some ("a doc" . into ()) , default : Some (serde_json :: from_str ("123") . expect (format ! ("Invalid JSON: {:?}" , "123") . as_str ())) , aliases : Some (vec ! ["a1" . into () , "a2" . into ()]) , schema : apache_avro :: schema :: Schema :: Int , order : apache_avro :: schema :: RecordFieldOrder :: Ascending , position : 0usize , custom_att [...]
+ 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:?}"
+ ),
+ };
+ }
}