Crates.io | error_mancer |
lib.rs | error_mancer |
version | 0.4.3 |
created_at | 2024-11-10 18:39:44.308924+00 |
updated_at | 2025-02-17 18:57:10.268039+00 |
description | Quickly define custom error enums for a function. |
homepage | |
repository | https://github.com/vivax3794/error_mancer |
max_upload_size | |
id | 1443135 |
size | 30,868 |
The error_mancer
crate adds a #[errors]
attribute that allows you to easily define and restrict error types in functions. This approach makes error handling more concise and keeps the error definitions close to the relevant methods, simplifying maintenance and modification.
For example in the following code the #[errors]
macro automatically defines a OpenFileError
based on the macro and substitudes in the error type in the signature.
use std::io;
use error_mancer::*;
#[errors(io::Error, serde_json::Error)]
fn open_file() -> Result<SomeStruct, _> {
let file = std::fs::File::open("hello.json")?;
let data = serde_json::from_reader(file)?;
Ok(data)
}
fn main() {
match open_file() {
Err(OpenFileError::Io(err)) => { /* Handle I/O error */ },
Err(OpenFileError::SerdeJson(err)) => { /* Handle JSON parsing error */ },
Ok(data) => { /* Use data */ }
}
}
The main benefit of this approach is that it moves the error enum definition much closer to the method, making it easier to modify.
anyhow
supportAdditionally, it supports generic error results like anyhow
. In these cases, the return type is not modified, but the allowed return values are still restricted. This is particularly useful when implementing traits that require an anyhow::Result
.
use error_mancer::*;
#[errors]
impl other_crate::Trait for MyStruct {
#[errors]
fn some_method(&self) -> anyhow::Result<()> {
// This is a compiler error now!
std::fs::open("hello.txt")?;
}
}
anyhow::Result
and similar Result
types.thiserror
: This crate does not aim to replace thiserror
or similar libraries. They are designed for public-facing errors where control over details is important. In contrast, this library is focused on minimizing boilerplate as much as possible, providing less control but offering sensible defaults for internal error enums.In other words, what if anyhow
was strongly typed on the possible errors?