derive_state_machine_future/
lib.rs

1//! The compiler for `derive(StateMachineFuture)`.
2
3#![recursion_limit = "128"]
4
5#[macro_use]
6extern crate darling;
7extern crate heck;
8extern crate petgraph;
9extern crate proc_macro;
10extern crate proc_macro2;
11#[macro_use]
12extern crate quote;
13#[macro_use]
14extern crate syn;
15
16
17mod ast;
18mod codegen;
19mod phases;
20
21
22use darling::FromDeriveInput;
23use proc_macro::TokenStream;
24
25use ast::StateMachine;
26use phases::Pass;
27
28#[proc_macro_derive(StateMachineFuture, attributes(state_machine_future))]
29pub fn derive_state_machine_future(input: TokenStream) -> TokenStream {
30    let derive_input = parse_macro_input!(input as syn::DeriveInput);
31
32    let machine = match StateMachine::<phases::Parsed>::from_derive_input(&derive_input) {
33        Ok(sm) => sm,
34        Err(e) => panic!("error in derive(StateMachineFuture): {}", e),
35    };
36
37    let machine = phases::StartReadyError::pass(machine);
38    let machine = phases::ValidTransitionEdges::pass(machine);
39    let machine = phases::ValidPaths::pass(machine);
40    let machine = phases::StateGenerics::pass(machine);
41    let machine = phases::AfterStateGenerics::pass(machine);
42    let machine = phases::ReadyForCodegen::pass(machine);
43
44    quote!(#machine).into()
45}