A macro which makes errors easy to write
Minimum type is like this:
extern crate quick_error;
#
quick_error!
Both pub
and non-public types may be declared, and all meta attributes
(such as #[derive(Debug)]
) are forwarded as is. The Debug
must be
implemented (but you may do that yourself if you like). The documentation
comments /// something
(as well as other meta attrbiutes) on variants
are allowed.
Allowed Syntax
You may add arbitrary parameters to any struct variant:
# extern crate quick_error;
#
#
quick_error!
Note unlike in normal Enum declarations you declare names of fields (which are omitted from type). How they can be used is outlined below.
Now you might have noticed trailing braces {}
. They are used to define
implementations. By default:
Error::source()
returns None (even if type wraps some value)Display
outputs debug representation- No
From
implementations are defined
# extern crate quick_error;
#
#
quick_error!
To change source
method to return some error, add source(value)
, for
example:
# extern crate quick_error;
#
#
quick_error!
Note you don't need to wrap value in Some
, its implicit. In case you want
None
returned just omit the source
. You can't return None
conditionally.
To change how each clause is Display
ed add display(pattern,..args)
,
for example:
# extern crate quick_error;
#
#
quick_error!
If you need a reference to the error when Display
ing, you can instead use
display(x) -> (pattern, ..args)
, where x
sets the name of the reference.
# extern crate quick_error;
#
#
use Error; // put methods like `source()` of this trait into scope
quick_error!
To convert to the type from any other, use one of the three forms of
from
clause.
For example, to convert simple wrapper use bare from()
:
# extern crate quick_error;
#
#
quick_error!
This implements From<io::Error>
.
To convert to singleton enumeration type (discarding the value), use
the from(type)
form:
# extern crate quick_error;
#
#
quick_error!
And the most powerful form is from(var: type) -> (arguments...)
. It
might be used to convert to type with multiple arguments or for arbitrary
value conversions:
# extern crate quick_error;
#
#
quick_error!
Context
Since quick-error 1.1 we also have a context
declaration, which is
similar to (the longest form of) from
, but allows adding some context to
the error. We need a longer example to demonstrate this:
# extern crate quick_error;
# use io;
# use File;
# use ;
#
use ResultExt;
quick_error!
#
Each context(a: A, b: B)
clause implements
From<Context<A, B>> for Error
. Which means multiple context
clauses
are a subject to the normal coherence rules. Unfortunately, we can't
provide full support of generics for the context, but you may either use a
lifetime 'a
for references or AsRef<Type>
(the latter means A: AsRef<Type>
, and Type
must be concrete). It's also occasionally useful
to use a tuple as a type of the first argument.
You also need to use quick_error::ResultExt
extension trait to get
working .context()
method.
More info on context in this article.
All forms of from
, display
, source
, and context
clauses can be combined and put in arbitrary order. Only from
and
context
can be used multiple times in single variant of enumeration.
Docstrings are also okay. Empty braces can be omitted as of quick_error
0.1.3.
Private Enums
Since quick-error 1.2.0 we have a way to make a private enum that is wrapped by public structure:
extern crate quick_error;
#
quick_error!
This generates data structures like this
;
Which in turn allows you to export just PubError
in your crate and keep
actual enumeration private to the crate. This is useful to keep backwards
compatibility for error types. Currently there is no shorcuts to define
error constructors for the inner type, but we consider adding some in
future versions.
It's possible to declare internal enum as public too.