1use proc_macro::TokenStream;
2use quote::quote;
3use syn::parse_macro_input;
4
5use crate::construct;
6
7use self::args::Args;
8
9mod args;
10
11pub(crate) fn expand(args: TokenStream) -> TokenStream {
12 let args: Args = parse_macro_input!(args as Args);
13 codegen(&args)
14}
15
16fn codegen(args: &Args) -> TokenStream {
17 let tuple_exprs = args
18 .exprs
19 .iter()
20 .map(|expr| {
21 let escaped_expr = construct::escaped_expr_string(expr);
22 let format_string = format!("{escaped_expr} = {{}}");
23
24 quote!(match #expr {
25 tmp => {
26 defmt::trace!(#format_string, tmp);
27 tmp
28 }
29 })
30 })
31 .collect::<Vec<_>>();
32
33 if tuple_exprs.is_empty() {
34 // for compatibility with `std::dbg!` we also emit a TRACE log in this case
35 quote!(defmt::trace!(""))
36 } else {
37 quote![ (#(#tuple_exprs),*) ]
38 }
39 .into()
40}
41