Finite state machines in rust; bendns fork to add types.
| -rw-r--r-- | rust-fsm-dsl/src/lib.rs | 10 | ||||
| -rw-r--r-- | rust-fsm-dsl/src/variant.rs | 9 |
2 files changed, 12 insertions, 7 deletions
diff --git a/rust-fsm-dsl/src/lib.rs b/rust-fsm-dsl/src/lib.rs index 55385ca..8bd6e18 100644 --- a/rust-fsm-dsl/src/lib.rs +++ b/rust-fsm-dsl/src/lib.rs @@ -112,9 +112,17 @@ pub fn state_machine(tokens: TokenStream) -> TokenStream { ) .unwrap(); - let initial_ = initial_state.match_on(); + let (initial_, guard_) = initial_state.separate(); let final_ = final_state.reduce(); let (input_, guard) = input_value.separate(); + let guard = guard_ + .clone() + .zip(guard.clone()) + .map(|(x, y)| { + quote! { if #x && #y } + }) + .or(guard_.or(guard).map(|x| quote! { if #x })) + .unwrap_or_default(); // let input_ = input_value.match_on(); // let final_state_ = final_state.match_on(); diff --git a/rust-fsm-dsl/src/variant.rs b/rust-fsm-dsl/src/variant.rs index 82e981c..86f3b25 100644 --- a/rust-fsm-dsl/src/variant.rs +++ b/rust-fsm-dsl/src/variant.rs @@ -113,19 +113,16 @@ impl Variant { self.ident.to_token_stream() } } - pub fn separate(&self) -> (proc_macro2::TokenStream, proc_macro2::TokenStream) { + pub fn separate(&self) -> (proc_macro2::TokenStream, Option<proc_macro2::TokenStream>) { if let Self { ident, field: Some((_, p, g)), } = self { - let b = g - .as_ref() - .map(|x| quote::quote! { if (#x) }) - .unwrap_or_default(); + let b = g.as_ref().map(|x| quote::quote! { #x }); (quote::quote! { #ident(#p) }, b) } else { - (self.ident.to_token_stream(), quote::quote! {}) + (self.ident.to_token_stream(), None) } } } |