moosicbox_assert/
lib.rs

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}