#error-message #error #error-chain #error-handling #cli #no-std

no-std pretty-error-debug

If the process ends with an Error, write out the Error message and chain

5 unstable releases

0.3.1 Dec 4, 2024
0.3.0 Sep 5, 2023
0.2.0 Mar 22, 2023
0.1.1 Dec 23, 2022
0.1.0 Dec 21, 2022

#705 in Rust patterns

Download history 609/week @ 2024-10-18 402/week @ 2024-10-25 428/week @ 2024-11-01 420/week @ 2024-11-08 484/week @ 2024-11-15 496/week @ 2024-11-22 416/week @ 2024-11-29 267/week @ 2024-12-06 196/week @ 2024-12-13 113/week @ 2024-12-20 93/week @ 2024-12-27 129/week @ 2025-01-03 288/week @ 2025-01-10 209/week @ 2025-01-17 319/week @ 2025-01-24 322/week @ 2025-01-31

1,161 downloads per month
Used in 5 crates (via zipsign)

MIT/Apache

21KB
265 lines

pretty-error-debug

GitHub Workflow Status Crates.io Minimum supported Rust version: 1.56 License: MIT OR Apache-2.0

Display a the chain of an error. Most useful as Result<(), E> for your fn main(), and in conjunction with thiserror.

This crate simply plagiarized extracted all the relevant formatting code from anyhow.

Example message

Error: Got a 'middle' error

Caused by:
    1: A nested error occured
    2: 'inner' failed
    3: Caught an error: Not implemented, yet.

With thiserror

#[derive(pretty_error_debug::Debug, thiserror::Error)]
pub enum MyError {
    #[error("Error variant 1 happened")]
    Variant1(#[from] Error1),
    #[error("Error variant 2 happened")]
    Variant2(#[from] Error2),
}

fn main() -> Result<(), MyError> {
    ...
}

With thiserror, but without a new type

#[derive(Debug, thiserror::Error)]
pub enum MyError {
    #[error("Error variant 1 happened")]
    Variant1(#[from] Error1),
    #[error("Error variant 2 happened")]
    Variant2(#[from] Error2),
}

fn main() -> Result<(), pretty_error_debug::Wrapper<MyError>> {
    ...
}

Without thiserror

use std::error::Error;
use std::fmt::{self, Write};

#[derive(pretty_error_debug::Debug)]
pub enum MyError {
    Variant1(Error1),
    Variant2(Error2),
}

impl fmt::Display for MyError {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        match self {
            MyError::Variant1(_) => write!(f, "Error variant 1 happened"),
            MyError::Variant2(_) => write!(f, "Error variant 2 happened"),
        }
    }
}

impl Error for MyError {
    fn source(&self) -> Option<&(dyn Error + 'static)> {
        match self {
            MyError::Variant1(source) => Some(source),
            MyError::Variant2(source) => Some(source),
        }
    }
}

fn main() -> Result<(), MyError> {
    ...
}

Dependencies

~115KB