mirror of
https://github.com/eyre-rs/eyre.git
synced 2025-10-02 15:26:08 +00:00
Merge pull request #31 from dtolnay/diagnostic
Work around bad diagnostic when missing Context import
This commit is contained in:
commit
fc44da4836
@ -1,4 +1,4 @@
|
|||||||
use crate::Error;
|
use crate::{Context, Error};
|
||||||
use std::convert::Infallible;
|
use std::convert::Infallible;
|
||||||
use std::error::Error as StdError;
|
use std::error::Error as StdError;
|
||||||
use std::fmt::{self, Debug, Display};
|
use std::fmt::{self, Debug, Display};
|
||||||
@ -6,65 +6,6 @@ use std::fmt::{self, Debug, Display};
|
|||||||
#[cfg(backtrace)]
|
#[cfg(backtrace)]
|
||||||
use std::backtrace::Backtrace;
|
use std::backtrace::Backtrace;
|
||||||
|
|
||||||
/// Provides the `context` method for `Result`.
|
|
||||||
///
|
|
||||||
/// This trait is sealed and cannot be implemented for types outside of
|
|
||||||
/// `anyhow`.
|
|
||||||
///
|
|
||||||
/// # Example
|
|
||||||
///
|
|
||||||
/// ```
|
|
||||||
/// use anyhow::{Context, Result};
|
|
||||||
/// use std::fs;
|
|
||||||
/// use std::path::PathBuf;
|
|
||||||
///
|
|
||||||
/// pub struct ImportantThing {
|
|
||||||
/// path: PathBuf,
|
|
||||||
/// }
|
|
||||||
///
|
|
||||||
/// impl ImportantThing {
|
|
||||||
/// # const IGNORE: &'static str = stringify! {
|
|
||||||
/// pub fn detach(&mut self) -> Result<()> {...}
|
|
||||||
/// # };
|
|
||||||
/// # fn detach(&mut self) -> Result<()> {
|
|
||||||
/// # unimplemented!()
|
|
||||||
/// # }
|
|
||||||
/// }
|
|
||||||
///
|
|
||||||
/// pub fn do_it(mut it: ImportantThing) -> Result<Vec<u8>> {
|
|
||||||
/// it.detach().context("failed to detach the important thing")?;
|
|
||||||
///
|
|
||||||
/// let path = &it.path;
|
|
||||||
/// let content = fs::read(path)
|
|
||||||
/// .with_context(|| format!("failed to read instrs from {}", path.display()))?;
|
|
||||||
///
|
|
||||||
/// Ok(content)
|
|
||||||
/// }
|
|
||||||
/// ```
|
|
||||||
///
|
|
||||||
/// When printed, the outermost context would be printed first and the lower
|
|
||||||
/// level underlying causes would be enumerated below.
|
|
||||||
///
|
|
||||||
/// ```console
|
|
||||||
/// Error: failed to read instrs from ./path/to/instrs.jsox
|
|
||||||
///
|
|
||||||
/// caused by:
|
|
||||||
/// No such file or directory (os error 2)
|
|
||||||
/// ```
|
|
||||||
pub trait Context<T, E>: private::Sealed {
|
|
||||||
/// Wrap the error value with additional context.
|
|
||||||
fn context<C>(self, context: C) -> Result<T, Error>
|
|
||||||
where
|
|
||||||
C: Display + Send + Sync + 'static;
|
|
||||||
|
|
||||||
/// Wrap the error value with additional context that is evaluated lazily
|
|
||||||
/// only once an error does occur.
|
|
||||||
fn with_context<C, F>(self, f: F) -> Result<T, Error>
|
|
||||||
where
|
|
||||||
C: Display + Send + Sync + 'static,
|
|
||||||
F: FnOnce() -> C;
|
|
||||||
}
|
|
||||||
|
|
||||||
mod ext {
|
mod ext {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
@ -209,7 +150,7 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mod private {
|
pub(crate) mod private {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
pub trait Sealed {}
|
pub trait Sealed {}
|
||||||
|
62
src/lib.rs
62
src/lib.rs
@ -183,7 +183,8 @@ mod kind;
|
|||||||
#[cfg(not(feature = "std"))]
|
#[cfg(not(feature = "std"))]
|
||||||
compile_error!("no_std support is not implemented yet");
|
compile_error!("no_std support is not implemented yet");
|
||||||
|
|
||||||
pub use crate::context::Context;
|
use std::fmt::Display;
|
||||||
|
|
||||||
pub use crate::error::{Chain, Error};
|
pub use crate::error::{Chain, Error};
|
||||||
|
|
||||||
/// `Result<T, Error>`
|
/// `Result<T, Error>`
|
||||||
@ -426,6 +427,65 @@ macro_rules! anyhow {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Provides the `context` method for `Result`.
|
||||||
|
///
|
||||||
|
/// This trait is sealed and cannot be implemented for types outside of
|
||||||
|
/// `anyhow`.
|
||||||
|
///
|
||||||
|
/// # Example
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// use anyhow::{Context, Result};
|
||||||
|
/// use std::fs;
|
||||||
|
/// use std::path::PathBuf;
|
||||||
|
///
|
||||||
|
/// pub struct ImportantThing {
|
||||||
|
/// path: PathBuf,
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// impl ImportantThing {
|
||||||
|
/// # const IGNORE: &'static str = stringify! {
|
||||||
|
/// pub fn detach(&mut self) -> Result<()> {...}
|
||||||
|
/// # };
|
||||||
|
/// # fn detach(&mut self) -> Result<()> {
|
||||||
|
/// # unimplemented!()
|
||||||
|
/// # }
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// pub fn do_it(mut it: ImportantThing) -> Result<Vec<u8>> {
|
||||||
|
/// it.detach().context("failed to detach the important thing")?;
|
||||||
|
///
|
||||||
|
/// let path = &it.path;
|
||||||
|
/// let content = fs::read(path)
|
||||||
|
/// .with_context(|| format!("failed to read instrs from {}", path.display()))?;
|
||||||
|
///
|
||||||
|
/// Ok(content)
|
||||||
|
/// }
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// When printed, the outermost context would be printed first and the lower
|
||||||
|
/// level underlying causes would be enumerated below.
|
||||||
|
///
|
||||||
|
/// ```console
|
||||||
|
/// Error: failed to read instrs from ./path/to/instrs.jsox
|
||||||
|
///
|
||||||
|
/// caused by:
|
||||||
|
/// No such file or directory (os error 2)
|
||||||
|
/// ```
|
||||||
|
pub trait Context<T, E>: context::private::Sealed {
|
||||||
|
/// Wrap the error value with additional context.
|
||||||
|
fn context<C>(self, context: C) -> Result<T, Error>
|
||||||
|
where
|
||||||
|
C: Display + Send + Sync + 'static;
|
||||||
|
|
||||||
|
/// Wrap the error value with additional context that is evaluated lazily
|
||||||
|
/// only once an error does occur.
|
||||||
|
fn with_context<C, F>(self, f: F) -> Result<T, Error>
|
||||||
|
where
|
||||||
|
C: Display + Send + Sync + 'static,
|
||||||
|
F: FnOnce() -> C;
|
||||||
|
}
|
||||||
|
|
||||||
// Not public API.
|
// Not public API.
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
pub mod private {
|
pub mod private {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user