Допустим, я хочу сделать тип MyError, в который бы я мог упихать произвольную ошибку - хочу возвращать свой тип ошибки в Result методов моего трейта, чтобы абстрагироваться от деталей реализации. При этом я хочу, чтобы при написании реализации этих методов я мог использовать оператор вопроса с автоматическим преобразованием типа ошибки, а не вызывать вручную map_err.
use derive_more::Display;
use thiserror::Error;
#[derive(Error, Debug, Display)]
pub struct MyError(#[source] Box<dyn std::error::Error>);
impl<T: std::error::Error> From<T> for MyError {
fn from(value: T) -> Self {
Self(Box::new(value))
}
}
Получаю ошибку компиляции:
error[E0119]: conflicting implementations of trait `From<MyError>` for type `MyError`
--> src\mod.rs:9:1
|
9 | impl<T: std::error::Error> From<T> for MyError {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: conflicting implementation in crate `core`:
- impl<T> From<T> for T;
Как я понимаю, проблема в том, что MyError сам по себе реализует трейт Error и получается что-то вроде рекурсии.
Что с этим делать?