Finite state machines in rust; bendns fork to add types.
Diffstat (limited to 'rust-fsm-dsl/src/parser.rs')
-rw-r--r--rust-fsm-dsl/src/parser.rs21
1 files changed, 13 insertions, 8 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![=>]>()?;