Тип FromStr::Err
является ассоциированным типом черты FromStr
.Каждая реализация FromStr
имеет свой собственный связанный тип, и этот тип совершенно не ограничен - это может быть любой тип.Это означает, что вам потребуется преобразование из любого типа в MyError
для достижения того, что вы хотите:
impl<T> From<T> for MyError {
fn from(e: T) -> MyError {
MyError::Parse
}
}
Однако эта реализация запрещена правилами согласованности - она конфликтует с реализацией From<T>
длялюбой тип T
в стандартной библиотеке.И даже если бы эта реализация была разрешена, она на самом деле не делала бы, что вы хотите - любой тип ошибки будет преобразован в MyError::Parse
, а не просто в разборе ошибок.
Один из возможных способов эточтобы ввести признак маркера для типов ошибок разбора:
trait ParseError {}
impl<T: ParseError> From<T> for MyError {
fn from(e: T) -> MyError {
MyError::Parse
}
}
Затем вы можете реализовать эту особенность маркера для всех типов ошибок разбора:
impl ParseError for std::str::ParseBoolError {}
impl ParseError for std::num::ParseFloatError {}
impl ParseError for std::num::ParseIntError {}
impl ParseError for std::net::AddrParseError {}
impl ParseError for std::char::ParseCharError {}