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.rs15
1 files changed, 9 insertions, 6 deletions
diff --git a/rust-fsm-dsl/src/lib.rs b/rust-fsm-dsl/src/lib.rs
index cc11d31..ea0400e 100644
--- a/rust-fsm-dsl/src/lib.rs
+++ b/rust-fsm-dsl/src/lib.rs
@@ -7,7 +7,7 @@ extern crate proc_macro;
use proc_macro::TokenStream;
use quote::{quote, ToTokens};
use std::{collections::BTreeSet, iter::FromIterator};
-use syn::{parse_macro_input, Ident};
+use syn::{parse_macro_input, Attribute, Ident};
mod parser;
@@ -20,17 +20,19 @@ struct Transition<'a> {
output: &'a Option<Ident>,
}
+fn attrs_to_token_stream(attrs: Vec<Attribute>) -> proc_macro2::TokenStream {
+ let attrs = attrs.into_iter().map(ToTokens::into_token_stream);
+ proc_macro2::TokenStream::from_iter(attrs)
+}
+
#[proc_macro]
/// Produce a state machine definition from the provided `rust-fmt` DSL
/// description.
pub fn state_machine(tokens: TokenStream) -> TokenStream {
let input = parse_macro_input!(tokens as parser::StateMachineDef);
- let attrs = input
- .attributes
- .into_iter()
- .map(ToTokens::into_token_stream);
- let attrs = proc_macro2::TokenStream::from_iter(attrs);
+ let doc = attrs_to_token_stream(input.doc);
+ let attrs = attrs_to_token_stream(input.attributes);
if input.transitions.is_empty() {
let output = quote! {
@@ -171,6 +173,7 @@ pub fn state_machine(tokens: TokenStream) -> TokenStream {
let diagram = quote!();
let output = quote! {
+ #doc
#diagram
#visibility mod #fsm_name {
#attrs