use proc_macro::TokenStream;
use syn::{parse_macro_input, DeriveInput, Item, ItemFn, LitStr};
mod codegen;
mod expand;
mod parse;
#[proc_macro_attribute]
pub fn neo_contract(_args: TokenStream, input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as Item);
match expand::neo_contract_item(input) {
Ok(tokens) => tokens.into(),
Err(err) => err.to_compile_error().into(),
}
}
#[proc_macro_attribute]
pub fn neo_method(_args: TokenStream, input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as ItemFn);
expand::neo_method(input).into()
}
#[proc_macro_attribute]
pub fn neo_storage(_args: TokenStream, input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
expand::neo_storage(input).into()
}
#[proc_macro_attribute]
pub fn neo_entry(_args: TokenStream, input: TokenStream) -> TokenStream {
let input_fn = parse_macro_input!(input as ItemFn);
expand::neo_entry(input_fn).into()
}
#[proc_macro_attribute]
pub fn neo_test(_args: TokenStream, input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as ItemFn);
expand::neo_test(input).into()
}
#[proc_macro_attribute]
pub fn neo_bench(_args: TokenStream, input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as ItemFn);
expand::neo_bench(input).into()
}
#[proc_macro_attribute]
pub fn neo_event(_args: TokenStream, input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
match expand::neo_event(input) {
Ok(tokens) => tokens.into(),
Err(err) => err.to_compile_error().into(),
}
}
#[proc_macro]
pub fn neo_manifest_overlay(input: TokenStream) -> TokenStream {
let literal = parse_macro_input!(input as LitStr);
expand::neo_manifest_overlay(&literal).into()
}
#[proc_macro]
pub fn neo_permission(input: TokenStream) -> TokenStream {
let args = parse_macro_input!(input as parse::PermissionArgs);
let contract = args.contract.value();
let methods: Vec<String> = args.methods.into_iter().map(|lit| lit.value()).collect();
expand::neo_permission(contract, methods).into()
}
#[proc_macro]
pub fn neo_trusts(input: TokenStream) -> TokenStream {
let list = parse_macro_input!(input as parse::StringList);
let trusts: Vec<String> = list.items.into_iter().map(|lit| lit.value()).collect();
expand::neo_trusts(trusts).into()
}
#[proc_macro]
pub fn neo_safe_methods(input: TokenStream) -> TokenStream {
let list = parse_macro_input!(input as parse::StringList);
let methods: Vec<String> = list.items.into_iter().map(|lit| lit.value()).collect();
expand::neo_safe_methods(methods).into()
}
#[proc_macro_attribute]
pub fn neo_safe(_args: TokenStream, input: TokenStream) -> TokenStream {
let func = parse_macro_input!(input as ItemFn);
expand::neo_safe(func).into()
}
#[proc_macro]
pub fn neo_supported_standards(input: TokenStream) -> TokenStream {
let list = parse_macro_input!(input as parse::StringList);
let standards: Vec<String> = list.items.into_iter().map(|lit| lit.value()).collect();
expand::neo_supported_standards(standards).into()
}
#[proc_macro_attribute]
pub fn neo_doc(_args: TokenStream, input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
expand::neo_doc(input).into()
}
#[proc_macro_attribute]
pub fn neo_config(_args: TokenStream, input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
expand::neo_config(input).into()
}
#[proc_macro_attribute]
pub fn neo_validate(_args: TokenStream, input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as ItemFn);
expand::neo_validate(input).into()
}
#[proc_macro_attribute]
pub fn neo_serialize(_args: TokenStream, input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
expand::neo_serialize(input).into()
}
#[proc_macro_attribute]
pub fn neo_error(_args: TokenStream, input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
expand::neo_error(input).into()
}