1mod common;
2mod composite;
3mod enum_gen;
4mod explicit_test_case;
5mod hegel_main;
6mod hegel_test;
7mod pretty_printable;
8mod reproduce_failure;
9mod rewrite_draws;
10mod standalone_function;
11mod stateful;
12mod struct_gen;
13mod utils;
14
15use proc_macro::TokenStream;
16use syn::{Data, DeriveInput, ItemFn, ItemImpl, parse_macro_input};
17
18#[proc_macro_derive(DefaultGenerator)]
19pub fn derive_generator(input: TokenStream) -> TokenStream {
20 let input = parse_macro_input!(input as DeriveInput);
21
22 match &input.data {
23 Data::Struct(data) => struct_gen::derive_struct_generator(&input, data),
24 Data::Enum(data) => enum_gen::derive_enum_generator(&input, data),
25 Data::Union(_) => syn::Error::new_spanned(&input, "Generator cannot be derived for unions")
26 .to_compile_error()
27 .into(),
28 }
29}
30
31#[proc_macro_derive(PrettyPrintable, attributes(pretty))]
32pub fn derive_pretty_printable(input: TokenStream) -> TokenStream {
33 let input = parse_macro_input!(input as DeriveInput);
34 pretty_printable::derive_pretty_printable(&input)
35 .unwrap_or_else(syn::Error::into_compile_error)
36 .into()
37}
38
39#[proc_macro_attribute]
40pub fn test(attr: TokenStream, item: TokenStream) -> TokenStream {
41 hegel_test::expand_test(attr.into(), item.into()).into()
42}
43
44#[proc_macro_attribute]
45pub fn main(attr: TokenStream, item: TokenStream) -> TokenStream {
46 hegel_main::expand_main(attr.into(), item.into()).into()
47}
48
49#[proc_macro_attribute]
50pub fn standalone_function(attr: TokenStream, item: TokenStream) -> TokenStream {
51 standalone_function::expand_standalone_function(attr.into(), item.into()).into()
52}
53
54#[proc_macro_attribute]
55pub fn composite(attr: TokenStream, item: TokenStream) -> TokenStream {
56 if !attr.is_empty() {
57 return syn::Error::new_spanned(
58 proc_macro2::TokenStream::from(attr),
59 "#[hegel::composite] takes no arguments",
60 )
61 .to_compile_error()
62 .into();
63 }
64 let input = parse_macro_input!(item as ItemFn);
65 composite::expand_composite(input).into()
66}
67
68#[proc_macro_attribute]
99pub fn explicit_test_case(attr: TokenStream, item: TokenStream) -> TokenStream {
100 explicit_test_case::expand_explicit_test_case(attr.into(), item.into()).into()
101}
102
103#[proc_macro_attribute]
107pub fn reproduce_failure(attr: TokenStream, item: TokenStream) -> TokenStream {
108 reproduce_failure::expand_reproduce_failure(attr.into(), item.into()).into()
109}
110
111#[proc_macro_attribute]
112pub fn state_machine(attr: TokenStream, item: TokenStream) -> TokenStream {
113 if !attr.is_empty() {
114 return syn::Error::new_spanned(
115 proc_macro2::TokenStream::from(attr),
116 "#[hegel::state_machine] takes no arguments",
117 )
118 .to_compile_error()
119 .into();
120 }
121 let block = parse_macro_input!(item as ItemImpl);
122 stateful::expand_state_machine(block).into()
123}
124
125#[proc_macro_attribute]
126pub fn concurrent_state_machine(attr: TokenStream, item: TokenStream) -> TokenStream {
127 if !attr.is_empty() {
128 return syn::Error::new_spanned(
129 proc_macro2::TokenStream::from(attr),
130 "#[hegel::concurrent_state_machine] takes no arguments",
131 )
132 .to_compile_error()
133 .into();
134 }
135 let block = parse_macro_input!(item as ItemImpl);
136 stateful::expand_concurrent_state_machine(block).into()
137}
138
139#[proc_macro]
153pub fn rewrite_draws(input: TokenStream) -> TokenStream {
154 rewrite_draws::expand_rewrite_draws(input.into()).into()
155}