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.rs | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/rust-fsm-dsl/src/lib.rs b/rust-fsm-dsl/src/lib.rs index 5b13e69..ab29e68 100644 --- a/rust-fsm-dsl/src/lib.rs +++ b/rust-fsm-dsl/src/lib.rs @@ -57,6 +57,12 @@ pub fn state_machine(tokens: TokenStream) -> TokenStream { let mut transition_cases = Vec::new(); let mut output_cases = Vec::new(); + #[cfg(feature = "diagram")] + let mut mermaid_diagram = format!( + "///```mermaid\n///stateDiagram-v2\n/// [*] --> {}\n", + input.initial_state + ); + states.insert(&input.initial_state); for transition in transitions { @@ -67,6 +73,11 @@ pub fn state_machine(tokens: TokenStream) -> TokenStream { output, } = transition; + #[cfg(feature = "diagram")] + mermaid_diagram.push_str(&format!( + "/// {initial_state} --> {final_state}: {input_value}" + )); + transition_cases.push(quote! { (Self::State::#initial_state, Self::Input::#input_value) => { Some(Self::State::#final_state) @@ -79,8 +90,14 @@ pub fn state_machine(tokens: TokenStream) -> TokenStream { Some(Self::Output::#output_value) } }); + + #[cfg(feature = "diagram")] + mermaid_diagram.push_str(&format!(" [{output_value}]")); } + #[cfg(feature = "diagram")] + mermaid_diagram.push('\n'); + states.insert(initial_state); states.insert(final_state); inputs.insert(input_value); @@ -89,6 +106,11 @@ pub fn state_machine(tokens: TokenStream) -> TokenStream { } } + #[cfg(feature = "diagram")] + mermaid_diagram.push_str("///```"); + #[cfg(feature = "diagram")] + let mermaid_diagram: proc_macro2::TokenStream = mermaid_diagram.parse().unwrap(); + let initial_state_name = &input.initial_state; let (input_type, input_impl) = match input.input_type { @@ -139,7 +161,17 @@ pub fn state_machine(tokens: TokenStream) -> TokenStream { } }; + #[cfg(feature = "diagram")] + let diagram = quote! { + #[cfg_attr(doc, rust_fsm::aquamarine)] + #mermaid_diagram + }; + + #[cfg(not(feature = "diagram"))] + let diagram = quote!(); + let output = quote! { + #diagram #visibility mod #fsm_name { #attrs pub struct Impl; |