rust-error-type
rust-error-type copied to clipboard
error_type
This crate provides the error_type! macro, which is designed to produce a fresh, reasonably well-featured error type from a concise definition.
A simple example of the usage is given below:
#[macro_use] extern crate error_type;
use std::borrow::Cow;
use std::error::Error;
use std::io;
error_type! {
#[derive(Debug)]
pub enum LibError {
Io(std::io::Error) {
cause;
},
Message(Cow<'static, str>) {
desc (e) &**e;
from (s: &'static str) s.into();
from (s: String) s.into();
},
Other(Box<Error>) {
desc (e) e.description();
cause (e) Some(&**e);
}
}
}
fn main() {}
The expansion of the above includes the following:
-
The
LibErrorenumeration (plus the provided#[derive(Debug)]annotation), withIo,MessageandOthervariants. -
An implicit
impl From<Payload> for LibErrorfor each variant's payload type. -
An implicit
impl Display for LibError, using the existingDisplayimplementation for each variant's payload type. -
An implicit
impl Error for LibError. -
For the
Iovariant:-
An implicit
description, forwarded to the existing definition forstd::io::Error. -
An automatic
cause, forwarded to the existing definition forstd::io::Error.Note: the automatic
causereturns the result ofstd::io::Error::cause, not the payload itself. This macro considers the payload to be the error, not the underlying cause.
-
-
For the
Messagevariant:-
An explicit
description, which just returns the contents of theCow<'static, str>. -
An implicit
cause, which just returnsNone. -
An explicit
From<&'static str>conversion. -
An explicit
From<String>conversion.
-
-
For the
Othervariant:-
An explicit
descriptionwhich forwards to the existing definition for the boxedError. -
An explicit
causewhich returns the boxed error itself as the cause. This is distinct from the behaviour of an automaticcause.
-
FAQ
-
Can I use unitary variants; ones without a payload?
No, not as yet. Maybe if there's demand.
-
Can I use tuple variants with more than one element?
No. This would likely be rather inconvenient to implement, due to the way the various parts of the implementation are constructed. Not impossible, though.
-
Can I use struct variants?
No, for much the same reason as tuple variants.
-
Can I have fields common to all variants; i.e. have the enum wrapped in a struct?
No. It would be nice, but I'm not sure how to go about that. You can always use the expansion of
error_type!in a custom structure for the added information.