mod attrs;
mod codegen;
mod dependency;
mod utils;
mod validation;
use proc_macro::TokenStream;
use quote::quote;
use syn::{parse_macro_input, FnArg, ItemFn};
pub fn component_macro(attr: TokenStream, item: TokenStream) -> TokenStream {
let attrs = match attrs::parse_component_attrs(attr.into()) {
Ok(attrs) => attrs,
Err(e) => return e.to_compile_error().into(),
};
let func = parse_macro_input!(item as ItemFn);
if let Err(e) = validation::validate_function_signature(&func) {
return e.to_compile_error().into();
}
let dependencies = dependency::analyze_dependencies(&func);
let plugin_impl = codegen::generate_plugin_impl(&attrs, &func, &dependencies);
let inventory_submit = codegen::generate_inventory_submit(&attrs, &func);
let mut clean_func = func.clone();
for param in &mut clean_func.sig.inputs {
if let FnArg::Typed(pat_type) = param {
pat_type
.attrs
.retain(|attr| !attr.path().is_ident("inject"));
}
}
let output = quote! {
#plugin_impl
#inventory_submit
#clean_func
};
output.into()
}