decal_macros/
lib.rs

1extern crate proc_macro;
2mod ast;
3mod ident_gen;
4mod text;
5
6use crate::text::text_impl;
7use ast::{
8    child::Tokenize,
9    ctrl_expr::TokenGenMode,
10    tree::DecalTree,
11};
12use ident_gen::IdentGen;
13use proc_macro::TokenStream;
14use syn::parse_macro_input;
15
16#[proc_macro]
17pub fn decal(input: TokenStream) -> TokenStream {
18    let mut root_found = false;
19    let mut mode = TokenGenMode::Full {
20        root_found: &mut root_found,
21    };
22    decal_impl(input, &mut mode)
23}
24
25#[proc_macro]
26pub fn fragment(input: TokenStream) -> TokenStream {
27    let mut mode = TokenGenMode::Partial;
28    decal_impl(input, &mut mode)
29}
30
31#[proc_macro]
32pub fn text(input: TokenStream) -> TokenStream {
33    text_impl(input)
34}
35
36fn decal_impl(input: TokenStream, mode: &mut TokenGenMode) -> TokenStream {
37    let DecalTree { root } = parse_macro_input!(input as DecalTree);
38    let mut ident_gen = IdentGen::new();
39    let expanded = root.tokenize(mode, &mut ident_gen, None);
40    TokenStream::from(expanded)
41}