errortools 0.3.1

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<E: Error + ?Sized> Format<E> for Arrow {
    fn fmt(error: &E, 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>());
}