1#![doc(html_logo_url = "https://knurling.ferrous-systems.com/knurling_logo_light_text.svg")]
4
5use defmt_parser::Level;
6use proc_macro::TokenStream;
7use proc_macro2::TokenStream as TokenStream2;
8use proc_macro_error2::proc_macro_error;
9use quote::quote;
10
11mod attributes;
12mod cargo;
13mod construct;
14mod consts;
15mod derives;
16mod function_like;
17mod items;
18
19#[proc_macro_attribute]
25#[proc_macro_error]
26pub fn global_logger(args: TokenStream, item: TokenStream) -> TokenStream {
27 attributes::global_logger::expand(args, item)
28}
29
30#[proc_macro_attribute]
31#[proc_macro_error]
32pub fn panic_handler(args: TokenStream, item: TokenStream) -> TokenStream {
33 attributes::panic_handler::expand(args, item)
34}
35
36#[proc_macro_derive(Format, attributes(defmt))]
38#[proc_macro_error]
39pub fn format(input: TokenStream) -> TokenStream {
40 derives::format::expand(input)
41}
42
43#[proc_macro]
45#[proc_macro_error]
46pub fn assert_(args: TokenStream) -> TokenStream {
47 function_like::assert_like::assert::expand(args)
48}
49
50#[proc_macro]
51#[proc_macro_error]
52pub fn assert_eq_(args: TokenStream) -> TokenStream {
53 function_like::assert_binop::eq(args)
54}
55
56#[proc_macro]
57#[proc_macro_error]
58pub fn assert_ne_(args: TokenStream) -> TokenStream {
59 function_like::assert_binop::ne(args)
60}
61
62#[proc_macro]
68#[proc_macro_error]
69pub fn debug_assert_(input: TokenStream) -> TokenStream {
70 let assert = TokenStream2::from(assert_(input));
71 quote!(if cfg!(debug_assertions) {
72 #assert
73 })
74 .into()
75}
76
77#[proc_macro]
78#[proc_macro_error]
79pub fn debug_assert_eq_(input: TokenStream) -> TokenStream {
80 let assert = TokenStream2::from(assert_eq_(input));
81 quote!(if cfg!(debug_assertions) {
82 #assert
83 })
84 .into()
85}
86
87#[proc_macro]
88#[proc_macro_error]
89pub fn debug_assert_ne_(input: TokenStream) -> TokenStream {
90 let assert = TokenStream2::from(assert_ne_(input));
91 quote!(if cfg!(debug_assertions) {
92 #assert
93 })
94 .into()
95}
96#[proc_macro]
99#[proc_macro_error]
100pub fn dbg(args: TokenStream) -> TokenStream {
101 function_like::dbg::expand(args)
102}
103
104#[proc_macro]
105#[proc_macro_error]
106pub fn intern(args: TokenStream) -> TokenStream {
107 function_like::intern::expand(args)
108}
109
110#[proc_macro]
111#[proc_macro_error]
112pub fn internp(args: TokenStream) -> TokenStream {
113 function_like::internp::expand(args)
114}
115
116#[proc_macro]
117#[proc_macro_error]
118pub fn println(args: TokenStream) -> TokenStream {
119 function_like::println::expand(args)
120}
121
122#[proc_macro]
125#[proc_macro_error]
126pub fn trace(args: TokenStream) -> TokenStream {
127 function_like::log::expand(Level::Trace, args)
128}
129
130#[proc_macro]
131#[proc_macro_error]
132pub fn debug(args: TokenStream) -> TokenStream {
133 function_like::log::expand(Level::Debug, args)
134}
135
136#[proc_macro]
137#[proc_macro_error]
138pub fn info(args: TokenStream) -> TokenStream {
139 function_like::log::expand(Level::Info, args)
140}
141
142#[proc_macro]
143#[proc_macro_error]
144pub fn warn(args: TokenStream) -> TokenStream {
145 function_like::log::expand(Level::Warn, args)
146}
147
148#[proc_macro]
149#[proc_macro_error]
150pub fn error(args: TokenStream) -> TokenStream {
151 function_like::log::expand(Level::Error, args)
152}
153#[proc_macro]
156#[proc_macro_error]
157pub fn panic_(args: TokenStream) -> TokenStream {
158 function_like::panic_like::expand(args, "panicked at 'explicit panic'", |format_string| {
159 format!("panicked at '{format_string}'")
160 })
161}
162
163#[proc_macro]
164#[proc_macro_error]
165pub fn todo_(args: TokenStream) -> TokenStream {
166 function_like::panic_like::expand(args, "panicked at 'not yet implemented'", |format_string| {
167 format!("panicked at 'not yet implemented: {format_string}'")
168 })
169}
170
171#[proc_macro]
172#[proc_macro_error]
173pub fn unreachable_(args: TokenStream) -> TokenStream {
174 function_like::panic_like::expand(
175 args,
176 "panicked at 'internal error: entered unreachable code'",
177 |format_string| {
178 format!(
179 "panicked at 'internal error: entered unreachable code: {}'",
180 format_string
181 )
182 },
183 )
184}
185
186#[proc_macro]
187#[proc_macro_error]
188pub fn unwrap(args: TokenStream) -> TokenStream {
189 function_like::assert_like::unwrap::expand(args)
190}
191
192#[proc_macro]
193#[proc_macro_error]
194pub fn write(args: TokenStream) -> TokenStream {
195 function_like::write::expand(args)
196}
197
198#[proc_macro]
200#[proc_macro_error]
201pub fn bitflags(ts: TokenStream) -> TokenStream {
202 items::bitflags::expand(ts)
203}
204
205#[proc_macro]
206#[proc_macro_error]
207pub fn timestamp(args: TokenStream) -> TokenStream {
208 items::timestamp::expand(args)
209}