use proc_macro::TokenStream;
use syn::{ItemFn, ItemStruct};
mod function;
use function::make_function_chainable;
mod r#struct;
use r#struct::make_struct_chainable;
mod collection;
use collection::{make_chain_insert, make_chain_push};
#[proc_macro_attribute]
pub fn chainable(_attr: TokenStream, item: TokenStream) -> TokenStream {
if syn::parse::<ItemFn>(item.clone()).is_ok() {
return make_function_chainable(_attr, item);
}
if syn::parse::<ItemStruct>(item.clone()).is_ok() {
return make_struct_chainable(_attr, item);
}
syn::Error::new_spanned(
proc_macro2::TokenStream::from(item),
"chainable attribute can only be applied to functions or implementations",
)
.to_compile_error()
.into()
}
#[proc_macro_attribute]
pub fn chain_insert(attr: TokenStream, item: TokenStream) -> TokenStream {
make_chain_insert(attr, item)
}
#[proc_macro_attribute]
pub fn chain_push(attr: TokenStream, item: TokenStream) -> TokenStream {
make_chain_push(attr, item)
}