История изменений
Исправление 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)?
, но зато реализация скрытой получается.