ckb_std/
asserts.rs

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}