1use proc_macro::TokenStream;
2use quote::quote;
3
4mod ast;
5mod fmt;
6mod lower_ast;
7mod parse;
8
9pub(crate) struct FormatArgsInput {
10 pub template: String,
11 pub values: Vec<ast::LitValue>,
12}
13
14#[proc_macro]
21pub fn format_args(input: TokenStream) -> TokenStream {
22 let input = syn::parse_macro_input!(input as FormatArgsInput);
23
24 let template = input.template;
25 let values = input.values;
26
27 let output = quote! {
28 ::std::format_args!(#template, #(#values),*)
29 };
30
31 output.into()
32}
33
34#[proc_macro]
40pub fn format_args_nl(input: TokenStream) -> TokenStream {
41 let input = syn::parse_macro_input!(input as FormatArgsInput);
42
43 let template_with_nl = format!("{}<br>", input.template);
44 let values = input.values;
45
46 let output = quote! {
47 ::std::format_args!(#template_with_nl, #(#values),*)
48 };
49
50 output.into()
51}
52
53pub(crate) struct ConcatInput {
54 pub segments: Vec<proc_macro2::TokenStream>,
55}
56
57#[proc_macro]
64pub fn concat(input: TokenStream) -> TokenStream {
65 let input = syn::parse_macro_input!(input as ConcatInput);
66 let segments = input.segments;
67
68 let output = quote! {
69 ::std::concat!(#(#segments),*)
70 };
71
72 output.into()
73}