No, you don't! When returning Result<T, E>, you can use ? on any Result<T2, E2> where E: From<E2>. In other words E doesn't have to be Box<dyn>, it just has to satisfy From<E2>.
Crates like thiserror make it easy to define your own error types that can be easily converted from all the other error types you can encounter in your functions! I do this whenever it doesn't make sense to use an inner error type directly, or whenever a function does its own validation that deserves its own error variant.
On top of that, I tend to also have error variants for each place in the function rather than only for each type of error, so at error sites I can do something like `.map_err(ErrorType::PlaceInTheFunction)?` rather than only `?`, and then errors become like a very efficient backtrace :)
paaloeye•35m ago
agumonkey•24m ago
paaloeye•1m ago