#[macro_export]
macro_rules! ensure {
($cond:expr, $e:expr) => {
if !($cond) {
return Err(core::convert::From::from($e));
}
};
}
#[macro_export]
macro_rules! ensure_eq {
($a:expr, $b:expr, $e:expr) => {
if !($a == $b) {
return Err(core::convert::From::from($e));
}
};
}
#[macro_export]
macro_rules! ensure_ne {
($a:expr, $b:expr, $e:expr) => {
if !($a != $b) {
return Err(core::convert::From::from($e));
}
};
}
#[cfg(test)]
mod tests {
use crate::StdError;
#[test]
fn ensure_works() {
fn check(a: usize, b: usize) -> Result<(), StdError> {
ensure!(a == b, StdError::generic_err("foobar"));
Ok(())
}
let err = check(5, 6).unwrap_err();
assert!(matches!(err, StdError::GenericErr { .. }));
check(5, 5).unwrap();
}
#[test]
fn ensure_can_infer_error_type() {
let check = |a, b| {
ensure!(a == b, StdError::generic_err("foobar"));
Ok(())
};
let err = check(5, 6).unwrap_err();
assert!(matches!(err, StdError::GenericErr { .. }));
check(5, 5).unwrap();
}
#[test]
fn ensure_can_convert_into() {
#[derive(Debug)]
struct ContractError;
impl From<StdError> for ContractError {
fn from(_original: StdError) -> Self {
ContractError
}
}
fn check(a: usize, b: usize) -> Result<(), ContractError> {
ensure!(a == b, StdError::generic_err("foobar"));
Ok(())
}
let err = check(5, 6).unwrap_err();
assert!(matches!(err, ContractError));
check(5, 5).unwrap();
}
#[test]
fn ensure_eq_works() {
let check = |a, b| {
ensure_eq!(a, b, StdError::generic_err("foobar"));
Ok(())
};
let err = check("123", "456").unwrap_err();
assert!(matches!(err, StdError::GenericErr { .. }));
check("123", "123").unwrap();
}
#[test]
fn ensure_eq_gets_precedence_right() {
#[allow(clippy::nonminimal_bool)]
fn check() -> Result<(), StdError> {
ensure_eq!(true || false, false, StdError::generic_err("foobar"));
Ok(())
}
let _err = check().unwrap_err();
}
#[test]
fn ensure_ne_works() {
let check = |a, b| {
ensure_ne!(a, b, StdError::generic_err("foobar"));
Ok(())
};
let err = check("123", "123").unwrap_err();
assert!(matches!(err, StdError::GenericErr { .. }));
check("123", "456").unwrap();
}
#[test]
fn ensure_ne_gets_precedence_right() {
#[allow(clippy::nonminimal_bool)]
fn check() -> Result<(), StdError> {
ensure_ne!(true || false, false, StdError::generic_err("foobar"));
Ok(())
}
check().unwrap();
}
}