1#![allow(unused)]
4extern crate proc_macro;
5
6use proc_macro::TokenStream;
7use proc_macro2::Span;
8use quote::ToTokens;
9use syn::{parse_macro_input, Attribute, DeriveInput, Expr, ItemFn, ItemStruct, LitStr};
10
11mod contract;
12mod event;
13mod revert;
14mod selector;
15mod storage;
16mod utils;
17
18#[proc_macro]
22pub fn revert(input: TokenStream) -> TokenStream {
23    let input = parse_macro_input!(input as LitStr);
24    revert::parse(input)
25}
26
27#[proc_macro]
32pub fn assert(input: TokenStream) -> TokenStream {
33    let input = parse_macro_input!(input as revert::AssertInput);
34    revert::parse_assert(input)
35}
36
37#[proc_macro_derive(Storage)]
39pub fn storage_derive(input: TokenStream) -> TokenStream {
40    contract::ContractStorage::parse(input)
41}
42
43#[proc_macro_derive(Event, attributes(indexed, anonymous))]
68pub fn event(input: TokenStream) -> TokenStream {
69    let input = parse_macro_input!(input as DeriveInput);
70    event::parse(input)
71}
72
73#[proc_macro_attribute]
85pub fn storage(attr: TokenStream, input: TokenStream) -> TokenStream {
86    let ty = storage::StorageType::from(attr);
87    let input = parse_macro_input!(input as ItemStruct);
88    storage::Storage::parse(ty, input)
89}
90
91#[proc_macro_attribute]
103pub fn transient_storage(attr: TokenStream, input: TokenStream) -> TokenStream {
104    let ty = storage::StorageType::from(attr);
105    let input = parse_macro_input!(input as ItemStruct);
106    storage::Storage::parse_transient(ty, input)
107}
108
109#[proc_macro_attribute]
111pub fn external(_args: TokenStream, input: TokenStream) -> TokenStream {
112    let input = parse_macro_input!(input as ItemFn);
113    selector::external(input)
114}