//! Proc-macro backing for the `hsmc` crate. The sole public item is the //! [`statechart!`] macro which generates a state machine from a declarative //! description. use proc_macro::TokenStream; mod codegen; mod ir; mod parse; mod validate; /// See the `hsmc` crate for documentation. #[proc_macro] pub fn statechart(input: TokenStream) -> TokenStream { let input = proc_macro2::TokenStream::from(input); match statechart_impl(input) { Ok(ts) => ts.into(), Err(e) => e.to_compile_error().into(), } } fn statechart_impl(input: proc_macro2::TokenStream) -> syn::Result { let parsed = syn::parse2::(input)?; validate::validate_parse_tree(&parsed)?; let mut ir = ir::build_ir(parsed)?; ir::resolve_transitions(&mut ir)?; validate::validate(&ir)?; Ok(codegen::generate(&ir)) }