#![allow(unused)]
extern crate proc_macro;
use proc_macro::TokenStream;
use proc_macro2::Span;
use quote::ToTokens;
use syn::{parse_macro_input, Attribute, DeriveInput, Expr, ItemFn, ItemStruct, LitStr};
mod contract;
mod event;
mod revert;
mod selector;
mod storage;
mod utils;
#[proc_macro]
pub fn revert(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as LitStr);
revert::parse(input)
}
#[proc_macro]
pub fn assert(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as revert::AssertInput);
revert::parse_assert(input)
}
#[proc_macro_derive(Storage)]
pub fn storage_derive(input: TokenStream) -> TokenStream {
contract::ContractStorage::parse(input)
}
#[proc_macro_derive(Event, attributes(indexed, anonymous))]
pub fn event(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
event::parse(input)
}
#[proc_macro_attribute]
pub fn storage(attr: TokenStream, input: TokenStream) -> TokenStream {
let ty = storage::StorageType::from(attr);
let input = parse_macro_input!(input as ItemStruct);
storage::Storage::parse(ty, input)
}
#[proc_macro_attribute]
pub fn transient_storage(attr: TokenStream, input: TokenStream) -> TokenStream {
let ty = storage::StorageType::from(attr);
let input = parse_macro_input!(input as ItemStruct);
storage::Storage::parse_transient(ty, input)
}
#[proc_macro_attribute]
pub fn external(_args: TokenStream, input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as ItemFn);
selector::external(input)
}