/rust/registry/src/index.crates.io-6f17d22bba15001f/anyhow-1.0.86/src/lib.rs
| Line | Count | Source (jump to first uncovered line) | 
| 1 |  | //! [![github]](https://github.com/dtolnay/anyhow) [![crates-io]](https://crates.io/crates/anyhow) [![docs-rs]](https://docs.rs/anyhow) | 
| 2 |  | //! | 
| 3 |  | //! [github]: https://img.shields.io/badge/github-8da0cb?style=for-the-badge&labelColor=555555&logo=github | 
| 4 |  | //! [crates-io]: https://img.shields.io/badge/crates.io-fc8d62?style=for-the-badge&labelColor=555555&logo=rust | 
| 5 |  | //! [docs-rs]: https://img.shields.io/badge/docs.rs-66c2a5?style=for-the-badge&labelColor=555555&logo=docs.rs | 
| 6 |  | //! | 
| 7 |  | //! <br> | 
| 8 |  | //! | 
| 9 |  | //! This library provides [`anyhow::Error`][Error], a trait object based error | 
| 10 |  | //! type for easy idiomatic error handling in Rust applications. | 
| 11 |  | //! | 
| 12 |  | //! <br> | 
| 13 |  | //! | 
| 14 |  | //! # Details | 
| 15 |  | //! | 
| 16 |  | //! - Use `Result<T, anyhow::Error>`, or equivalently `anyhow::Result<T>`, as | 
| 17 |  | //!   the return type of any fallible function. | 
| 18 |  | //! | 
| 19 |  | //!   Within the function, use `?` to easily propagate any error that implements | 
| 20 |  | //!   the [`std::error::Error`] trait. | 
| 21 |  | //! | 
| 22 |  | //!   ``` | 
| 23 |  | //!   # pub trait Deserialize {} | 
| 24 |  | //!   # | 
| 25 |  | //!   # mod serde_json { | 
| 26 |  | //!   #     use super::Deserialize; | 
| 27 |  | //!   #     use std::io; | 
| 28 |  | //!   # | 
| 29 |  | //!   #     pub fn from_str<T: Deserialize>(json: &str) -> io::Result<T> { | 
| 30 |  | //!   #         unimplemented!() | 
| 31 |  | //!   #     } | 
| 32 |  | //!   # } | 
| 33 |  | //!   # | 
| 34 |  | //!   # struct ClusterMap; | 
| 35 |  | //!   # | 
| 36 |  | //!   # impl Deserialize for ClusterMap {} | 
| 37 |  | //!   # | 
| 38 |  | //!   use anyhow::Result; | 
| 39 |  | //! | 
| 40 |  | //!   fn get_cluster_info() -> Result<ClusterMap> { | 
| 41 |  | //!       let config = std::fs::read_to_string("cluster.json")?; | 
| 42 |  | //!       let map: ClusterMap = serde_json::from_str(&config)?; | 
| 43 |  | //!       Ok(map) | 
| 44 |  | //!   } | 
| 45 |  | //!   # | 
| 46 |  | //!   # fn main() {} | 
| 47 |  | //!   ``` | 
| 48 |  | //! | 
| 49 |  | //! - Attach context to help the person troubleshooting the error understand | 
| 50 |  | //!   where things went wrong. A low-level error like "No such file or | 
| 51 |  | //!   directory" can be annoying to debug without more context about what higher | 
| 52 |  | //!   level step the application was in the middle of. | 
| 53 |  | //! | 
| 54 |  | //!   ``` | 
| 55 |  | //!   # struct It; | 
| 56 |  | //!   # | 
| 57 |  | //!   # impl It { | 
| 58 |  | //!   #     fn detach(&self) -> Result<()> { | 
| 59 |  | //!   #         unimplemented!() | 
| 60 |  | //!   #     } | 
| 61 |  | //!   # } | 
| 62 |  | //!   # | 
| 63 |  | //!   use anyhow::{Context, Result}; | 
| 64 |  | //! | 
| 65 |  | //!   fn main() -> Result<()> { | 
| 66 |  | //!       # return Ok(()); | 
| 67 |  | //!       # | 
| 68 |  | //!       # const _: &str = stringify! { | 
| 69 |  | //!       ... | 
| 70 |  | //!       # }; | 
| 71 |  | //!       # | 
| 72 |  | //!       # let it = It; | 
| 73 |  | //!       # let path = "./path/to/instrs.json"; | 
| 74 |  | //!       # | 
| 75 |  | //!       it.detach().context("Failed to detach the important thing")?; | 
| 76 |  | //! | 
| 77 |  | //!       let content = std::fs::read(path) | 
| 78 |  | //!           .with_context(|| format!("Failed to read instrs from {}", path))?; | 
| 79 |  | //!       # | 
| 80 |  | //!       # const _: &str = stringify! { | 
| 81 |  | //!       ... | 
| 82 |  | //!       # }; | 
| 83 |  | //!       # | 
| 84 |  | //!       # Ok(()) | 
| 85 |  | //!   } | 
| 86 |  | //!   ``` | 
| 87 |  | //! | 
| 88 |  | //!   ```console | 
| 89 |  | //!   Error: Failed to read instrs from ./path/to/instrs.json | 
| 90 |  | //! | 
| 91 |  | //!   Caused by: | 
| 92 |  | //!       No such file or directory (os error 2) | 
| 93 |  | //!   ``` | 
| 94 |  | //! | 
| 95 |  | //! - Downcasting is supported and can be by value, by shared reference, or by | 
| 96 |  | //!   mutable reference as needed. | 
| 97 |  | //! | 
| 98 |  | //!   ``` | 
| 99 |  | //!   # use anyhow::anyhow; | 
| 100 |  | //!   # use std::fmt::{self, Display}; | 
| 101 |  | //!   # use std::task::Poll; | 
| 102 |  | //!   # | 
| 103 |  | //!   # #[derive(Debug)] | 
| 104 |  | //!   # enum DataStoreError { | 
| 105 |  | //!   #     Censored(()), | 
| 106 |  | //!   # } | 
| 107 |  | //!   # | 
| 108 |  | //!   # impl Display for DataStoreError { | 
| 109 |  | //!   #     fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { | 
| 110 |  | //!   #         unimplemented!() | 
| 111 |  | //!   #     } | 
| 112 |  | //!   # } | 
| 113 |  | //!   # | 
| 114 |  | //!   # impl std::error::Error for DataStoreError {} | 
| 115 |  | //!   # | 
| 116 |  | //!   # const REDACTED_CONTENT: () = (); | 
| 117 |  | //!   # | 
| 118 |  | //!   # let error = anyhow!("..."); | 
| 119 |  | //!   # let root_cause = &error; | 
| 120 |  | //!   # | 
| 121 |  | //!   # let ret = | 
| 122 |  | //!   // If the error was caused by redaction, then return a | 
| 123 |  | //!   // tombstone instead of the content. | 
| 124 |  | //!   match root_cause.downcast_ref::<DataStoreError>() { | 
| 125 |  | //!       Some(DataStoreError::Censored(_)) => Ok(Poll::Ready(REDACTED_CONTENT)), | 
| 126 |  | //!       None => Err(error), | 
| 127 |  | //!   } | 
| 128 |  | //!   # ; | 
| 129 |  | //!   ``` | 
| 130 |  | //! | 
| 131 |  | //! - If using Rust ≥ 1.65, a backtrace is captured and printed with the | 
| 132 |  | //!   error if the underlying error type does not already provide its own. In | 
| 133 |  | //!   order to see backtraces, they must be enabled through the environment | 
| 134 |  | //!   variables described in [`std::backtrace`]: | 
| 135 |  | //! | 
| 136 |  | //!   - If you want panics and errors to both have backtraces, set | 
| 137 |  | //!     `RUST_BACKTRACE=1`; | 
| 138 |  | //!   - If you want only errors to have backtraces, set `RUST_LIB_BACKTRACE=1`; | 
| 139 |  | //!   - If you want only panics to have backtraces, set `RUST_BACKTRACE=1` and | 
| 140 |  | //!     `RUST_LIB_BACKTRACE=0`. | 
| 141 |  | //! | 
| 142 |  | //!   [`std::backtrace`]: https://doc.rust-lang.org/std/backtrace/index.html#environment-variables | 
| 143 |  | //! | 
| 144 |  | //! - Anyhow works with any error type that has an impl of `std::error::Error`, | 
| 145 |  | //!   including ones defined in your crate. We do not bundle a `derive(Error)` | 
| 146 |  | //!   macro but you can write the impls yourself or use a standalone macro like | 
| 147 |  | //!   [thiserror]. | 
| 148 |  | //! | 
| 149 |  | //!   [thiserror]: https://github.com/dtolnay/thiserror | 
| 150 |  | //! | 
| 151 |  | //!   ``` | 
| 152 |  | //!   use thiserror::Error; | 
| 153 |  | //! | 
| 154 |  | //!   #[derive(Error, Debug)] | 
| 155 |  | //!   pub enum FormatError { | 
| 156 |  | //!       #[error("Invalid header (expected {expected:?}, got {found:?})")] | 
| 157 |  | //!       InvalidHeader { | 
| 158 |  | //!           expected: String, | 
| 159 |  | //!           found: String, | 
| 160 |  | //!       }, | 
| 161 |  | //!       #[error("Missing attribute: {0}")] | 
| 162 |  | //!       MissingAttribute(String), | 
| 163 |  | //!   } | 
| 164 |  | //!   ``` | 
| 165 |  | //! | 
| 166 |  | //! - One-off error messages can be constructed using the `anyhow!` macro, which | 
| 167 |  | //!   supports string interpolation and produces an `anyhow::Error`. | 
| 168 |  | //! | 
| 169 |  | //!   ``` | 
| 170 |  | //!   # use anyhow::{anyhow, Result}; | 
| 171 |  | //!   # | 
| 172 |  | //!   # fn demo() -> Result<()> { | 
| 173 |  | //!   #     let missing = "..."; | 
| 174 |  | //!   return Err(anyhow!("Missing attribute: {}", missing)); | 
| 175 |  | //!   #     Ok(()) | 
| 176 |  | //!   # } | 
| 177 |  | //!   ``` | 
| 178 |  | //! | 
| 179 |  | //!   A `bail!` macro is provided as a shorthand for the same early return. | 
| 180 |  | //! | 
| 181 |  | //!   ``` | 
| 182 |  | //!   # use anyhow::{bail, Result}; | 
| 183 |  | //!   # | 
| 184 |  | //!   # fn demo() -> Result<()> { | 
| 185 |  | //!   #     let missing = "..."; | 
| 186 |  | //!   bail!("Missing attribute: {}", missing); | 
| 187 |  | //!   #     Ok(()) | 
| 188 |  | //!   # } | 
| 189 |  | //!   ``` | 
| 190 |  | //! | 
| 191 |  | //! <br> | 
| 192 |  | //! | 
| 193 |  | //! # No-std support | 
| 194 |  | //! | 
| 195 |  | //! In no_std mode, almost all of the same API is available and works the same | 
| 196 |  | //! way. To depend on Anyhow in no_std mode, disable our default enabled "std" | 
| 197 |  | //! feature in Cargo.toml. A global allocator is required. | 
| 198 |  | //! | 
| 199 |  | //! ```toml | 
| 200 |  | //! [dependencies] | 
| 201 |  | //! anyhow = { version = "1.0", default-features = false } | 
| 202 |  | //! ``` | 
| 203 |  | //! | 
| 204 |  | //! Since the `?`-based error conversions would normally rely on the | 
| 205 |  | //! `std::error::Error` trait which is only available through std, no_std mode | 
| 206 |  | //! will require an explicit `.map_err(Error::msg)` when working with a | 
| 207 |  | //! non-Anyhow error type inside a function that returns Anyhow's error type. | 
| 208 |  |  | 
| 209 |  | #![doc(html_root_url = "https://docs.rs/anyhow/1.0.85")] | 
| 210 |  | #![cfg_attr(error_generic_member_access, feature(error_generic_member_access))] | 
| 211 |  | #![cfg_attr(doc_cfg, feature(doc_cfg))] | 
| 212 |  | #![no_std] | 
| 213 |  | #![deny(dead_code, unused_imports, unused_mut)] | 
| 214 |  | #![cfg_attr( | 
| 215 |  |     not(anyhow_no_unsafe_op_in_unsafe_fn_lint), | 
| 216 |  |     deny(unsafe_op_in_unsafe_fn) | 
| 217 |  | )] | 
| 218 |  | #![cfg_attr(anyhow_no_unsafe_op_in_unsafe_fn_lint, allow(unused_unsafe))] | 
| 219 |  | #![allow( | 
| 220 |  |     clippy::doc_markdown, | 
| 221 |  |     clippy::enum_glob_use, | 
| 222 |  |     clippy::explicit_auto_deref, | 
| 223 |  |     clippy::extra_unused_type_parameters, | 
| 224 |  |     clippy::incompatible_msrv, | 
| 225 |  |     clippy::let_underscore_untyped, | 
| 226 |  |     clippy::missing_errors_doc, | 
| 227 |  |     clippy::missing_panics_doc, | 
| 228 |  |     clippy::module_name_repetitions, | 
| 229 |  |     clippy::must_use_candidate, | 
| 230 |  |     clippy::needless_doctest_main, | 
| 231 |  |     clippy::new_ret_no_self, | 
| 232 |  |     clippy::redundant_else, | 
| 233 |  |     clippy::return_self_not_must_use, | 
| 234 |  |     clippy::struct_field_names, | 
| 235 |  |     clippy::unused_self, | 
| 236 |  |     clippy::used_underscore_binding, | 
| 237 |  |     clippy::wildcard_imports, | 
| 238 |  |     clippy::wrong_self_convention | 
| 239 |  | )] | 
| 240 |  |  | 
| 241 |  | #[cfg(all( | 
| 242 |  |     anyhow_nightly_testing, | 
| 243 |  |     feature = "std", | 
| 244 |  |     not(error_generic_member_access) | 
| 245 |  | ))] | 
| 246 |  | compile_error!("Build script probe failed to compile."); | 
| 247 |  |  | 
| 248 |  | extern crate alloc; | 
| 249 |  |  | 
| 250 |  | #[cfg(feature = "std")] | 
| 251 |  | extern crate std; | 
| 252 |  |  | 
| 253 |  | #[macro_use] | 
| 254 |  | mod backtrace; | 
| 255 |  | mod chain; | 
| 256 |  | mod context; | 
| 257 |  | mod ensure; | 
| 258 |  | mod error; | 
| 259 |  | mod fmt; | 
| 260 |  | mod kind; | 
| 261 |  | mod macros; | 
| 262 |  | mod ptr; | 
| 263 |  | mod wrapper; | 
| 264 |  |  | 
| 265 |  | use crate::error::ErrorImpl; | 
| 266 |  | use crate::ptr::Own; | 
| 267 |  | use core::fmt::Display; | 
| 268 |  |  | 
| 269 |  | #[cfg(not(feature = "std"))] | 
| 270 |  | use core::fmt::Debug; | 
| 271 |  |  | 
| 272 |  | #[cfg(feature = "std")] | 
| 273 |  | use std::error::Error as StdError; | 
| 274 |  |  | 
| 275 |  | #[cfg(not(feature = "std"))] | 
| 276 |  | trait StdError: Debug + Display { | 
| 277 |  |     fn source(&self) -> Option<&(dyn StdError + 'static)> { | 
| 278 |  |         None | 
| 279 |  |     } | 
| 280 |  | } | 
| 281 |  |  | 
| 282 |  | #[doc(no_inline)] | 
| 283 |  | pub use anyhow as format_err; | 
| 284 |  |  | 
| 285 |  | /// The `Error` type, a wrapper around a dynamic error type. | 
| 286 |  | /// | 
| 287 |  | /// `Error` works a lot like `Box<dyn std::error::Error>`, but with these | 
| 288 |  | /// differences: | 
| 289 |  | /// | 
| 290 |  | /// - `Error` requires that the error is `Send`, `Sync`, and `'static`. | 
| 291 |  | /// - `Error` guarantees that a backtrace is available, even if the underlying | 
| 292 |  | ///   error type does not provide one. | 
| 293 |  | /// - `Error` is represented as a narrow pointer — exactly one word in | 
| 294 |  | ///   size instead of two. | 
| 295 |  | /// | 
| 296 |  | /// <br> | 
| 297 |  | /// | 
| 298 |  | /// # Display representations | 
| 299 |  | /// | 
| 300 |  | /// When you print an error object using "{}" or to_string(), only the outermost | 
| 301 |  | /// underlying error or context is printed, not any of the lower level causes. | 
| 302 |  | /// This is exactly as if you had called the Display impl of the error from | 
| 303 |  | /// which you constructed your anyhow::Error. | 
| 304 |  | /// | 
| 305 |  | /// ```console | 
| 306 |  | /// Failed to read instrs from ./path/to/instrs.json | 
| 307 |  | /// ``` | 
| 308 |  | /// | 
| 309 |  | /// To print causes as well using anyhow's default formatting of causes, use the | 
| 310 |  | /// alternate selector "{:#}". | 
| 311 |  | /// | 
| 312 |  | /// ```console | 
| 313 |  | /// Failed to read instrs from ./path/to/instrs.json: No such file or directory (os error 2) | 
| 314 |  | /// ``` | 
| 315 |  | /// | 
| 316 |  | /// The Debug format "{:?}" includes your backtrace if one was captured. Note | 
| 317 |  | /// that this is the representation you get by default if you return an error | 
| 318 |  | /// from `fn main` instead of printing it explicitly yourself. | 
| 319 |  | /// | 
| 320 |  | /// ```console | 
| 321 |  | /// Error: Failed to read instrs from ./path/to/instrs.json | 
| 322 |  | /// | 
| 323 |  | /// Caused by: | 
| 324 |  | ///     No such file or directory (os error 2) | 
| 325 |  | /// ``` | 
| 326 |  | /// | 
| 327 |  | /// and if there is a backtrace available: | 
| 328 |  | /// | 
| 329 |  | /// ```console | 
| 330 |  | /// Error: Failed to read instrs from ./path/to/instrs.json | 
| 331 |  | /// | 
| 332 |  | /// Caused by: | 
| 333 |  | ///     No such file or directory (os error 2) | 
| 334 |  | /// | 
| 335 |  | /// Stack backtrace: | 
| 336 |  | ///    0: <E as anyhow::context::ext::StdError>::ext_context | 
| 337 |  | ///              at /git/anyhow/src/backtrace.rs:26 | 
| 338 |  | ///    1: core::result::Result<T,E>::map_err | 
| 339 |  | ///              at /git/rustc/src/libcore/result.rs:596 | 
| 340 |  | ///    2: anyhow::context::<impl anyhow::Context<T,E> for core::result::Result<T,E>>::with_context | 
| 341 |  | ///              at /git/anyhow/src/context.rs:58 | 
| 342 |  | ///    3: testing::main | 
| 343 |  | ///              at src/main.rs:5 | 
| 344 |  | ///    4: std::rt::lang_start | 
| 345 |  | ///              at /git/rustc/src/libstd/rt.rs:61 | 
| 346 |  | ///    5: main | 
| 347 |  | ///    6: __libc_start_main | 
| 348 |  | ///    7: _start | 
| 349 |  | /// ``` | 
| 350 |  | /// | 
| 351 |  | /// To see a conventional struct-style Debug representation, use "{:#?}". | 
| 352 |  | /// | 
| 353 |  | /// ```console | 
| 354 |  | /// Error { | 
| 355 |  | ///     context: "Failed to read instrs from ./path/to/instrs.json", | 
| 356 |  | ///     source: Os { | 
| 357 |  | ///         code: 2, | 
| 358 |  | ///         kind: NotFound, | 
| 359 |  | ///         message: "No such file or directory", | 
| 360 |  | ///     }, | 
| 361 |  | /// } | 
| 362 |  | /// ``` | 
| 363 |  | /// | 
| 364 |  | /// If none of the built-in representations are appropriate and you would prefer | 
| 365 |  | /// to render the error and its cause chain yourself, it can be done something | 
| 366 |  | /// like this: | 
| 367 |  | /// | 
| 368 |  | /// ``` | 
| 369 |  | /// use anyhow::{Context, Result}; | 
| 370 |  | /// | 
| 371 |  | /// fn main() { | 
| 372 |  | ///     if let Err(err) = try_main() { | 
| 373 |  | ///         eprintln!("ERROR: {}", err); | 
| 374 |  | ///         err.chain().skip(1).for_each(|cause| eprintln!("because: {}", cause)); | 
| 375 |  | ///         std::process::exit(1); | 
| 376 |  | ///     } | 
| 377 |  | /// } | 
| 378 |  | /// | 
| 379 |  | /// fn try_main() -> Result<()> { | 
| 380 |  | ///     # const IGNORE: &str = stringify! { | 
| 381 |  | ///     ... | 
| 382 |  | ///     # }; | 
| 383 |  | ///     # Ok(()) | 
| 384 |  | /// } | 
| 385 |  | /// ``` | 
| 386 |  | #[repr(transparent)] | 
| 387 |  | pub struct Error { | 
| 388 |  |     inner: Own<ErrorImpl>, | 
| 389 |  | } | 
| 390 |  |  | 
| 391 |  | /// Iterator of a chain of source errors. | 
| 392 |  | /// | 
| 393 |  | /// This type is the iterator returned by [`Error::chain`]. | 
| 394 |  | /// | 
| 395 |  | /// # Example | 
| 396 |  | /// | 
| 397 |  | /// ``` | 
| 398 |  | /// use anyhow::Error; | 
| 399 |  | /// use std::io; | 
| 400 |  | /// | 
| 401 |  | /// pub fn underlying_io_error_kind(error: &Error) -> Option<io::ErrorKind> { | 
| 402 |  | ///     for cause in error.chain() { | 
| 403 |  | ///         if let Some(io_error) = cause.downcast_ref::<io::Error>() { | 
| 404 |  | ///             return Some(io_error.kind()); | 
| 405 |  | ///         } | 
| 406 |  | ///     } | 
| 407 |  | ///     None | 
| 408 |  | /// } | 
| 409 |  | /// ``` | 
| 410 |  | #[cfg(feature = "std")] | 
| 411 |  | #[cfg_attr(doc_cfg, doc(cfg(feature = "std")))] | 
| 412 |  | #[derive(Clone)] | 
| 413 |  | pub struct Chain<'a> { | 
| 414 |  |     state: crate::chain::ChainState<'a>, | 
| 415 |  | } | 
| 416 |  |  | 
| 417 |  | /// `Result<T, Error>` | 
| 418 |  | /// | 
| 419 |  | /// This is a reasonable return type to use throughout your application but also | 
| 420 |  | /// for `fn main`; if you do, failures will be printed along with any | 
| 421 |  | /// [context][Context] and a backtrace if one was captured. | 
| 422 |  | /// | 
| 423 |  | /// `anyhow::Result` may be used with one *or* two type parameters. | 
| 424 |  | /// | 
| 425 |  | /// ```rust | 
| 426 |  | /// use anyhow::Result; | 
| 427 |  | /// | 
| 428 |  | /// # const IGNORE: &str = stringify! { | 
| 429 |  | /// fn demo1() -> Result<T> {...} | 
| 430 |  | ///            // ^ equivalent to std::result::Result<T, anyhow::Error> | 
| 431 |  | /// | 
| 432 |  | /// fn demo2() -> Result<T, OtherError> {...} | 
| 433 |  | ///            // ^ equivalent to std::result::Result<T, OtherError> | 
| 434 |  | /// # }; | 
| 435 |  | /// ``` | 
| 436 |  | /// | 
| 437 |  | /// # Example | 
| 438 |  | /// | 
| 439 |  | /// ``` | 
| 440 |  | /// # pub trait Deserialize {} | 
| 441 |  | /// # | 
| 442 |  | /// # mod serde_json { | 
| 443 |  | /// #     use super::Deserialize; | 
| 444 |  | /// #     use std::io; | 
| 445 |  | /// # | 
| 446 |  | /// #     pub fn from_str<T: Deserialize>(json: &str) -> io::Result<T> { | 
| 447 |  | /// #         unimplemented!() | 
| 448 |  | /// #     } | 
| 449 |  | /// # } | 
| 450 |  | /// # | 
| 451 |  | /// # #[derive(Debug)] | 
| 452 |  | /// # struct ClusterMap; | 
| 453 |  | /// # | 
| 454 |  | /// # impl Deserialize for ClusterMap {} | 
| 455 |  | /// # | 
| 456 |  | /// use anyhow::Result; | 
| 457 |  | /// | 
| 458 |  | /// fn main() -> Result<()> { | 
| 459 |  | ///     # return Ok(()); | 
| 460 |  | ///     let config = std::fs::read_to_string("cluster.json")?; | 
| 461 |  | ///     let map: ClusterMap = serde_json::from_str(&config)?; | 
| 462 |  | ///     println!("cluster info: {:#?}", map); | 
| 463 |  | ///     Ok(()) | 
| 464 |  | /// } | 
| 465 |  | /// ``` | 
| 466 |  | pub type Result<T, E = Error> = core::result::Result<T, E>; | 
| 467 |  |  | 
| 468 |  | /// Provides the `context` method for `Result`. | 
| 469 |  | /// | 
| 470 |  | /// This trait is sealed and cannot be implemented for types outside of | 
| 471 |  | /// `anyhow`. | 
| 472 |  | /// | 
| 473 |  | /// <br> | 
| 474 |  | /// | 
| 475 |  | /// # Example | 
| 476 |  | /// | 
| 477 |  | /// ``` | 
| 478 |  | /// use anyhow::{Context, Result}; | 
| 479 |  | /// use std::fs; | 
| 480 |  | /// use std::path::PathBuf; | 
| 481 |  | /// | 
| 482 |  | /// pub struct ImportantThing { | 
| 483 |  | ///     path: PathBuf, | 
| 484 |  | /// } | 
| 485 |  | /// | 
| 486 |  | /// impl ImportantThing { | 
| 487 |  | ///     # const IGNORE: &'static str = stringify! { | 
| 488 |  | ///     pub fn detach(&mut self) -> Result<()> {...} | 
| 489 |  | ///     # }; | 
| 490 |  | ///     # fn detach(&mut self) -> Result<()> { | 
| 491 |  | ///     #     unimplemented!() | 
| 492 |  | ///     # } | 
| 493 |  | /// } | 
| 494 |  | /// | 
| 495 |  | /// pub fn do_it(mut it: ImportantThing) -> Result<Vec<u8>> { | 
| 496 |  | ///     it.detach().context("Failed to detach the important thing")?; | 
| 497 |  | /// | 
| 498 |  | ///     let path = &it.path; | 
| 499 |  | ///     let content = fs::read(path) | 
| 500 |  | ///         .with_context(|| format!("Failed to read instrs from {}", path.display()))?; | 
| 501 |  | /// | 
| 502 |  | ///     Ok(content) | 
| 503 |  | /// } | 
| 504 |  | /// ``` | 
| 505 |  | /// | 
| 506 |  | /// When printed, the outermost context would be printed first and the lower | 
| 507 |  | /// level underlying causes would be enumerated below. | 
| 508 |  | /// | 
| 509 |  | /// ```console | 
| 510 |  | /// Error: Failed to read instrs from ./path/to/instrs.json | 
| 511 |  | /// | 
| 512 |  | /// Caused by: | 
| 513 |  | ///     No such file or directory (os error 2) | 
| 514 |  | /// ``` | 
| 515 |  | /// | 
| 516 |  | /// Refer to the [Display representations] documentation for other forms in | 
| 517 |  | /// which this context chain can be rendered. | 
| 518 |  | /// | 
| 519 |  | /// [Display representations]: Error#display-representations | 
| 520 |  | /// | 
| 521 |  | /// <br> | 
| 522 |  | /// | 
| 523 |  | /// # Effect on downcasting | 
| 524 |  | /// | 
| 525 |  | /// After attaching context of type `C` onto an error of type `E`, the resulting | 
| 526 |  | /// `anyhow::Error` may be downcast to `C` **or** to `E`. | 
| 527 |  | /// | 
| 528 |  | /// That is, in codebases that rely on downcasting, Anyhow's context supports | 
| 529 |  | /// both of the following use cases: | 
| 530 |  | /// | 
| 531 |  | ///   - **Attaching context whose type is insignificant onto errors whose type | 
| 532 |  | ///     is used in downcasts.** | 
| 533 |  | /// | 
| 534 |  | ///     In other error libraries whose context is not designed this way, it can | 
| 535 |  | ///     be risky to introduce context to existing code because new context might | 
| 536 |  | ///     break existing working downcasts. In Anyhow, any downcast that worked | 
| 537 |  | ///     before adding context will continue to work after you add a context, so | 
| 538 |  | ///     you should freely add human-readable context to errors wherever it would | 
| 539 |  | ///     be helpful. | 
| 540 |  | /// | 
| 541 |  | ///     ``` | 
| 542 |  | ///     # use anyhow::bail; | 
| 543 |  | ///     # use thiserror::Error; | 
| 544 |  | ///     # | 
| 545 |  | ///     # #[derive(Error, Debug)] | 
| 546 |  | ///     # #[error("???")] | 
| 547 |  | ///     # struct SuspiciousError; | 
| 548 |  | ///     # | 
| 549 |  | ///     # fn helper() -> Result<()> { | 
| 550 |  | ///     #     bail!(SuspiciousError); | 
| 551 |  | ///     # } | 
| 552 |  | ///     # | 
| 553 |  | ///     use anyhow::{Context, Result}; | 
| 554 |  | /// | 
| 555 |  | ///     fn do_it() -> Result<()> { | 
| 556 |  | ///         helper().context("Failed to complete the work")?; | 
| 557 |  | ///         # const IGNORE: &str = stringify! { | 
| 558 |  | ///         ... | 
| 559 |  | ///         # }; | 
| 560 |  | ///         # unreachable!() | 
| 561 |  | ///     } | 
| 562 |  | /// | 
| 563 |  | ///     fn main() { | 
| 564 |  | ///         let err = do_it().unwrap_err(); | 
| 565 |  | ///         if let Some(e) = err.downcast_ref::<SuspiciousError>() { | 
| 566 |  | ///             // If helper() returned SuspiciousError, this downcast will | 
| 567 |  | ///             // correctly succeed even with the context in between. | 
| 568 |  | ///             # return; | 
| 569 |  | ///         } | 
| 570 |  | ///         # panic!("expected downcast to succeed"); | 
| 571 |  | ///     } | 
| 572 |  | ///     ``` | 
| 573 |  | /// | 
| 574 |  | ///   - **Attaching context whose type is used in downcasts onto errors whose | 
| 575 |  | ///     type is insignificant.** | 
| 576 |  | /// | 
| 577 |  | ///     Some codebases prefer to use machine-readable context to categorize | 
| 578 |  | ///     lower level errors in a way that will be actionable to higher levels of | 
| 579 |  | ///     the application. | 
| 580 |  | /// | 
| 581 |  | ///     ``` | 
| 582 |  | ///     # use anyhow::bail; | 
| 583 |  | ///     # use thiserror::Error; | 
| 584 |  | ///     # | 
| 585 |  | ///     # #[derive(Error, Debug)] | 
| 586 |  | ///     # #[error("???")] | 
| 587 |  | ///     # struct HelperFailed; | 
| 588 |  | ///     # | 
| 589 |  | ///     # fn helper() -> Result<()> { | 
| 590 |  | ///     #     bail!("no such file or directory"); | 
| 591 |  | ///     # } | 
| 592 |  | ///     # | 
| 593 |  | ///     use anyhow::{Context, Result}; | 
| 594 |  | /// | 
| 595 |  | ///     fn do_it() -> Result<()> { | 
| 596 |  | ///         helper().context(HelperFailed)?; | 
| 597 |  | ///         # const IGNORE: &str = stringify! { | 
| 598 |  | ///         ... | 
| 599 |  | ///         # }; | 
| 600 |  | ///         # unreachable!() | 
| 601 |  | ///     } | 
| 602 |  | /// | 
| 603 |  | ///     fn main() { | 
| 604 |  | ///         let err = do_it().unwrap_err(); | 
| 605 |  | ///         if let Some(e) = err.downcast_ref::<HelperFailed>() { | 
| 606 |  | ///             // If helper failed, this downcast will succeed because | 
| 607 |  | ///             // HelperFailed is the context that has been attached to | 
| 608 |  | ///             // that error. | 
| 609 |  | ///             # return; | 
| 610 |  | ///         } | 
| 611 |  | ///         # panic!("expected downcast to succeed"); | 
| 612 |  | ///     } | 
| 613 |  | ///     ``` | 
| 614 |  | pub trait Context<T, E>: context::private::Sealed { | 
| 615 |  |     /// Wrap the error value with additional context. | 
| 616 |  |     fn context<C>(self, context: C) -> Result<T, Error> | 
| 617 |  |     where | 
| 618 |  |         C: Display + Send + Sync + 'static; | 
| 619 |  |  | 
| 620 |  |     /// Wrap the error value with additional context that is evaluated lazily | 
| 621 |  |     /// only once an error does occur. | 
| 622 |  |     fn with_context<C, F>(self, f: F) -> Result<T, Error> | 
| 623 |  |     where | 
| 624 |  |         C: Display + Send + Sync + 'static, | 
| 625 |  |         F: FnOnce() -> C; | 
| 626 |  | } | 
| 627 |  |  | 
| 628 |  | /// Equivalent to Ok::<_, anyhow::Error>(value). | 
| 629 |  | /// | 
| 630 |  | /// This simplifies creation of an anyhow::Result in places where type inference | 
| 631 |  | /// cannot deduce the `E` type of the result — without needing to write | 
| 632 |  | /// `Ok::<_, anyhow::Error>(value)`. | 
| 633 |  | /// | 
| 634 |  | /// One might think that `anyhow::Result::Ok(value)` would work in such cases | 
| 635 |  | /// but it does not. | 
| 636 |  | /// | 
| 637 |  | /// ```console | 
| 638 |  | /// error[E0282]: type annotations needed for `std::result::Result<i32, E>` | 
| 639 |  | ///   --> src/main.rs:11:13 | 
| 640 |  | ///    | | 
| 641 |  | /// 11 |     let _ = anyhow::Result::Ok(1); | 
| 642 |  | ///    |         -   ^^^^^^^^^^^^^^^^^^ cannot infer type for type parameter `E` declared on the enum `Result` | 
| 643 |  | ///    |         | | 
| 644 |  | ///    |         consider giving this pattern the explicit type `std::result::Result<i32, E>`, where the type parameter `E` is specified | 
| 645 |  | /// ``` | 
| 646 |  | #[allow(non_snake_case)] | 
| 647 | 0 | pub fn Ok<T>(t: T) -> Result<T> { | 
| 648 | 0 |     Result::Ok(t) | 
| 649 | 0 | } | 
| 650 |  |  | 
| 651 |  | // Not public API. Referenced by macro-generated code. | 
| 652 |  | #[doc(hidden)] | 
| 653 |  | pub mod __private { | 
| 654 |  |     use self::not::Bool; | 
| 655 |  |     use crate::Error; | 
| 656 |  |     use alloc::fmt; | 
| 657 |  |     use core::fmt::Arguments; | 
| 658 |  |  | 
| 659 |  |     #[doc(hidden)] | 
| 660 |  |     pub use crate::ensure::{BothDebug, NotBothDebug}; | 
| 661 |  |     #[doc(hidden)] | 
| 662 |  |     pub use alloc::format; | 
| 663 |  |     #[doc(hidden)] | 
| 664 |  |     pub use core::result::Result::Err; | 
| 665 |  |     #[doc(hidden)] | 
| 666 |  |     pub use core::{concat, format_args, stringify}; | 
| 667 |  |  | 
| 668 |  |     #[doc(hidden)] | 
| 669 |  |     pub mod kind { | 
| 670 |  |         #[doc(hidden)] | 
| 671 |  |         pub use crate::kind::{AdhocKind, TraitKind}; | 
| 672 |  |  | 
| 673 |  |         #[cfg(feature = "std")] | 
| 674 |  |         #[doc(hidden)] | 
| 675 |  |         pub use crate::kind::BoxedKind; | 
| 676 |  |     } | 
| 677 |  |  | 
| 678 |  |     #[doc(hidden)] | 
| 679 |  |     #[inline] | 
| 680 |  |     #[cold] | 
| 681 | 0 |     pub fn format_err(args: Arguments) -> Error { | 
| 682 | 0 |         #[cfg(anyhow_no_fmt_arguments_as_str)] | 
| 683 | 0 |         let fmt_arguments_as_str = None::<&str>; | 
| 684 | 0 |         #[cfg(not(anyhow_no_fmt_arguments_as_str))] | 
| 685 | 0 |         let fmt_arguments_as_str = args.as_str(); | 
| 686 |  |  | 
| 687 | 0 |         if let Some(message) = fmt_arguments_as_str { | 
| 688 |  |             // anyhow!("literal"), can downcast to &'static str | 
| 689 | 0 |             Error::msg(message) | 
| 690 |  |         } else { | 
| 691 |  |             // anyhow!("interpolate {var}"), can downcast to String | 
| 692 | 0 |             Error::msg(fmt::format(args)) | 
| 693 |  |         } | 
| 694 | 0 |     } Unexecuted instantiation: anyhow::__private::format_errUnexecuted instantiation: anyhow::__private::format_err | 
| 695 |  |  | 
| 696 |  |     #[doc(hidden)] | 
| 697 |  |     #[inline] | 
| 698 |  |     #[cold] | 
| 699 |  |     #[must_use] | 
| 700 | 0 |     pub fn must_use(error: Error) -> Error { | 
| 701 | 0 |         error | 
| 702 | 0 |     } Unexecuted instantiation: anyhow::__private::must_useUnexecuted instantiation: anyhow::__private::must_use | 
| 703 |  |  | 
| 704 |  |     #[doc(hidden)] | 
| 705 |  |     #[inline] | 
| 706 | 0 |     pub fn not(cond: impl Bool) -> bool { | 
| 707 | 0 |         cond.not() | 
| 708 | 0 |     } | 
| 709 |  |  | 
| 710 |  |     mod not { | 
| 711 |  |         #[doc(hidden)] | 
| 712 |  |         pub trait Bool { | 
| 713 |  |             fn not(self) -> bool; | 
| 714 |  |         } | 
| 715 |  |  | 
| 716 |  |         impl Bool for bool { | 
| 717 |  |             #[inline] | 
| 718 | 0 |             fn not(self) -> bool { | 
| 719 | 0 |                 !self | 
| 720 | 0 |             } | 
| 721 |  |         } | 
| 722 |  |  | 
| 723 |  |         impl Bool for &bool { | 
| 724 |  |             #[inline] | 
| 725 | 0 |             fn not(self) -> bool { | 
| 726 | 0 |                 !*self | 
| 727 | 0 |             } | 
| 728 |  |         } | 
| 729 |  |     } | 
| 730 |  | } |