mod common;
mod composite;
mod enum_gen;
mod explicit_test_case;
mod hegel_main;
mod hegel_test;
mod rewrite_draws;
mod standalone_function;
mod stateful;
mod struct_gen;
mod utils;
use proc_macro::TokenStream;
use syn::{Data, DeriveInput, ItemFn, ItemImpl, parse_macro_input};
#[proc_macro_derive(DefaultGenerator)]
pub fn derive_generator(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
match &input.data {
Data::Struct(data) => struct_gen::derive_struct_generator(&input, data),
Data::Enum(data) => enum_gen::derive_enum_generator(&input, data),
Data::Union(_) => syn::Error::new_spanned(&input, "Generator cannot be derived for unions")
.to_compile_error()
.into(),
}
}
#[proc_macro_attribute]
pub fn test(attr: TokenStream, item: TokenStream) -> TokenStream {
hegel_test::expand_test(attr.into(), item.into()).into()
}
#[proc_macro_attribute]
pub fn main(attr: TokenStream, item: TokenStream) -> TokenStream {
hegel_main::expand_main(attr.into(), item.into()).into()
}
#[proc_macro_attribute]
pub fn standalone_function(attr: TokenStream, item: TokenStream) -> TokenStream {
standalone_function::expand_standalone_function(attr.into(), item.into()).into()
}
#[proc_macro_attribute]
pub fn composite(_attr: TokenStream, item: TokenStream) -> TokenStream {
let input = parse_macro_input!(item as ItemFn);
composite::expand_composite(input).into()
}
#[proc_macro_attribute]
pub fn explicit_test_case(attr: TokenStream, item: TokenStream) -> TokenStream {
explicit_test_case::expand_explicit_test_case(attr.into(), item.into()).into()
}
#[proc_macro_attribute]
pub fn state_machine(_attr: TokenStream, item: TokenStream) -> TokenStream {
let block = parse_macro_input!(item as ItemImpl);
stateful::expand_state_machine(block).into()
}
#[proc_macro]
pub fn rewrite_draws(input: TokenStream) -> TokenStream {
rewrite_draws::expand_rewrite_draws(input.into()).into()
}