1use core::fmt::Debug;
2
3pub const DEFAULT_PANIC_EXIT_CODE: i8 = -1;
4
5pub static mut __PANIC_EXIT_CODE: i8 = DEFAULT_PANIC_EXIT_CODE;
6
7pub fn set_panic_exit_code(code: i8) {
8 unsafe {
9 __PANIC_EXIT_CODE = code;
10 }
11}
12
13#[macro_export]
14macro_rules! assert {
15 ($code:expr, $($arg:tt)*) => {{
16 #[allow(trivial_numeric_casts)]
17 #[allow(clippy::unnecessary_cast)]
18 $crate::asserts::set_panic_exit_code($code as i8);
19 core::assert!($($arg)*);
20 $crate::asserts::set_panic_exit_code($crate::asserts::DEFAULT_PANIC_EXIT_CODE);
21 }};
22}
23
24#[macro_export]
25macro_rules! assert_eq {
26 ($code:expr, $($arg:tt)*) => {{
27 #[allow(trivial_numeric_casts)]
28 #[allow(clippy::unnecessary_cast)]
29 $crate::asserts::set_panic_exit_code($code as i8);
30 core::assert_eq!($($arg)*);
31 $crate::asserts::set_panic_exit_code($crate::asserts::DEFAULT_PANIC_EXIT_CODE);
32 }};
33}
34
35#[macro_export]
36macro_rules! assert_ne {
37 ($code:expr, $($arg:tt)*) => {{
38 #[allow(trivial_numeric_casts)]
39 #[allow(clippy::unnecessary_cast)]
40 $crate::asserts::set_panic_exit_code($code as i8);
41 core::assert_ne!($($arg)*);
42 $crate::asserts::set_panic_exit_code($crate::asserts::DEFAULT_PANIC_EXIT_CODE);
43 }};
44}
45
46pub fn expect_result<C: Into<i8>, T, E: Debug>(c: C, r: Result<T, E>, msg: &str) -> T {
47 set_panic_exit_code(c.into());
48 let t = r.expect(msg);
49 set_panic_exit_code(DEFAULT_PANIC_EXIT_CODE);
50 t
51}
52
53pub fn expect_err_result<C: Into<i8>, T: Debug, E>(c: C, r: Result<T, E>, msg: &str) -> E {
54 set_panic_exit_code(c.into());
55 let e = r.expect_err(msg);
56 set_panic_exit_code(DEFAULT_PANIC_EXIT_CODE);
57 e
58}
59
60pub fn unwrap_result<C: Into<i8>, T, E: Debug>(c: C, r: Result<T, E>) -> T {
61 set_panic_exit_code(c.into());
62 let t = r.unwrap();
63 set_panic_exit_code(DEFAULT_PANIC_EXIT_CODE);
64 t
65}
66
67pub fn unwrap_err_result<C: Into<i8>, T: Debug, E>(c: C, r: Result<T, E>) -> E {
68 set_panic_exit_code(c.into());
69 let e = r.unwrap_err();
70 set_panic_exit_code(DEFAULT_PANIC_EXIT_CODE);
71 e
72}
73
74pub fn expect_option<C: Into<i8>, T>(c: C, o: Option<T>, msg: &str) -> T {
75 set_panic_exit_code(c.into());
76 let t = o.expect(msg);
77 set_panic_exit_code(DEFAULT_PANIC_EXIT_CODE);
78 t
79}
80
81pub fn unwrap_option<C: Into<i8>, T>(c: C, o: Option<T>) -> T {
82 set_panic_exit_code(c.into());
83 let t = o.unwrap();
84 set_panic_exit_code(DEFAULT_PANIC_EXIT_CODE);
85 t
86}