use darling::{FromDeriveInput, FromMeta};
use proc_macro::TokenStream;
use syn::{parse_macro_input, AttributeArgs, DeriveInput, Item};
mod approval;
mod migrate;
mod owner;
mod pause;
mod rbac;
mod rename;
mod standard;
mod upgrade;
fn default_crate_name() -> syn::Path {
syn::parse_str("::near_contract_tools").unwrap()
}
fn default_macros() -> syn::Path {
syn::parse_str("::near_contract_tools").unwrap()
}
fn default_near_sdk() -> syn::Path {
syn::parse_str("::near_sdk").unwrap()
}
fn default_serde() -> syn::Path {
syn::parse_str("::serde").unwrap()
}
fn make_derive<T>(
input: TokenStream,
expand: fn(T) -> Result<proc_macro2::TokenStream, darling::Error>,
) -> TokenStream
where
T: FromDeriveInput,
{
let input = parse_macro_input!(input as DeriveInput);
FromDeriveInput::from_derive_input(&input)
.and_then(expand)
.map(Into::into)
.unwrap_or_else(|e| e.write_errors().into())
}
#[proc_macro_derive(Nep297, attributes(nep297))]
pub fn derive_nep297(input: TokenStream) -> TokenStream {
make_derive(input, standard::nep297::expand)
}
#[proc_macro_derive(Owner, attributes(owner))]
pub fn derive_owner(input: TokenStream) -> TokenStream {
make_derive(input, owner::expand)
}
#[proc_macro_derive(Pause, attributes(pause))]
pub fn derive_pause(input: TokenStream) -> TokenStream {
make_derive(input, pause::expand)
}
#[proc_macro_derive(Rbac, attributes(rbac))]
pub fn derive_rbac(input: TokenStream) -> TokenStream {
make_derive(input, rbac::expand)
}
#[proc_macro_derive(Nep141, attributes(nep141))]
pub fn derive_nep141(input: TokenStream) -> TokenStream {
make_derive(input, standard::nep141::expand)
}
#[proc_macro_derive(Nep148, attributes(nep148))]
pub fn derive_nep148(input: TokenStream) -> TokenStream {
make_derive(input, standard::nep148::expand)
}
#[proc_macro_derive(FungibleToken, attributes(fungible_token))]
pub fn derive_fungible_token(input: TokenStream) -> TokenStream {
make_derive(input, standard::fungible_token::expand)
}
#[proc_macro_derive(Migrate, attributes(migrate))]
pub fn derive_migrate(input: TokenStream) -> TokenStream {
make_derive(input, migrate::expand)
}
#[proc_macro_derive(SimpleMultisig, attributes(simple_multisig))]
pub fn derive_simple_multisig(input: TokenStream) -> TokenStream {
make_derive(input, approval::simple_multisig::expand)
}
#[proc_macro_attribute]
pub fn event(attr: TokenStream, item: TokenStream) -> TokenStream {
let attr = parse_macro_input!(attr as AttributeArgs);
let item = parse_macro_input!(item as Item);
standard::event::EventAttributeMeta::from_list(&attr)
.and_then(|meta| standard::event::event_attribute(meta, item))
.map(Into::into)
.unwrap_or_else(|e| e.write_errors().into())
}
#[proc_macro_derive(Upgrade, attributes(upgrade))]
pub fn derive_upgrade(input: TokenStream) -> TokenStream {
make_derive(input, upgrade::expand)
}