Coverage Report

Created: 2026-02-14 07:02

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