Skip to main content

hegel_macros/
lib.rs

1mod composite;
2mod enum_gen;
3mod hegel_test;
4mod stateful;
5mod struct_gen;
6mod utils;
7
8use proc_macro::TokenStream;
9use syn::{Data, DeriveInput, ItemFn, ItemImpl, parse_macro_input};
10
11// documentation for hegel-macros lives in hegel's lib.rs so that we get proper intra-doc links.
12
13#[proc_macro_derive(DefaultGenerator)]
14pub fn derive_generator(input: TokenStream) -> TokenStream {
15    let input = parse_macro_input!(input as DeriveInput);
16
17    match &input.data {
18        Data::Struct(data) => struct_gen::derive_struct_generator(&input, data),
19        Data::Enum(data) => enum_gen::derive_enum_generator(&input, data),
20        Data::Union(_) => syn::Error::new_spanned(&input, "Generator cannot be derived for unions")
21            .to_compile_error()
22            .into(),
23    }
24}
25
26#[proc_macro_attribute]
27pub fn test(attr: TokenStream, item: TokenStream) -> TokenStream {
28    hegel_test::expand_test(attr.into(), item.into()).into()
29}
30
31#[proc_macro_attribute]
32pub fn composite(_attr: TokenStream, item: TokenStream) -> TokenStream {
33    let input = parse_macro_input!(item as ItemFn);
34    composite::expand_composite(input).into()
35}
36
37#[proc_macro_attribute]
38pub fn state_machine(_attr: TokenStream, item: TokenStream) -> TokenStream {
39    let block = parse_macro_input!(item as ItemImpl);
40    stateful::expand_state_machine(block).into()
41}