Finite state machines in rust; bendns fork to add types.
fix structs not being types
bendn 4 months ago
parent b8d464a · commit c2775b8
-rw-r--r--rust-fsm-dsl/src/parser.rs21
-rw-r--r--rust-fsm/src/lib.rs2
-rw-r--r--rust-fsm/tests/circuit_breaker_dsl_custom_types.rs2
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,