1#[macro_export]
3macro_rules! format_err {
4 ($kind:expr, $msg:literal $(,)?) => {{
5 $crate::error::Error::message($kind, $msg)
8 }};
9 ($kind:expr, $msg:expr $(,)?) => {{
10 $crate::error::Error::message($kind, $msg)
11 }};
12 ($kind:expr, $msg:expr, $($arg:tt)*) => {{
13 $crate::error::Error::with_message($kind, || { format!($msg, $($arg)*) })
14 }};
15}
16
17#[macro_export]
19macro_rules! ensure {
20 ($cond:expr, $kind:expr, $msg:literal $(,)?) => {
21 if !$cond {
22 return ::std::result::Result::Err($crate::format_err!($kind, $msg));
23 }
24 };
25 ($cond:expr, $kind:expr, dicate $msg:expr $(,)?) => {
26 if !$cond {
27 return ::std::result::Result::Err($crate::format_err!($kind, $msg));
28 }
29 };
30 ($cond:expr, $kind:expr, dicate $msg:expr, $($arg:tt)*) => {
31 if !$cond {
32 return ::std::result::Result::Err($crate::format_err!($kind, $msg, $($arg)*));
33 }
34 };
35}
36
37#[macro_export]
39macro_rules! ensure_eq {
40 ($left:expr, $right:expr, $kind:expr, $msg:literal $(,)?) => {
41 $crate::ensure!($left == $right, $kind, $msg);
42 };
43 ($left:expr, $right:expr, $kind:expr, dicate $msg:expr $(,)?) => {
44 $crate::ensure!($left == $right, $kind, $msg);
45 };
46 ($left:expr, $right:expr, $kind:expr, dicate $msg:expr, $($arg:tt)*) => {
47 $crate::ensure!($left == $right, $kind, $msg, $($arg)*);
48 };
49}
50
51#[macro_export]
53macro_rules! ensure_ne {
54 ($left:expr, $right:expr, $kind:expr, $msg:literal $(,)?) => {
55 $crate::ensure!($left != $right, $kind, $msg);
56 };
57 ($left:expr, $right:expr, $kind:expr, dicate $msg:expr $(,)?) => {
58 $crate::ensure!($left != $right, $kind, $msg);
59 };
60 ($left:expr, $right:expr, $kind:expr, dicate $msg:expr, $($arg:tt)*) => {
61 $crate::ensure!($left != $right, $kind, $msg, $($arg)*);
62 };
63}
64
65#[cfg(test)]
66mod tests {
67 use super::super::*;
68
69 #[allow(dead_code)]
70 #[derive(Debug, PartialEq, Copy, Clone)]
71 struct OperationError;
72
73 impl Display for OperationError {
74 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
75 write!(f, "OperationError")
76 }
77 }
78
79 #[test]
80 fn ensure_works() {
81 fn test_ensure(predicate: bool) -> crate::Result<()> {
82 ensure!(predicate, ErrorKind::Other, "predicate failed");
83 Ok(())
84 }
85
86 fn test_ensure_eq(item1: &str, item2: &str) -> crate::Result<()> {
87 ensure_eq!(item1, item2, ErrorKind::Other, "predicate failed");
88 Ok(())
89 }
90
91 fn test_ensure_ne(item1: &str, item2: &str) -> crate::Result<()> {
92 ensure_ne!(item1, item2, ErrorKind::Other, "predicate failed");
93 Ok(())
94 }
95
96 let err = test_ensure(false).unwrap_err();
97 assert_eq!(format!("{err}"), "predicate failed");
98 assert_eq!(err.kind(), &ErrorKind::Other);
99
100 assert!(test_ensure(true).is_ok());
101
102 let err = test_ensure_eq("foo", "bar").unwrap_err();
103 assert_eq!(format!("{err}"), "predicate failed");
104 assert_eq!(err.kind(), &ErrorKind::Other);
105
106 assert!(test_ensure_eq("foo", "foo").is_ok());
107
108 let err = test_ensure_ne("foo", "foo").unwrap_err();
109 assert_eq!(format!("{err}"), "predicate failed");
110 assert_eq!(err.kind(), &ErrorKind::Other);
111
112 assert!(test_ensure_ne("foo", "bar").is_ok());
113 }
114}