2 releases

0.1.1 Sep 16, 2019
0.1.0 Sep 16, 2019

#20 in #error-context

CC0 license

5KB

This crate provides a single trait, ErrWith, with one method, err_with. ErrWith is implemented for Result<T, E>, with result.err_with(w) transforming an Err(e) to an Err((e,w)), and leaving an Ok(...) unchanged.

This is not particularly useful on its own, but can be used to define conversions from (E, W) into your custom error types, so error contexts can be recorded and reported later.

For example:

use std::{fs, io, path::{Path, PathBuf}};

use err_with::ErrWith;

// Given this custom error type:
#[derive(Debug)]
enum Error {
  Io { io_error: io::Error, path: PathBuf },
}

// We can define a conversion from `(io::Error, AsRef<Path>)` to our
// custom error type:
impl<P: AsRef<Path>> From<(io::Error, P)> for Error {
    fn from((io_error, path): (io::Error, P)) -> Error {
        Error::Io {
            path: path.as_ref().to_owned(),
            io_error,
        }
    }
}

// Which allows us to attach the path of an I/O error and convert
// the error into our custom error type in an ergonomic fashion:
fn main() -> Result<(), Error> {
    fs::read_to_string("foo/bar").err_with("foo/bar")?;
    Ok(())
}

No runtime deps