1#![cfg_attr(feature = "fail-on-warnings", deny(warnings))]
2#![warn(clippy::all, clippy::pedantic, clippy::nursery, clippy::cargo)]
3#![allow(clippy::multiple_crate_versions)]
4
5pub use colored::Colorize;
6pub use moosicbox_env_utils;
7
8#[macro_export]
9macro_rules! assert {
10 ($evaluate:expr $(,)?) => {
11 if $crate::moosicbox_env_utils::default_env!("ENABLE_ASSERT", "false") == "1"
12 && !($evaluate)
13 {
14 eprintln!(
15 "{}",
16 $crate::Colorize::on_red($crate::Colorize::white($crate::Colorize::bold(
17 format!(
18 "assert failed:\n{}",
19 std::backtrace::Backtrace::force_capture()
20 )
21 .as_str()
22 )))
23 );
24 log::logger().flush();
25 std::process::exit(1);
26 }
27 };
28 ($evaluate:expr, $($message:tt)+) => {
29 if $crate::moosicbox_env_utils::default_env!("ENABLE_ASSERT", "false") == "1"
30 && !($evaluate)
31 {
32 eprintln!(
33 "{}",
34 $crate::Colorize::on_red($crate::Colorize::white($crate::Colorize::bold(
35 format!(
36 "assert failed: {}\n{}",
37 $crate::Colorize::underline(format!($($message)*).as_str()),
38 std::backtrace::Backtrace::force_capture()
39 )
40 .as_str()
41 )))
42 );
43 log::logger().flush();
44 std::process::exit(1);
45 }
46 };
47}
48
49#[macro_export]
50macro_rules! assert_or_err {
51 ($evaluate:expr, $err:expr, $(,)?) => {
52 if $crate::moosicbox_env_utils::default_env!("ENABLE_ASSERT", "false") == "1"
53 && !($evaluate)
54 {
55 $crate::assert!($evaluate, "{:?}", $err)
56 } else if !($evaluate) {
57 return Err($err);
58 }
59 };
60 ($evaluate:expr, $err:expr, $($message:tt)+) => {
61 if $crate::moosicbox_env_utils::default_env!("ENABLE_ASSERT", "false") == "1"
62 && !($evaluate)
63 {
64 $crate::assert!($evaluate, $($message)*)
65 } else if !($evaluate) {
66 return Err($err);
67 }
68 };
69}
70
71#[macro_export]
72macro_rules! assert_or_error {
73 ($evaluate:expr, $($message:tt)+) => {
74 if $crate::moosicbox_env_utils::default_env!("ENABLE_ASSERT", "false") == "1"
75 && !($evaluate)
76 {
77 $crate::assert!($evaluate, $($message)*)
78 } else if !($evaluate) {
79 log::error!($($message)*);
80 }
81 };
82}
83
84#[macro_export]
85macro_rules! assert_or_unimplemented {
86 ($evaluate:expr, $(,)?) => {
87 let success = ($evaluate);
88 if $crate::moosicbox_env_utils::default_env!("ENABLE_ASSERT", "false") == "1"
89 && !success
90 {
91 $crate::assert!(success)
92 } else if !success {
93 unimplemented!(
94 "{}",
95 $crate::Colorize::on_red($crate::Colorize::white($crate::Colorize::bold(
96 format!(
97 "{}\n{}",
98 $crate::Colorize::underline(format!($($message)*).as_str()),
99 std::backtrace::Backtrace::force_capture()
100 )
101 .as_str()
102 )))
103 );
104 }
105 };
106 ($evaluate:expr, $($message:tt)+) => {
107 let success = ($evaluate);
108 if $crate::moosicbox_env_utils::default_env!("ENABLE_ASSERT", "false") == "1"
109 && !success
110 {
111 $crate::assert!(success, $($message)*)
112 } else if !success {
113 unimplemented!(
114 "{}",
115 $crate::Colorize::on_red($crate::Colorize::white($crate::Colorize::bold(
116 format!(
117 "{}\n{}",
118 $crate::Colorize::underline(format!($($message)*).as_str()),
119 std::backtrace::Backtrace::force_capture()
120 )
121 .as_str()
122 )))
123 );
124 }
125 };
126}
127
128#[macro_export]
129macro_rules! assert_or_panic {
130 ($evaluate:expr, $(,)?) => {{
131 let success = ($evaluate);
132 if $crate::moosicbox_env_utils::default_env!("ENABLE_ASSERT", "false") == "1"
133 && !success
134 {
135 $crate::assert!(success)
136 } else if !success {
137 panic!(
138 "{}",
139 $crate::Colorize::on_red($crate::Colorize::white($crate::Colorize::bold(
140 format!(
141 "{}\n{}",
142 $crate::Colorize::underline(format!($($message)*).as_str()),
143 std::backtrace::Backtrace::force_capture()
144 )
145 .as_str()
146 )))
147 );
148 }
149 }};
150 ($evaluate:expr, $($message:tt)+) => {{
151 let success = ($evaluate);
152 if $crate::moosicbox_env_utils::default_env!("ENABLE_ASSERT", "false") == "1"
153 && !success
154 {
155 $crate::assert!(success, $($message)*)
156 } else if !success {
157 panic!(
158 "{}",
159 $crate::Colorize::on_red($crate::Colorize::white($crate::Colorize::bold(
160 format!(
161 "{}\n{}",
162 $crate::Colorize::underline(format!($($message)*).as_str()),
163 std::backtrace::Backtrace::force_capture()
164 )
165 .as_str()
166 )))
167 );
168 }
169 }};
170}
171
172#[macro_export]
173macro_rules! die {
174 () => {
175 if $crate::moosicbox_env_utils::default_env!("ENABLE_ASSERT", "false") == "1" {
176 eprintln!(
177 "{}",
178 $crate::Colorize::on_red($crate::Colorize::white($crate::Colorize::bold(
179 format!("{}", std::backtrace::Backtrace::force_capture()).as_str()
180 )))
181 );
182 log::logger().flush();
183 std::process::exit(1);
184 }
185 };
186 ($($message:tt)+) => {
187 if $crate::moosicbox_env_utils::default_env!("ENABLE_ASSERT", "false") == "1" {
188 eprintln!(
189 "{}",
190 $crate::Colorize::on_red($crate::Colorize::white($crate::Colorize::bold(
191 format!(
192 "{}\n{}",
193 $crate::Colorize::underline(format!($($message)*).as_str()),
194 std::backtrace::Backtrace::force_capture()
195 )
196 .as_str()
197 )))
198 );
199 log::logger().flush();
200 std::process::exit(1);
201 }
202 };
203}
204
205#[macro_export]
206macro_rules! die_or_warn {
207 ($($message:tt)+) => {
208 if $crate::moosicbox_env_utils::default_env!("ENABLE_ASSERT", "false") == "1" {
209 eprintln!(
210 "{}",
211 $crate::Colorize::on_yellow($crate::Colorize::white($crate::Colorize::bold(
212 format!(
213 "{}\n{}",
214 $crate::Colorize::underline(format!($($message)*).as_str()),
215 std::backtrace::Backtrace::force_capture()
216 )
217 .as_str()
218 )))
219 );
220 log::logger().flush();
221 std::process::exit(1);
222 } else {
223 log::warn!(
224 "{}",
225 $crate::Colorize::on_yellow($crate::Colorize::white($crate::Colorize::bold(
226 format!(
227 "{}\n{}",
228 $crate::Colorize::underline(format!($($message)*).as_str()),
229 std::backtrace::Backtrace::force_capture()
230 )
231 .as_str()
232 )))
233 );
234 }
235 };
236}
237
238#[macro_export]
239macro_rules! die_or_err {
240 ($err:expr, $($message:tt)+) => {
241 if $crate::moosicbox_env_utils::default_env!("ENABLE_ASSERT", "false") == "1"
242 {
243 $crate::die!($($message)*);
244 unreachable!();
245 } else {
246 return Err($err);
247 }
248 };
249}
250
251#[macro_export]
252macro_rules! die_or_error {
253 ($($message:tt)+) => {
254 if $crate::moosicbox_env_utils::default_env!("ENABLE_ASSERT", "false") == "1" {
255 eprintln!(
256 "{}",
257 $crate::Colorize::on_red($crate::Colorize::white($crate::Colorize::bold(
258 format!(
259 "{}\n{}",
260 $crate::Colorize::underline(format!($($message)*).as_str()),
261 std::backtrace::Backtrace::force_capture()
262 )
263 .as_str()
264 )))
265 );
266 log::logger().flush();
267 std::process::exit(1);
268 } else {
269 log::error!(
270 "{}",
271 $crate::Colorize::on_red($crate::Colorize::white($crate::Colorize::bold(
272 format!(
273 "{}\n{}",
274 $crate::Colorize::underline(format!($($message)*).as_str()),
275 std::backtrace::Backtrace::force_capture()
276 )
277 .as_str()
278 )))
279 );
280 }
281 };
282}
283
284#[macro_export]
285macro_rules! die_or_propagate {
286 ($evaluate:expr, $($message:tt)+) => {
287 if $crate::moosicbox_env_utils::default_env!("ENABLE_ASSERT", "false") == "1" {
288 match $evaluate {
289 Ok(x) => x,
290 Err(e) => $crate::die!($($message)*),
291 }
292 } else {
293 $evaluate?
294 }
295 };
296
297 ($evaluate:expr $(,)?) => {
298 if $crate::moosicbox_env_utils::default_env!("ENABLE_ASSERT", "false") == "1" {
299 match $evaluate {
300 Ok(x) => x,
301 Err(_e) => $crate::die!(),
302 }
303 } else {
304 $evaluate?
305 }
306 };
307}
308
309#[macro_export]
310macro_rules! die_or_panic {
311 ($($message:tt)+) => {
312 if $crate::moosicbox_env_utils::default_env!("ENABLE_ASSERT", "false") == "1" {
313 eprintln!(
314 "{}",
315 $crate::Colorize::on_red($crate::Colorize::white($crate::Colorize::bold(
316 format!(
317 "{}\n{}",
318 $crate::Colorize::underline(format!($($message)*).as_str()),
319 std::backtrace::Backtrace::force_capture()
320 )
321 .as_str()
322 )))
323 );
324 log::logger().flush();
325 std::process::exit(1);
326 } else {
327 panic!(
328 "{}",
329 $crate::Colorize::on_red($crate::Colorize::white($crate::Colorize::bold(
330 format!(
331 "{}\n{}",
332 $crate::Colorize::underline(format!($($message)*).as_str()),
333 std::backtrace::Backtrace::force_capture()
334 )
335 .as_str()
336 )))
337 );
338 }
339 };
340}
341
342#[macro_export]
343macro_rules! die_or_unimplemented {
344 ($($message:tt)+) => {
345 if $crate::moosicbox_env_utils::default_env!("ENABLE_ASSERT", "false") == "1" {
346 eprintln!(
347 "{}",
348 $crate::Colorize::on_red($crate::Colorize::white($crate::Colorize::bold(
349 format!(
350 "{}\n{}",
351 $crate::Colorize::underline(format!($($message)*).as_str()),
352 std::backtrace::Backtrace::force_capture()
353 )
354 .as_str()
355 )))
356 );
357 log::logger().flush();
358 std::process::exit(1);
359 } else {
360 unimplemented!(
361 "{}",
362 $crate::Colorize::on_red($crate::Colorize::white($crate::Colorize::bold(
363 format!(
364 "{}\n{}",
365 $crate::Colorize::underline(format!($($message)*).as_str()),
366 std::backtrace::Backtrace::force_capture()
367 )
368 .as_str()
369 )))
370 );
371 }
372 };
373}