defuse_near_utils/
panic.rs

1use std::fmt::Display;
2
3use near_sdk::{FunctionError, env};
4
5pub trait PanicError {
6    #[inline]
7    #[track_caller]
8    fn panic_str(&self) -> !
9    where
10        Self: AsRef<str>,
11    {
12        env::panic_str(self.as_ref())
13    }
14
15    #[inline]
16    #[track_caller]
17    fn panic_static_str(self) -> !
18    where
19        Self: Into<&'static str>,
20    {
21        self.into().panic_str()
22    }
23
24    #[inline]
25    #[track_caller]
26    fn panic_display(&self) -> !
27    where
28        Self: Display,
29    {
30        self.to_string().panic_str()
31    }
32}
33impl<E> PanicError for E {}
34
35pub trait UnwrapOrPanic<T> {
36    fn unwrap_or_panic(self) -> T;
37}
38
39impl<T> UnwrapOrPanic<T> for Option<T> {
40    #[inline]
41    #[track_caller]
42    fn unwrap_or_panic(self) -> T {
43        self.unwrap_or_else(|| env::abort())
44    }
45}
46
47impl<T, E> UnwrapOrPanic<T> for Result<T, E>
48where
49    E: FunctionError,
50{
51    #[inline]
52    #[track_caller]
53    fn unwrap_or_panic(self) -> T
54    where
55        E: FunctionError,
56    {
57        self.unwrap_or_else(|err| err.panic())
58    }
59}
60
61pub trait UnwrapOrPanicError<T, E> {
62    fn unwrap_or_panic_str(self) -> T
63    where
64        E: AsRef<str>;
65
66    fn unwrap_or_panic_static_str(self) -> T
67    where
68        E: Into<&'static str>;
69
70    fn unwrap_or_panic_display(self) -> T
71    where
72        E: Display;
73}
74
75impl<T, E> UnwrapOrPanicError<T, E> for Result<T, E> {
76    #[inline]
77    #[track_caller]
78    fn unwrap_or_panic_str(self) -> T
79    where
80        E: AsRef<str>,
81    {
82        self.unwrap_or_else(|err| err.panic_str())
83    }
84
85    #[inline]
86    #[track_caller]
87    fn unwrap_or_panic_static_str(self) -> T
88    where
89        E: Into<&'static str>,
90    {
91        self.unwrap_or_else(|err| err.panic_static_str())
92    }
93
94    #[inline]
95    #[track_caller]
96    fn unwrap_or_panic_display(self) -> T
97    where
98        E: Display,
99    {
100        self.unwrap_or_else(|err| err.panic_display())
101    }
102}