Bug 1795082 - Part 2/2: Drop post-processing from getURL() r=zombie
[gecko.git] / third_party / rust / anyhow / src / macros.rs
blob6dd22743b76e74e2985bcd0b8bb771773c730c3f
1 /// Return early with an error.
2 ///
3 /// This macro is equivalent to `return Err(`[`anyhow!($args...)`][anyhow!]`)`.
4 ///
5 /// The surrounding function's or closure's return value is required to be
6 /// `Result<_,`[`anyhow::Error`][crate::Error]`>`.
7 ///
8 /// [anyhow!]: crate::anyhow
9 ///
10 /// # Example
11 ///
12 /// ```
13 /// # use anyhow::{bail, Result};
14 /// #
15 /// # fn has_permission(user: usize, resource: usize) -> bool {
16 /// #     true
17 /// # }
18 /// #
19 /// # fn main() -> Result<()> {
20 /// #     let user = 0;
21 /// #     let resource = 0;
22 /// #
23 /// if !has_permission(user, resource) {
24 ///     bail!("permission denied for accessing {}", resource);
25 /// }
26 /// #     Ok(())
27 /// # }
28 /// ```
29 ///
30 /// ```
31 /// # use anyhow::{bail, Result};
32 /// # use thiserror::Error;
33 /// #
34 /// # const MAX_DEPTH: usize = 1;
35 /// #
36 /// #[derive(Error, Debug)]
37 /// enum ScienceError {
38 ///     #[error("recursion limit exceeded")]
39 ///     RecursionLimitExceeded,
40 ///     # #[error("...")]
41 ///     # More = (stringify! {
42 ///     ...
43 ///     # }, 1).1,
44 /// }
45 ///
46 /// # fn main() -> Result<()> {
47 /// #     let depth = 0;
48 /// #
49 /// if depth > MAX_DEPTH {
50 ///     bail!(ScienceError::RecursionLimitExceeded);
51 /// }
52 /// #     Ok(())
53 /// # }
54 /// ```
55 #[macro_export]
56 macro_rules! bail {
57     ($msg:literal $(,)?) => {
58         return $crate::__private::Err($crate::__anyhow!($msg))
59     };
60     ($err:expr $(,)?) => {
61         return $crate::__private::Err($crate::__anyhow!($err))
62     };
63     ($fmt:expr, $($arg:tt)*) => {
64         return $crate::__private::Err($crate::__anyhow!($fmt, $($arg)*))
65     };
68 /// Return early with an error if a condition is not satisfied.
69 ///
70 /// This macro is equivalent to `if !$cond { return
71 /// Err(`[`anyhow!($args...)`][anyhow!]`); }`.
72 ///
73 /// The surrounding function's or closure's return value is required to be
74 /// `Result<_,`[`anyhow::Error`][crate::Error]`>`.
75 ///
76 /// Analogously to `assert!`, `ensure!` takes a condition and exits the function
77 /// if the condition fails. Unlike `assert!`, `ensure!` returns an `Error`
78 /// rather than panicking.
79 ///
80 /// [anyhow!]: crate::anyhow
81 ///
82 /// # Example
83 ///
84 /// ```
85 /// # use anyhow::{ensure, Result};
86 /// #
87 /// # fn main() -> Result<()> {
88 /// #     let user = 0;
89 /// #
90 /// ensure!(user == 0, "only user 0 is allowed");
91 /// #     Ok(())
92 /// # }
93 /// ```
94 ///
95 /// ```
96 /// # use anyhow::{ensure, Result};
97 /// # use thiserror::Error;
98 /// #
99 /// # const MAX_DEPTH: usize = 1;
100 /// #
101 /// #[derive(Error, Debug)]
102 /// enum ScienceError {
103 ///     #[error("recursion limit exceeded")]
104 ///     RecursionLimitExceeded,
105 ///     # #[error("...")]
106 ///     # More = (stringify! {
107 ///     ...
108 ///     # }, 1).1,
109 /// }
111 /// # fn main() -> Result<()> {
112 /// #     let depth = 0;
113 /// #
114 /// ensure!(depth <= MAX_DEPTH, ScienceError::RecursionLimitExceeded);
115 /// #     Ok(())
116 /// # }
117 /// ```
118 #[cfg(doc)]
119 #[macro_export]
120 macro_rules! ensure {
121     ($cond:expr $(,)?) => {
122         if !$cond {
123             return $crate::__private::Err($crate::Error::msg(
124                 $crate::__private::concat!("Condition failed: `", $crate::__private::stringify!($cond), "`")
125             ));
126         }
127     };
128     ($cond:expr, $msg:literal $(,)?) => {
129         if !$cond {
130             return $crate::__private::Err($crate::__anyhow!($msg));
131         }
132     };
133     ($cond:expr, $err:expr $(,)?) => {
134         if !$cond {
135             return $crate::__private::Err($crate::__anyhow!($err));
136         }
137     };
138     ($cond:expr, $fmt:expr, $($arg:tt)*) => {
139         if !$cond {
140             return $crate::__private::Err($crate::__anyhow!($fmt, $($arg)*));
141         }
142     };
145 #[cfg(not(doc))]
146 #[macro_export]
147 macro_rules! ensure {
148     ($($tt:tt)*) => {
149         $crate::__parse_ensure!(
150             /* state */ 0
151             /* stack */ ()
152             /* bail */ ($($tt)*)
153             /* fuel */ (~~~~~~~~~~ ~~~~~~~~~~ ~~~~~~~~~~ ~~~~~~~~~~ ~~~~~~~~~~ ~~~~~~~~~~ ~~~~~~~~~~ ~~~~~~~~~~ ~~~~~~~~~~ ~~~~~~~~~~ ~~~~~~~~~~ ~~~~~~~~~~)
154             /* parse */ {()}
155             /* dup */ ($($tt)*)
156             /* rest */ $($tt)*
157         )
158     };
161 /// Construct an ad-hoc error from a string or existing non-`anyhow` error
162 /// value.
164 /// This evaluates to an [`Error`][crate::Error]. It can take either just a
165 /// string, or a format string with arguments. It also can take any custom type
166 /// which implements `Debug` and `Display`.
168 /// If called with a single argument whose type implements `std::error::Error`
169 /// (in addition to `Debug` and `Display`, which are always required), then that
170 /// Error impl's `source` is preserved as the `source` of the resulting
171 /// `anyhow::Error`.
173 /// # Example
175 /// ```
176 /// # type V = ();
177 /// #
178 /// use anyhow::{anyhow, Result};
180 /// fn lookup(key: &str) -> Result<V> {
181 ///     if key.len() != 16 {
182 ///         return Err(anyhow!("key length must be 16 characters, got {:?}", key));
183 ///     }
185 ///     // ...
186 ///     # Ok(())
187 /// }
188 /// ```
189 #[macro_export]
190 macro_rules! anyhow {
191     ($msg:literal $(,)?) => {
192         $crate::__private::must_use({
193             let error = $crate::__private::format_err($crate::__private::format_args!($msg));
194             error
195         })
196     };
197     ($err:expr $(,)?) => {
198         $crate::__private::must_use({
199             use $crate::__private::kind::*;
200             let error = match $err {
201                 error => (&error).anyhow_kind().new(error),
202             };
203             error
204         })
205     };
206     ($fmt:expr, $($arg:tt)*) => {
207         $crate::Error::msg($crate::__private::format!($fmt, $($arg)*))
208     };
211 // Not public API. This is used in the implementation of some of the other
212 // macros, in which the must_use call is not needed because the value is known
213 // to be used.
214 #[doc(hidden)]
215 #[macro_export]
216 macro_rules! __anyhow {
217     ($msg:literal $(,)?) => ({
218         let error = $crate::__private::format_err($crate::__private::format_args!($msg));
219         error
220     });
221     ($err:expr $(,)?) => ({
222         use $crate::__private::kind::*;
223         let error = match $err {
224             error => (&error).anyhow_kind().new(error),
225         };
226         error
227     });
228     ($fmt:expr, $($arg:tt)*) => {
229         $crate::Error::msg($crate::__private::format!($fmt, $($arg)*))
230     };