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 | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/rust-fsm-dsl/src/lib.rs b/rust-fsm-dsl/src/lib.rs index 1b25fba..ed1d729 100644 --- a/rust-fsm-dsl/src/lib.rs +++ b/rust-fsm-dsl/src/lib.rs @@ -111,7 +111,9 @@ pub fn state_machine(tokens: TokenStream) -> TokenStream { .unwrap(); let (initial_, guard_) = initial_state.separate(); - let final_ = final_state.reduce(); + let final_ = final_state + .reduce() + .map_or(initial_state.match_on(), |x| quote! { #x }); let (input_, guard) = input_value.separate(); let guard = guard_ .clone() @@ -129,7 +131,7 @@ pub fn state_machine(tokens: TokenStream) -> TokenStream { .map(|x| { #[cfg(feature = "diagram")] mermaid_diagram.push_str(&format!(" [\"{x}\"]")); - let output = x.reduce(); + let output = x.reduce().unwrap(); quote! { ::core::option::Option::Some(Self::Output::#output) } }) .unwrap_or(quote! { ::core::option::Option::None }); @@ -144,10 +146,10 @@ pub fn state_machine(tokens: TokenStream) -> TokenStream { mermaid_diagram.push('\n'); states.push(initial_state.clone()); - states.push(final_state.clone().variant()); + states.extend(final_state.clone().variant()); inputs.push(input_value.clone()); if let Some(output) = output { - outputs.push(output.clone().variant()); + outputs.push(output.clone().variant().unwrap()); } } |