Finite state machines in rust; bendns fork to add types.
fix structs not being types
| -rw-r--r-- | rust-fsm-dsl/src/parser.rs | 21 | ||||
| -rw-r--r-- | rust-fsm/src/lib.rs | 2 | ||||
| -rw-r--r-- | rust-fsm/tests/circuit_breaker_dsl_custom_types.rs | 2 |
3 files changed, 15 insertions, 10 deletions
diff --git a/rust-fsm-dsl/src/parser.rs b/rust-fsm-dsl/src/parser.rs index bed9720..63dc9c0 100644 --- a/rust-fsm-dsl/src/parser.rs +++ b/rust-fsm-dsl/src/parser.rs @@ -127,21 +127,21 @@ pub struct StateMachineDef { } pub enum ImplementationRequired { - Yes(Ident), + Yes(Type), No(Path), } impl ImplementationRequired { - pub fn tokenize(&self, f: impl Fn(&Ident) -> TokenStream) -> TokenStream { + pub fn tokenize(&self, f: impl Fn(&Type) -> TokenStream) -> TokenStream { match self { ImplementationRequired::Yes(ident) => f(ident), ImplementationRequired::No(_) => TokenStream::default(), } } - pub fn path(self) -> Path { + pub fn path(self) -> TokenStream { match self { - ImplementationRequired::Yes(ident) => ident.into(), - ImplementationRequired::No(path) => path, + ImplementationRequired::Yes(ident) => quote::quote! { #ident }, + ImplementationRequired::No(path) => quote::quote! { #path }, } } } @@ -164,9 +164,14 @@ impl Parse for StateMachineDef { let visibility = input.parse()?; let i = || { input - .parse::<Ident>() - .map(ImplementationRequired::Yes) - .or_else(|_| input.parse::<Path>().map(ImplementationRequired::No)) + .peek(Token![::]) + .then(|| { + input.parse::<Path>().map(|mut x| { + x.leading_colon = None; + ImplementationRequired::No(x) + }) + }) + .unwrap_or_else(|| input.parse::<Type>().map(ImplementationRequired::Yes)) }; let state_name = i()?; input.parse::<Token![=>]>()?; diff --git a/rust-fsm/src/lib.rs b/rust-fsm/src/lib.rs index 1ab4c74..907e967 100644 --- a/rust-fsm/src/lib.rs +++ b/rust-fsm/src/lib.rs @@ -160,7 +160,7 @@ pub enum Output { } state_machine! { - crate::State => crate::Input => crate::Output + ::crate::State => ::crate::Input => ::crate::Output Closed => Unsuccessful => Open [SetupTimer], Open => TimerTriggered => HalfOpen, diff --git a/rust-fsm/tests/circuit_breaker_dsl_custom_types.rs b/rust-fsm/tests/circuit_breaker_dsl_custom_types.rs index 389f913..c404b7f 100644 --- a/rust-fsm/tests/circuit_breaker_dsl_custom_types.rs +++ b/rust-fsm/tests/circuit_breaker_dsl_custom_types.rs @@ -25,7 +25,7 @@ pub enum Output { } state_machine! { - crate::State => crate::Input => crate::Output + ::crate::State => ::crate::Input => ::crate::Output Closed => Unsuccessful => Open [SetupTimer], Open => TimerTriggered => HalfOpen, |