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}