АГ
#[derive(Debug, PartialEq)]Есть функция, которая возвращает Result<String, DaoError> и она возвращает различные ошибки из enum DaoError:
pub enum DaoError {
DieselError(diesel::result::Error),
DataError(DataError),
ValidateError(ValidateError),
}
fn f(..) -> Result<String, DaoError> {Сначала компилятор ругался на то, что не может различные ошибки в DaoError, но затем я реализовал From trait для всех ошибок в DaoError. НО, почему-то в последней строчке он ругается на то, что возвращается Result<, DataError>, а ожидается Result<, DaoError>. Почему он не может сконвертировать DataError в DaoError как в предыдущих строчках?
let v1 = make_query()?; // Возвращает Result(, diesel::result::Error);
let v2 = validate()?; // Возвращает Result(, ValidateError);
let v3 = find(); // Возвращает Option()
v3.ok_or(DataError::NotFoundErr).map(|v| v.my_string)
}
Если написать:
v3.ok_or(DaoError::DataError(DataError::NotFoundErr)).map(|v| v.my_string)То все работает, но это очень странно выглядит. Помогите, пожалуйста, с этой строчкой или дайте ссылку на статью, где решается похожая проблема.
Я читал еще, что можно не городить обертки над ошибками и использовать Box<error>, но там теряются типы ошибок, что(наверное) не очень хорошо...
?
, а в последней строке он не используется