in avro_derive/src/lib.rs [62:112]
fn derive_avro_schema(input: &mut DeriveInput) -> Result<TokenStream, Vec<syn::Error>> {
let named_type_options =
NamedTypeOptions::from_attributes(&input.attrs[..]).map_err(darling_to_syn)?;
let full_schema_name = vec![named_type_options.namespace, Some(input.ident.to_string())]
.into_iter()
.flatten()
.collect::<Vec<String>>()
.join(".");
let schema_def = match &input.data {
syn::Data::Struct(s) => get_data_struct_schema_def(
&full_schema_name,
named_type_options
.doc
.or_else(|| extract_outer_doc(&input.attrs)),
named_type_options.alias,
s,
input.ident.span(),
)?,
syn::Data::Enum(e) => get_data_enum_schema_def(
&full_schema_name,
named_type_options
.doc
.or_else(|| extract_outer_doc(&input.attrs)),
named_type_options.alias,
e,
input.ident.span(),
)?,
_ => {
return Err(vec![syn::Error::new(
input.ident.span(),
"AvroSchema derive only works for structs and simple enums ",
)])
}
};
let ident = &input.ident;
let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl();
Ok(quote! {
impl #impl_generics apache_avro::schema::derive::AvroSchemaComponent for #ident #ty_generics #where_clause {
fn get_schema_in_ctxt(named_schemas: &mut std::collections::HashMap<apache_avro::schema::Name, apache_avro::schema::Schema>, enclosing_namespace: &Option<String>) -> apache_avro::schema::Schema {
let name = apache_avro::schema::Name::new(#full_schema_name).expect(&format!("Unable to parse schema name {}", #full_schema_name)[..]).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()});
#schema_def
}
}
}
})
}