mod directive;
mod emit;
mod validation;
use proc_macro::TokenStream;
use quote::quote;
use syn::{Item, parse_macro_input};
use directive::Directives;
#[proc_macro_attribute]
pub fn config(attr: TokenStream, item: TokenStream) -> TokenStream {
let directives = parse_macro_input!(attr as Directives);
let mut item = parse_macro_input!(item as Item);
let mut errors = validation::validate(&directives.items, &item);
errors.extend(emit::rewrite_field_attrs(&mut item));
let diagnostic_attrs = emit::emit_diagnostic_attrs(&directives.items);
if errors.is_empty() {
quote! {
#(#diagnostic_attrs)*
#item
}
.into()
} else {
let error_tokens: Vec<_> = errors.iter().map(|e| e.to_compile_error()).collect();
quote! {
#(#error_tokens)*
#(#diagnostic_attrs)*
#item
}
.into()
}
}