Finite state machines in rust; bendns fork to add types.
attributes
bendn 3 weeks ago
parent 65f2bb1 · commit e624821
-rw-r--r--rust-fsm-dsl/src/lib.rs4
-rw-r--r--rust-fsm-dsl/src/parser.rs10
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,