Erratic
This library provides the Error<S = Stateless> type, enabling applications to handle errors uniformly
across different contexts.
Basic Usage
In most cases, Error can serve as a drop-in replacement for Box<dyn Error>.
Compared to the latter, it occupies only 1 usize, making the happy path faster.
use *;
Attaching Context & Payload
When constructing an error, you can optionally attach a static context and/or a dynamic payload. If attached, their memory is merged into a single allocation when the upstream error is erased. If omitted, no extra memory is allocated for them. If only context is provided, no heap allocation occurs at all.
use *;
Binding State
When propagating an error that requires special handling, you can supply a generic state
alongside it. If the state implements Default, other errors can be wrapped and
returned directly via ? without explicitly setting the state.
When no error is wrapped and no context/payload is attached, the state is inlined without triggering any heap allocation. On 32-bit targets, the error stays at 1 usize when the state is no larger than 2 bytes; on 64-bit targets, it stays at 1 usize when the state is no larger than 4 bytes.
use *;
Representation
Type-wise, Error<S> is an internal tagged union, and it requires pointers to constant or
heap-allocated data to be aligned to 4 bytes, freeing up the lower 2 bits to encode discriminant.
This makes it possible to avoid heap allocation when not needed.
(32-bit platform, little-endian)
(Context)
[XXXXXX00|XXXXXXXX|XXXXXXXX|XXXXXXXX]
\
`rodata-> [&'static str] --rodata--> [ ~ str ~ ]
(Error, Payload, or State & Context)
[XXXXXX01|XXXXXXXX|XXXXXXXX|XXXXXXXX]
\
`heap-> [ ~ State/() ~ | ~ VTable ~ | ~ Error ~ | ~ Payload/() ~ |&'static str/()]
(State)
[00000010| ~ State ~ ]
Contribution
Contributions are warmly welcomed! Whether you have a bug report, feature request, or an improvement in mind, feel free to open an issue or submit a pull request. All ideas—big or small—help make this library better for everyone.