1use proc_macro::TokenStream;
2use quote::quote;
3use syn::{parse_macro_input, Ident};
4
5#[proc_macro]
6pub fn log_target_derive(input: TokenStream) -> TokenStream {
7 let input_ident = parse_macro_input!(input as Ident);
8
9 let parts: Vec<_> = [
10 ("trace", quote!($crate::log::Level::Trace)),
11 ("debug", quote!($crate::log::Level::Debug)),
12 ("info", quote!($crate::log::Level::Info)),
13 ("warn", quote!($crate::log::Level::Warn)),
14 ("error", quote!($crate::log::Level::Error)),
15 ]
16 .iter()
17 .map(|(level_str, level_expr)| {
18 let log_target = Ident::new(
19 &format!("{}_{}", level_str, input_ident),
20 input_ident.span(),
21 );
22
23 quote! {
24 #[macro_export]
25 macro_rules! #log_target {
26 ($($arg:tt)*) => {
27 $crate::log::log!(target: stringify!(#input_ident), #level_expr, $($arg)*);
28 };
29 }
30 }
31 })
32 .collect();
33
34 let combined = quote! {
35 #(#parts)*
36 };
37
38 combined.into()
39}