simple_log_derive/
lib.rs

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}