История изменений
Исправление loyd, (текущая версия) :
Это известная проблема и причина, почему обобщённые ошибки в anyhow, eyre, failure не реализуют std::error::Error.
Ситуация в будущем несколько улучшится со стабилизацией специализации, но сейчас красивого решения нет.
Насколько я понимаю, у тебя ошибка твоей библиотеки (иначе зачем ещё thiserror, а не обобщённая ошибка). Самое простое здесь это конкретные From инстансы:
impl From<hyper::Error> for MyError {
fn from(error: hyper::Error) -> Self {
Self::Network(Box::new(error)) // Box<dyn ...>
}
}
Минус этого решения в том, что эти инсансы являются частью публичного интерфейса и поэтому раскрывают реализацию. Поэтому более чистое решение это всё-таки приватные MyError::network(..) конструкторы. Да, ? не заиспользовать сразу, придётся делать res.map_err(MyError::network)?, но зато реализация скрытой получается.
Если же у тебя приложение и тебе деление на варианты (Network/Codec/etc) не нужны, то просто используй готовые eyre/anyhow. Они не реализуют std::error::Error, но это и неважно для небиблиотечного кода.
Исходная версия loyd, :
Это известная проблема и причина, почему обобщённые ошибки в anyhow, eyre, failure не реализуют std::error::Error.
Ситуация в будущем несколько улучшится со стабилизацией специализации, но сейчас красивого решения нет.
Насколько я понимаю, у тебя ошибка твоей библиотеки (иначе зачем ещё thiserror, а не обобщённая ошибка). Самое простое здесь это конкретные From инстансы:
impl From<hyper::Error> for MyError {
fn from(error: hyper::Error) -> Self {
Self::Network(Box::new(error)) // Box<dyn ...>
}
}
Минус этого решения в том, что эти инсансы являются частью публичного интерфейса и поэтому раскрывают реализацию. Поэтому более чистое решение это всё-таки приватные MyError::network(..) конструкторы. Да, ? не заиспользовать сразу, придётся делать res.map_err(MyError::network)?, но зато реализация скрытой получается.