1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
use std::fmt::Debug;
#[macro_export]
macro_rules! unwrap_msg (
($e:expr) => (
($e).unwrap_log(file!(), line!(), module_path!(), stringify!($e))
)
);
pub trait UnwrapLog<T> {
fn unwrap_log(self, file: &str, line: u32, module_path: &str, expression: &str) -> T;
}
impl<T> UnwrapLog<T> for Option<T> {
fn unwrap_log(self, file: &str, line: u32, module_path: &str, expression: &str) -> T {
match self {
Some(t) => t,
None => panic!("{}:{} {} this should not have panicked:\ntried to unwrap `None` in:\nunwrap_msg!({})", file, line, module_path, expression)
}
}
}
impl<T, E: Debug> UnwrapLog<T> for Result<T, E> {
fn unwrap_log(self, file: &str, line: u32, module_path: &str, expression: &str) -> T {
match self {
Ok(t) => t,
Err(e) => panic!("{}:{} {} this should not have panicked:\ntried to unwrap Err({:?}) in\nunwrap_msg!({})", file, line, module_path, e, expression)
}
}
}
#[macro_export]
macro_rules! assert_size (
($t:ty, $sz:expr) => (
assert_eq!(::std::mem::size_of::<$t>(), $sz);
);
);