Finite state machines in rust; bendns fork to add types.
attributes
| -rw-r--r-- | rust-fsm-dsl/src/lib.rs | 4 | ||||
| -rw-r--r-- | rust-fsm-dsl/src/parser.rs | 10 |
2 files changed, 14 insertions, 0 deletions
diff --git a/rust-fsm-dsl/src/lib.rs b/rust-fsm-dsl/src/lib.rs index 85fe2f4..3d24a1f 100644 --- a/rust-fsm-dsl/src/lib.rs +++ b/rust-fsm-dsl/src/lib.rs @@ -15,6 +15,7 @@ use crate::{parser::StateMachineDef, variant::Final}; /// The full information about a state transition. Used to unify the /// represantion of the simple and the compact forms. struct Transition<'a> { + attr: &'a [Attribute], initial_state: &'a Variant, input_value: &'a Variant, final_state: &'a Final, @@ -49,6 +50,7 @@ pub fn state_machine(tokens: TokenStream) -> TokenStream { let transitions = transitions.iter().flat_map(|def| { def.transitions.iter().map(move |transition| Transition { + attr: &transition.attributes, initial_state: &def.initial_state, input_value: &transition.input_value, final_state: &transition.final_state, @@ -71,6 +73,7 @@ pub fn state_machine(tokens: TokenStream) -> TokenStream { ); for transition in transitions { let Transition { + attr, initial_state, final_state, input_value, @@ -134,6 +137,7 @@ pub fn state_machine(tokens: TokenStream) -> TokenStream { .unwrap_or(quote! { ::core::option::Option::None }); // let x = format!("{}, {} {} => {}", initial_, input_, guard, output_); transition_cases.push(quote! { + #(#attr)* (Self::#initial_, Self::Input::#input_) #guard => { #[cfg(fsm_debug)] println!("matched {} => {} {}", stringify!(#initial_), stringify!(#input_), stringify!(#guard)); diff --git a/rust-fsm-dsl/src/parser.rs b/rust-fsm-dsl/src/parser.rs index aabdf88..ffc0540 100644 --- a/rust-fsm-dsl/src/parser.rs +++ b/rust-fsm-dsl/src/parser.rs @@ -31,21 +31,27 @@ impl From<Output> for Option<Final> { /// Represents a part of state transition without the initial state. The `Parse` /// trait is implemented for the compact form. pub struct TransitionEntry { + pub attributes: Vec<Attribute>, pub input_value: Variant, pub final_state: Final, pub output: Option<Final>, + // pub as_: bool, } impl Parse for TransitionEntry { fn parse(input: ParseStream) -> Result<Self> { + let attributes = Attribute::parse_outer(input)?; let input_value = input.parse()?; input.parse::<Token![=>]>()?; + // let as_ = input.lookahead1().peek(Token![as]); let final_state = input.parse()?; let output = input.parse::<Output>()?.into(); Ok(Self { + // as_, input_value, final_state, output, + attributes, }) } } @@ -58,6 +64,7 @@ pub struct TransitionDef { impl Parse for TransitionDef { fn parse(input: ParseStream) -> Result<Self> { + let attributes = Attribute::parse_outer(input)?; let initial_state: Variant = input.parse()?; input.parse::<Token![=>]>()?; // Parse the transition in the simple format @@ -65,10 +72,13 @@ impl Parse for TransitionDef { let transitions = if !input.lookahead1().peek(token::Brace) { let input_value = input.parse()?; input.parse::<Token![=>]>()?; + // let as_ = input.lookahead1().peek(Token![as]); let final_state = input.parse()?; let output = input.parse::<Output>()?.into(); vec![TransitionEntry { + attributes, + // as_, input_value, final_state, output, |