#[macro_export]
macro_rules! unwrap_result {
($result:expr) => {
$result.unwrap_or_else(|error| {
let mut message =
"Result evaluated to Err: ".to_owned();
message.push_str(&format!("{:?}", error)[..]);
let decorator_length = ::std::cmp::min(message.len() + 2, 100);
let decorator = (0..decorator_length).map(|_| "=").collect::<String>();
panic!("\n\n {}\n| {} |\n {}\n\n", decorator, message, decorator)
})
}
}
#[macro_export]
macro_rules! unwrap_option {
($option:expr, $user_string:expr) => {
$option.unwrap_or_else(|| {
let mut error = "Option evaluated to None".to_owned();
if !$user_string.is_empty() {
error.push_str(": \"");
error.push_str($user_string);
error.push_str("\"");
}
let decorator_length = ::std::cmp::min(error.len() + 2, 100);
let decorator = (0..decorator_length).map(|_| "=").collect::<String>();
panic!("\n\n {}\n| {} |\n {}\n\n", decorator, error, decorator)
})
}
}
#[cfg(test)]
mod test {
#[test]
fn unwrap_good_result() {
let result: Result<u8, ()> = Ok(1);
assert_eq!(unwrap_result!(result), 1);
}
#[test]
fn unwrap_good_option() {
let option = Some(1);
assert_eq!(unwrap_option!(option, "Error text."), 1);
}
#[test]
#[should_panic(expected = "Message on failure.")]
fn unwrap_bad_result() {
let result: Result<(), String> = Err("Message on failure.".to_owned());
unwrap_result!(result);
}
#[test]
#[should_panic(expected = "Message on failure.")]
fn unwrap_bad_option() {
let option: Option<()> = None;
unwrap_option!(option, "Message on failure.");
}
}