An open API service indexing awesome lists of open source software.

https://github.com/pro-2684/disperror

`Display`ing errors instead of `Debug`ging them when returned from `main`.
https://github.com/pro-2684/disperror

debug display error main rust

Last synced: 4 months ago
JSON representation

`Display`ing errors instead of `Debug`ging them when returned from `main`.

Awesome Lists containing this project

README

          

# disperror

`Display`ing errors instead of `Debug`ging them when returned from `main`.

## Usage

Simply wrap your error type `MyError` in a `DispError`:

```diff
- fn main() -> Result<(), MyError> {
+ use disperror::DispError;
+ fn main() -> Result<(), DispError> {
```

Note that `MyError` must implement `std::error::Error`.

## Example

```rust should_panic
use disperror::DispError;

fn main() -> Result<(), DispError> {
let contents = std::fs::read_to_string("nonexistent_file.txt")?;
println!("{}", contents);
Ok(())
}
```

Should `Display` the following error message if that file does not exist:

```text
Error: No such file or directory (os error 2)
```

Instead of the usual `Debug` output:

```text
Error: Os { code: 2, kind: NotFound, message: "No such file or directory" }
```

## Implementation

The `DispError` type is a simple wrapper around an error type `E` that implements `std::error::Error`:

```rust
use std::error::Error;

pub struct DispError(E);
```

The `Debug` implementation of `DispError` forwards to the `Display` implementation of the inner error:

```rust
use std::{error::Error, fmt::Debug};
#
# pub struct DispError(E);

impl Debug for DispError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.0)
}
}
```

In addition, `DispError` implements `From` for implicit conversion:

```rust
# use std::{error::Error, fmt::Debug};
#
# pub struct DispError(E);
#
impl From for DispError {
fn from(error: E) -> Self {
Self(error)
}
}
```

In this way, when an error of type `E` is returned from `main`, it is automatically converted to a `DispError`. When the `Err` variant of a `Result` is returned from `main`, the `Debug` implementation is used to print the error message, thus forwarding to the `Display` implementation of the inner error.

## Notes

This project is heavily inspired by [`main_error`](https://docs.rs/main_error). If you're working with `Box` in your `main` function, use [`main_error`](https://docs.rs/main_error) instead. Here's a quick comparison:

| | `disperror` | `main_error` |
| ------------------ | -------------- | ------------ |
| Library size | Tiny | Small |
| Overhead | None | Negligible |
| Dynamic dispatch | ✘ | ✔ |
| Usage | `DispError` | `MainError` |