errortools 0.1.0

Quality of life utilities for error handling in Rust.
Documentation
//! Custom [`Format`] strategy.
//!
//! Run: `cargo run --example custom_format`
//!
//! Output: `outer -> middle -> inner`

use core::{error::Error, fmt};
use std::io;

use errortools::{Format, FormatError, chain};
use itertools::Itertools;

struct Arrow;

impl Format for Arrow {
    fn fmt(error: &dyn Error, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "{}", chain(error).format(" -> "))
    }
}

#[derive(Debug, thiserror::Error)]
enum AppError {
    #[error("outer")]
    Outer(#[source] MidError),
}

#[derive(Debug, thiserror::Error)]
enum MidError {
    #[error("middle")]
    Middle(#[source] io::Error),
}

fn main() {
    let err = AppError::Outer(MidError::Middle(io::Error::other("inner")));
    println!("{}", err.formatted::<Arrow>());
}