Coverage Report

Created: 2024-10-16 07:58

/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 &ge; 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 &mdash; 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 &mdash; 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_err
Unexecuted 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_use
Unexecuted 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
}