Finite state machines in rust; bendns fork to add types.
Diffstat (limited to 'rust_fsm_dsl/src/lib.rs')
| -rw-r--r-- | rust_fsm_dsl/src/lib.rs | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/rust_fsm_dsl/src/lib.rs b/rust_fsm_dsl/src/lib.rs index efa2b05..04e9594 100644 --- a/rust_fsm_dsl/src/lib.rs +++ b/rust_fsm_dsl/src/lib.rs @@ -24,6 +24,12 @@ struct Transition<'a> { pub fn state_machine(tokens: TokenStream) -> TokenStream { let input = parse_macro_input!(tokens as parser::StateMachineDef); + let derives = if let Some(derives) = input.derives { + quote! { #[derive(#(#derives,)*)] } + } else { + quote! {} + }; + if input.transitions.is_empty() { let output = quote! { compile_error!("rust-fsm: at least one state transition must be provided"); @@ -82,7 +88,7 @@ pub fn state_machine(tokens: TokenStream) -> TokenStream { let (outputs_repr, outputs_type, output_impl) = if !outputs.is_empty() { let outputs_type_name = Ident::new(&format!("{}Output", struct_name), struct_name.span()); let outputs_repr = quote! { - #[derive(Debug, PartialEq)] + #derives #visibility enum #outputs_type_name { #(#outputs),* } @@ -116,14 +122,15 @@ pub fn state_machine(tokens: TokenStream) -> TokenStream { }; let output = quote! { + #derives #visibility struct #struct_name; - #[derive(Debug, PartialEq)] + #derives #visibility enum #states_enum_name { #(#states),* } - #[derive(Debug, PartialEq)] + #derives #visibility enum #inputs_enum_name { #(#inputs),* } |