How is WrappedError any different to Box<Error>?
As for GeneralError, I’m not sure it’s hugely useful. Really, all it’s adding is the ability to plaster a different message over the top of an existing error. Given how errors are typically rendered, this pretty much just replaces the inner error with a string.
I’ve also tried to avoid doing this myself, because I worry about the perf hit of having each “layer” doing allocations to describe what went wrong when, really, it would be better to just define specialised enum/unitary types that should be a lot cheaper.
If you wanted to do this in general, wouldn’t it make more sense to have the “outer” error be any Error type, rather than just String? I mean, if nothing else, it should at least be Cow<'static, str> to allow for fixed messages without allocation overhead.
Also, GeneralError is supremely non-descriptive. WrappedError's a better name for it.
Edit: Oh, and I think things like this are better written as external crates first, to prove they’re useful.