use proc_macro::TokenStream;
use quote::quote;
use syn::{parse_macro_input, DeriveInput, Expr, Lit};
#[proc_macro_attribute]
pub fn prefix(_attr: TokenStream, item: TokenStream) -> TokenStream {
item
}
#[proc_macro_attribute]
pub fn delimiter(_attr: TokenStream, item: TokenStream) -> TokenStream {
item
}
#[proc_macro_derive(Prefix, attributes(entid))]
pub fn derive_prefix(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
let name = &input.ident;
let mut prefix = format!("{}_", name).to_lowercase();
let mut delimiter = String::from("_");
for attr in &input.attrs {
if attr.path().is_ident("entid") {
attr.parse_nested_meta(|meta| {
if meta.path.is_ident("prefix") {
let value = meta.value()?;
let expr: Expr = value.parse()?;
if let Expr::Lit(expr_lit) = expr {
if let Lit::Str(lit_str) = expr_lit.lit {
prefix = lit_str.value();
}
}
} else if meta.path.is_ident("delimiter") {
let value = meta.value()?;
let expr: Expr = value.parse()?;
if let Expr::Lit(expr_lit) = expr {
if let Lit::Str(lit_str) = expr_lit.lit {
delimiter = lit_str.value();
}
}
}
Ok(())
})
.ok();
}
}
let gen = quote! {
impl entid::Prefix for #name {
fn prefix() -> &'static str {
#prefix
}
fn delimiter() -> &'static str {
#delimiter
}
}
};
gen.into()
}