#![allow(missing_docs)]
#[cfg(feature = "native")]
mod cli_parser;
mod common;
mod default_runtime;
mod dispatch;
mod make_constants;
mod manifest;
mod module_call_json_schema;
mod module_info;
mod new_types;
mod offchain;
#[cfg(feature = "native")]
mod rpc;
#[cfg(feature = "native")]
use cli_parser::{derive_cli_wallet_arg, CliParserMacro};
use default_runtime::DefaultRuntimeMacro;
use dispatch::dispatch_call::DispatchCallMacro;
use dispatch::genesis::GenesisMacro;
use dispatch::message_codec::MessageCodec;
use make_constants::{make_const, PartialItemConst};
use module_call_json_schema::derive_module_call_json_schema;
use new_types::address_type_helper;
use offchain::offchain_generator;
use proc_macro::TokenStream;
#[cfg(feature = "native")]
use rpc::ExposeRpcMacro;
use syn::{parse_macro_input, DeriveInput, ItemFn};
#[proc_macro_derive(ModuleInfo, attributes(state, module, address, gas))]
pub fn module_info(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input);
handle_macro_error(module_info::derive_module_info(input))
}
#[proc_macro_derive(DefaultRuntime)]
pub fn default_runtime(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input);
let default_config_macro = DefaultRuntimeMacro::new("DefaultRuntime");
handle_macro_error(default_config_macro.derive_default_runtime(input))
}
#[proc_macro_derive(Genesis)]
pub fn genesis(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input);
let genesis_macro = GenesisMacro::new("Genesis");
handle_macro_error(genesis_macro.derive_genesis(input))
}
#[proc_macro_derive(DispatchCall, attributes(serialization))]
pub fn dispatch_call(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input);
let call_macro = DispatchCallMacro::new("Call");
handle_macro_error(call_macro.derive_dispatch_call(input))
}
#[proc_macro_derive(ModuleCallJsonSchema)]
pub fn module_call_json_schema(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input);
handle_macro_error(derive_module_call_json_schema(input))
}
#[proc_macro_derive(MessageCodec)]
pub fn codec(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input);
let codec_macro = MessageCodec::new("MessageCodec");
handle_macro_error(codec_macro.derive_message_codec(input))
}
#[proc_macro_attribute]
pub fn config_constant(_attr: TokenStream, item: TokenStream) -> TokenStream {
let input = parse_macro_input!(item as PartialItemConst);
handle_macro_error(
make_const(&input.ident, &input.ty, input.vis, &input.attrs).map(|ok| ok.into()),
)
}
#[proc_macro_attribute]
#[cfg(feature = "native")]
pub fn rpc_gen(attr: TokenStream, item: TokenStream) -> TokenStream {
let attr: Vec<syn::NestedMeta> = parse_macro_input!(attr);
let input = parse_macro_input!(item as syn::ItemImpl);
handle_macro_error(rpc::rpc_gen(attr, input).map(|ok| ok.into()))
}
fn handle_macro_error(result: Result<proc_macro::TokenStream, syn::Error>) -> TokenStream {
match result {
Ok(ok) => ok,
Err(err) => err.to_compile_error().into(),
}
}
#[cfg(feature = "native")]
#[proc_macro_attribute]
pub fn expose_rpc(_attr: TokenStream, input: TokenStream) -> TokenStream {
let original = input.clone();
let input = parse_macro_input!(input);
let expose_macro = ExposeRpcMacro::new("Expose");
handle_macro_error(expose_macro.generate_rpc(original, input))
}
#[cfg(feature = "native")]
#[proc_macro_derive(CliWallet, attributes(cli_skip))]
pub fn cli_parser(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input);
let cli_parser = CliParserMacro::new("Cmd");
handle_macro_error(cli_parser.cli_macro(input))
}
#[cfg(feature = "native")]
#[proc_macro_derive(CliWalletArg)]
pub fn custom_enum_clap(input: TokenStream) -> TokenStream {
let input: syn::DeriveInput = parse_macro_input!(input);
handle_macro_error(derive_cli_wallet_arg(input))
}
#[proc_macro_attribute]
pub fn address_type(_attr: TokenStream, item: TokenStream) -> TokenStream {
let input = parse_macro_input!(item as DeriveInput);
handle_macro_error(address_type_helper(input))
}
#[proc_macro_attribute]
pub fn offchain(_attr: TokenStream, item: TokenStream) -> TokenStream {
let input = parse_macro_input!(item as ItemFn);
handle_macro_error(offchain_generator(input))
}