Finite state machines in rust; bendns fork to add types.
Diffstat (limited to 'rust-fsm-dsl/src/lib.rs')
-rw-r--r--rust-fsm-dsl/src/lib.rs26
1 files changed, 9 insertions, 17 deletions
diff --git a/rust-fsm-dsl/src/lib.rs b/rust-fsm-dsl/src/lib.rs
index 1c9fe36..094e3b2 100644
--- a/rust-fsm-dsl/src/lib.rs
+++ b/rust-fsm-dsl/src/lib.rs
@@ -32,16 +32,13 @@ fn attrs_to_token_stream(attrs: Vec<Attribute>) -> proc_macro2::TokenStream {
pub fn state_machine(tokens: TokenStream) -> TokenStream {
let StateMachineDef {
doc,
- visibility,
- state_name,
- input_name,
- output_name,
+ state_name: (state_attrs, state_visibility, state_name),
+ input_name: (input_attrs, input_visibility, input_name),
+ output_name: (output_attrs, output_visibility, output_name),
transitions,
- attributes,
} = parse_macro_input!(tokens as parser::StateMachineDef);
let doc = attrs_to_token_stream(doc);
- let attrs = attrs_to_token_stream(attributes);
if transitions.is_empty() {
let output = quote! {
@@ -168,10 +165,11 @@ pub fn state_machine(tokens: TokenStream) -> TokenStream {
.unwrap();
let input_generics = input_name.g();
let input_impl = variant::tokenize(&inputs, |x| {
+ let attrs = attrs_to_token_stream(input_attrs);
input_name.tokenize(|f| {
quote! {
#attrs
- #visibility enum #f #input_generics {
+ #input_visibility enum #f #input_generics {
#(#x),*
}
}
@@ -179,10 +177,11 @@ pub fn state_machine(tokens: TokenStream) -> TokenStream {
});
let input_name = input_name.path();
let state_impl = variant::tokenize(&states, |x| {
+ let attrs = attrs_to_token_stream(state_attrs.clone());
state_name.tokenize(|f| {
quote! {
#attrs
- #visibility enum #f {
+ #state_visibility enum #f {
#(#x),*
}
}
@@ -191,18 +190,11 @@ pub fn state_machine(tokens: TokenStream) -> TokenStream {
let state_name = state_name.path();
let output_generics = output_name.g();
let output_impl = variant::tokenize(&outputs, |outputs| {
+ let attrs = attrs_to_token_stream(output_attrs);
output_name.tokenize(|output_name| {
- // Many attrs and derives may work incorrectly (or simply not work) for empty enums, so we just skip them
- // altogether if the output alphabet is empty.
- let attrs = if outputs.is_empty() {
- quote!()
- } else {
- attrs.clone()
- };
-
quote! {
#attrs
- #visibility enum #output_name #output_generics {
+ #output_visibility enum #output_name #output_generics {
#(#outputs),*
}
}