qtpl_macros/
lib.rs

1mod tpl;
2
3use proc_macro::TokenStream;
4use proc_macro_error::proc_macro_error;
5use quote::quote;
6use syn::parse_macro_input;
7
8#[proc_macro]
9#[proc_macro_error]
10pub fn render_string(input: TokenStream) -> TokenStream {
11    let mut c = parse_macro_input!(input as syn::ExprCall);
12    let arg: syn::Expr = syn::parse_quote!(&mut w);
13    c.args.insert(0, arg);
14    TokenStream::from(quote! {
15        {
16            let mut w = Vec::new();
17            #c.unwrap();
18            String::from_utf8(w).unwrap()
19        }
20    })
21}
22
23#[proc_macro]
24#[proc_macro_error]
25pub fn tpl(input: TokenStream) -> TokenStream {
26    let el = parse_macro_input!(input as tpl::Template);
27    let result = quote! { #el };
28    TokenStream::from(result)
29}
30
31#[proc_macro_attribute]
32#[proc_macro_error]
33pub fn tplfn(_attr: TokenStream, item: TokenStream) -> TokenStream {
34    let mut f = parse_macro_input!(item as syn::ItemFn);
35    let arg: syn::FnArg = syn::parse_quote!(w: &mut dyn ::std::io::Write);
36    f.sig.inputs.insert(0, arg);
37    match f.sig.output {
38        syn::ReturnType::Default => {
39            f.sig.output = syn::parse_quote!(-> ::std::result::Result<(), ::std::io::Error>);
40        }
41        _ => (),
42    }
43    TokenStream::from(quote!(#f))
44}
45
46#[proc_macro]
47#[proc_macro_error]
48pub fn render(input: TokenStream) -> TokenStream {
49    let mut c = parse_macro_input!(input as syn::ExprCall);
50    let arg: syn::Expr = syn::parse_quote!(&mut w);
51    c.args.insert(0, arg);
52    TokenStream::from(quote! {
53        {
54            let mut w = vec![];
55            #c?;
56            w
57        }
58    })
59}