method_chaining 0.1.1

A Rust procedural macro that automatically makes functions and structs chainable.
Documentation
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)
}