Finite state machines in rust; bendns fork to add types.
-rw-r--r--rust-fsm-dsl/src/lib.rs10
-rw-r--r--rust-fsm-dsl/src/variant.rs9
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)
}
}
}