espr_derive/lib.rs
1use espr::{ast::SyntaxTree, codegen::rust::*, ir::IR};
2use proc_macro::TokenStream;
3
4/// Compile inline EXPRESS into Rust code, and expand it on the call site.
5///
6/// Example
7/// --------
8///
9/// ```
10/// espr_derive::inline_express!(r#"
11/// SCHEMA explicit_draughting;
12/// ENTITY a;
13/// x: REAL;
14/// END_ENTITY;
15/// END_SCHEMA;
16/// "#);
17/// ```
18#[proc_macro]
19pub fn inline_express(input: TokenStream) -> TokenStream {
20 // FIXME Use proc-macro-error
21 //
22 // espr::Result does not match its requirement currently. We have to fix it.
23 //
24 let input: syn::LitStr =
25 syn::parse(input).expect("inline_express! argument must be string literal");
26 let st = SyntaxTree::parse(&input.value()).expect("Tokenize failed");
27 let ir = IR::from_syntax_tree(&st).expect("Failed in semantic analysis phase");
28 ir.to_token_stream(CratePrefix::External).into()
29}