adf_template_macro/
lib.rs1use 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}