adf_template_macro/
lib.rs

1use proc_macro::{self, TokenStream};
2use quote::quote;
3use syn::{parse_macro_input, AttributeArgs, DeriveInput};
4
5#[proc_macro_attribute]
6pub fn template(attr: TokenStream, item: TokenStream) -> TokenStream {
7    let attrs = parse_macro_input!(attr as AttributeArgs);
8    let input = parse_macro_input!(item as DeriveInput);
9
10    let ident = input.ident.clone();
11    let mut path_str = String::new();
12    for att in attrs.into_iter() {
13        if let syn::NestedMeta::Meta(syn::Meta::NameValue(syn::MetaNameValue {
14            path,
15            lit: syn::Lit::Str(lit_str),
16            ..
17        })) = att
18        {
19            if path.is_ident("path") {
20                path_str = lit_str.value();
21                eprintln!("path_str: {}", path_str);
22            }
23        }
24    }
25
26    let output = quote! {
27        #input
28
29        impl ::adf_template::GenerateADF for #ident {
30            fn to_adf(&self) -> Result<String, Box<dyn std::error::Error>> {
31                let template_str = include_str!(#path_str);
32                let mut template = ::adf_template::__private::tinytemplate::TinyTemplate::new();
33                template.add_template(stringify!(#ident), &template_str)?;
34                let rendered = template.render(stringify!(#ident), &self)?;
35                let adf_str = ::adf_template::__private::convert_html_str_to_adf_str(rendered);
36                Ok(adf_str)
37            }
38        }
39    };
40
41    output.into()
42}