And the variety exists, because there are different needs and trade-offs:
• You may want an error type that takes 0 bytes, so that `Result` is cheap for trivial high-performance functions (e.g. parsing libraries that may fail on every byte).
• You may want your error type specify exact cause of failure in your library in a programmatic way, so that callers can turn it into a precise, localized error message for the end user.
• You may want to have a super rich detailed error object with all the context, e.g. an entire HTTP response for a 5xx status.
• And some application developers prefer having an "I don't care, just give me the backtrace" error wrapper for everything, to speed up the development and not spend time on micro-managing error types.
All of this works nicely and uniformly in `Result<Ok, Err>` with some `Err` type written (or generated) by you.