YMUCHF4MBM4KQ2TBSJKGN5JFPZLTTI43CQETAMAC5K6KKLLVE73AC CUNXZ67ZJQGGKXH6V6UXXO3BHTXM7Q3TFOCCOGH5BNYLISUIYQJAC JFHL4E7DX2X2KWODFDHNIUB5RLDXWL3FMIBJIEQKO55J7FFJOLHQC SBH3TJ4H3E6ZYSAXSYLUQFW2NK57S7M7LEOZEXZDUO33YXFEVPTAC N4ANQ2NUA7Y5NPIAVGPYYHI4QQA52YEA6J3LX455AR5FXOJLJ6SQC DD2LOIR4RWUM35WJK7YL2ENXDQPHFLNM2DLESN3CIAWGNASOUP6QC EHE4X5PVQFLWRTTI6CD2KTQDRP4PW5QBISBZ57MC5DF2DF2I6VPAC IHFIR6TGELGKZOAR2APEY2BHHVK75EKNYPVUWSQHPXS6EZBH5LZQC 6KL7TFY4VYQ67TCMYG53KQV55EP6PHHN73BFVW6VSDI27CPHVY6QC AOQSHDBY3FLBJBFEIJQDYHGQOBECTYRN3KPWJWQMCVWDTB6L2IRQC MBJSV73XEUIBF7LU6MUYQJQLCRXYY7LXD7KZZFLLOCEDOKU2EAQAC CITEDKPB6MKVZUEYEDE5ZKTNVY35HCOAXKDPYG7YLLEOVFNMSRXQC TEYHPVS3CWEWID4TOEBXRAYAWG5Q5Y7DIVJRCXSZPOBG745PXBNAC LDNILCVWYT3PJ3UOUPRCAASTZXNKSYJBHHB7DO4TVXMYHQQ2DGVQC JVAAEIVSTVEANB55M7F3UQTFZ7JMGO47UPQPAIHLMZ2VBLUVX2DAC MMM45Y76ZSMHJ52WZO2CMP6BTNHTJAA54AZRHSIMNZBML7QNBEFQC BZSTVYDVHJA3ZMCM3YTU4U5JKJC2JVUDM5APSBIGMSS54J2C4WKQC RTVLSOCCLZMZRJZXRIX5RHJMAFJO4XK573NXTBZVBEJSUBJPY5ZQC GZZOJ7ZUSBPI3HXIV5UCFNMCDAMZPPLISY2UDV73FDN74HZ3AWJAC JZK5OKKPI672GJNZPKKC3T35E6CUHBLT62YHCKMODOYDLVHU6BUQC W655S25G7CGI4XOZ2PKITKTH26VJ4QMZFRV2RPYNI4KIUJOIGVMAC HHQUHNVMK5HPDJJ53MBD4IE2TDC3BMQOARPHRQAOO43AWG2LNMOAC G5RLZIDWZF2ZDQ6MMKWORKROOQUNIG4NFLNG6NYVZ3UHEWGGUJEAC KQXMNV3RMRPSJCQVW4I2HSCFJQ6ZDRLNMJOTQI4MODB6UYA3ONQQC /// Return early with an error.////// This macro is equivalent to `return Err(From::from($err))`.////// # Example////// ```/// # use anyhow::{bail, Result};/// #/// # fn has_permission(user: usize, resource: usize) -> bool {/// # true/// # }/// #/// # fn main() -> Result<()> {/// # let user = 0;/// # let resource = 0;/// #/// if !has_permission(user, resource) {/// bail!("permission denied for accessing {}", resource);/// }/// # Ok(())/// # }/// ```////// ```/// # use anyhow::{bail, Result};/// # use std::fmt::{self, Display};/// #/// # #[derive(Debug)]/// # enum ScienceError {/// # RecursionLimitExceeded,/// # }/// #/// # impl std::error::Error for ScienceError {}/// #/// # impl Display for ScienceError {/// # fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {/// # unimplemented!()/// # }/// # }/// #/// # const MAX_DEPTH: usize = 1;/// #/// # const IGNORE: &str = stringify! {/// #[derive(Error, Debug)]/// enum ScienceError {/// #[error(display = "recursion limit exceeded")]/// RecursionLimitExceeded,/// .../// }/// # };////// # fn main() -> Result<()> {/// # let depth = 0;/// #/// if depth > MAX_DEPTH {/// bail!(ScienceError::RecursionLimitExceeded);/// }/// # Ok(())/// # }/// ```#[macro_export]macro_rules! bail {($msg:literal $(,)?) => {return std::result::Result::Err($crate::anyhow!($msg));};($err:expr $(,)?) => {return std::result::Result::Err($crate::anyhow!($err));};($fmt:expr, $($arg:tt)*) => {return std::result::Result::Err($crate::anyhow!($fmt, $($arg)*));};}/// Return early with an error if a condition is not satisfied.////// This macro is equivalent to `if !$cond { return Err(From::from($err)); }`.////// Analogously to `assert!`, `ensure!` takes a condition and exits the function/// if the condition fails. Unlike `assert!`, `ensure!` returns an `Error`/// rather than panicking.////// # Example////// ```/// # use anyhow::{ensure, Result};/// #/// # fn main() -> Result<()> {/// # let user = 0;/// #/// ensure!(user == 0, "only user 0 is allowed");/// # Ok(())/// # }/// ```////// ```/// # use anyhow::{ensure, Result};/// # use std::fmt::{self, Display};/// #/// # #[derive(Debug)]/// # enum ScienceError {/// # RecursionLimitExceeded,/// # }/// #/// # impl std::error::Error for ScienceError {}/// #/// # impl Display for ScienceError {/// # fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {/// # unimplemented!()/// # }/// # }/// #/// # const MAX_DEPTH: usize = 1;/// #/// # const IGNORE: &str = stringify! {/// #[derive(Error, Debug)]/// enum ScienceError {/// #[error(display = "recursion limit exceeded")]/// RecursionLimitExceeded,/// .../// }/// # };////// # fn main() -> Result<()> {/// # let depth = 0;/// #/// ensure!(depth <= MAX_DEPTH, ScienceError::RecursionLimitExceeded);/// # Ok(())/// # }/// ```#[macro_export]macro_rules! ensure {($cond:expr, $msg:literal $(,)?) => {if !$cond {return std::result::Result::Err($crate::anyhow!($msg));}};($cond:expr, $err:expr $(,)?) => {if !$cond {return std::result::Result::Err($crate::anyhow!($err));}};($cond:expr, $fmt:expr, $($arg:tt)*) => {if !$cond {return std::result::Result::Err($crate::anyhow!($fmt, $($arg)*));}};}/// Construct an ad-hoc error from a string.////// This evaluates to an `Error`. It can take either just a string, or a format/// string with arguments. It also can take any custom type which implements/// `Debug` and `Display`.////// # Example////// ```/// # type V = ();/// #/// use anyhow::{anyhow, Result};////// fn lookup(key: &str) -> Result<V> {/// if key.len() != 16 {/// return Err(anyhow!("key length must be 16 characters, got {:?}", key));/// }////// // .../// # Ok(())/// }/// ```#[macro_export]macro_rules! anyhow {($msg:literal $(,)?) => {// Handle $:literal as a special case to make cargo-expanded code more// concise in the common case.$crate::private::new_adhoc($msg)};($err:expr $(,)?) => ({#[allow(unused_imports)]use $crate::private::{AdhocKind, TraitKind};let error = $err;(&error).anyhow_kind().new(error)});($fmt:expr, $($arg:tt)*) => {$crate::private::new_adhoc(format!($fmt, $($arg)*))};}
/// Return early with an error.////// This macro is equivalent to `return Err(From::from($err))`.////// # Example////// ```/// # use anyhow::{bail, Result};/// #/// # fn has_permission(user: usize, resource: usize) -> bool {/// # true/// # }/// #/// # fn main() -> Result<()> {/// # let user = 0;/// # let resource = 0;/// #/// if !has_permission(user, resource) {/// bail!("permission denied for accessing {}", resource);/// }/// # Ok(())/// # }/// ```////// ```/// # use anyhow::{bail, Result};/// # use std::fmt::{self, Display};/// #/// # #[derive(Debug)]/// # enum ScienceError {/// # RecursionLimitExceeded,/// # }/// #/// # impl std::error::Error for ScienceError {}/// #/// # impl Display for ScienceError {/// # fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {/// # unimplemented!()/// # }/// # }/// #/// # const MAX_DEPTH: usize = 1;/// #/// # const IGNORE: &str = stringify! {/// #[derive(Error, Debug)]/// enum ScienceError {/// #[error(display = "recursion limit exceeded")]/// RecursionLimitExceeded,/// .../// }/// # };////// # fn main() -> Result<()> {/// # let depth = 0;/// #/// if depth > MAX_DEPTH {/// bail!(ScienceError::RecursionLimitExceeded);/// }/// # Ok(())/// # }/// ```#[macro_export]macro_rules! bail {($msg:literal $(,)?) => {return std::result::Result::Err($crate::anyhow!($msg));};($err:expr $(,)?) => {return std::result::Result::Err($crate::anyhow!($err));};($fmt:expr, $($arg:tt)*) => {return std::result::Result::Err($crate::anyhow!($fmt, $($arg)*));};}/// Return early with an error if a condition is not satisfied.////// This macro is equivalent to `if !$cond { return Err(From::from($err)); }`.////// Analogously to `assert!`, `ensure!` takes a condition and exits the function/// if the condition fails. Unlike `assert!`, `ensure!` returns an `Error`/// rather than panicking.////// # Example////// ```/// # use anyhow::{ensure, Result};/// #/// # fn main() -> Result<()> {/// # let user = 0;/// #/// ensure!(user == 0, "only user 0 is allowed");/// # Ok(())/// # }/// ```////// ```/// # use anyhow::{ensure, Result};/// # use std::fmt::{self, Display};/// #/// # #[derive(Debug)]/// # enum ScienceError {/// # RecursionLimitExceeded,/// # }/// #/// # impl std::error::Error for ScienceError {}/// #/// # impl Display for ScienceError {/// # fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {/// # unimplemented!()/// # }/// # }/// #/// # const MAX_DEPTH: usize = 1;/// #/// # const IGNORE: &str = stringify! {/// #[derive(Error, Debug)]/// enum ScienceError {/// #[error(display = "recursion limit exceeded")]/// RecursionLimitExceeded,/// .../// }/// # };////// # fn main() -> Result<()> {/// # let depth = 0;/// #/// ensure!(depth <= MAX_DEPTH, ScienceError::RecursionLimitExceeded);/// # Ok(())/// # }/// ```#[macro_export]macro_rules! ensure {($cond:expr, $msg:literal $(,)?) => {if !$cond {return std::result::Result::Err($crate::anyhow!($msg));}};($cond:expr, $err:expr $(,)?) => {if !$cond {return std::result::Result::Err($crate::anyhow!($err));}};($cond:expr, $fmt:expr, $($arg:tt)*) => {if !$cond {return std::result::Result::Err($crate::anyhow!($fmt, $($arg)*));}};}/// Construct an ad-hoc error from a string.////// This evaluates to an `Error`. It can take either just a string, or a format/// string with arguments. It also can take any custom type which implements/// `Debug` and `Display`.////// # Example////// ```/// # type V = ();/// #/// use anyhow::{anyhow, Result};////// fn lookup(key: &str) -> Result<V> {/// if key.len() != 16 {/// return Err(anyhow!("key length must be 16 characters, got {:?}", key));/// }////// // .../// # Ok(())/// }/// ```#[macro_export]macro_rules! anyhow {($msg:literal $(,)?) => {// Handle $:literal as a special case to make cargo-expanded code more// concise in the common case.$crate::private::new_adhoc($msg)};($err:expr $(,)?) => ({#[allow(unused_imports)]use $crate::private::{AdhocKind, TraitKind};let error = $err;(&error).anyhow_kind().new(error)});($fmt:expr, $($arg:tt)*) => {$crate::private::new_adhoc(format!($fmt, $($arg)*))};}