#![cfg_attr(nightly, feature(proc_macro_diagnostic))]
mod attributes;
mod case;
mod enums;
mod fields;
mod implementation;
mod structs;
mod utils;
use syn::{DeriveInput, parse_macro_input, spanned::Spanned};
use crate::attributes::NamedTypeOptions;
use crate::implementation::Implementation;
use crate::utils::to_compile_errors;
#[proc_macro_derive(AvroSchema, attributes(avro, serde))]
pub fn proc_macro_derive_avro_schema(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
let input = parse_macro_input!(input as DeriveInput);
derive_avro_schema(input)
.map(Implementation::into_token_stream)
.unwrap_or_else(to_compile_errors)
.into()
}
fn derive_avro_schema(input: DeriveInput) -> Result<Implementation, Vec<syn::Error>> {
let input_span = input.span();
match input.data {
syn::Data::Struct(data_struct) => {
let named_type_options = NamedTypeOptions::new(&input.ident, &input.attrs, input_span)?;
structs::to_implementation(
input_span,
input.ident,
input.generics,
named_type_options,
data_struct,
)
}
syn::Data::Enum(data_enum) => {
let named_type_options = NamedTypeOptions::new(&input.ident, &input.attrs, input_span)?;
enums::to_implementation(
input_span,
input.ident,
input.generics,
named_type_options,
data_enum,
)
}
syn::Data::Union(_) => Err(vec![syn::Error::new(
input_span,
"AvroSchema: derive only works for structs and simple enums",
)]),
}
}