azure_core/error/
macros.rs

1/// A convenient way to create a new error using the normal formatting infrastructure
2#[macro_export]
3macro_rules! format_err {
4    ($kind:expr, $msg:literal $(,)?) => {{
5        // Handle $:literal as a special case to make cargo-expanded code more
6        // concise in the common case.
7        $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/// Return early with an error if a condition is not satisfied.
18#[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/// Return early with an error if two expressions are not equal to each other.
38#[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/// Return early with an error if two expressions are equal to each other.
52#[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}