Я предполагаю, что вы хотели упростить что-то вроде этого (удалив .await
, который не связан с проблемой):
match fnX(x) { // Returns Result<X, EX>
Ok(y) => match fnY(y) { // Returns Result<Y, EY>
Ok(_) => println!("Success!"),
Err(e) => error!("error = {}", e),
},
Err(e) => error!("error = {}", e),
}
Если типы ошибок одинаковы, вы можете упростить код с and_then
:
match fnX(x).and_then(fnY) {
Ok(_) => println!("Success!"),
Err(e) => error!("error = {}", e),
}
Если типы ошибок отличаются, вы можете использовать map_err
, чтобы преобразовать их в один тип:
match fnX(x)
.map_err(MyError::from)
.and_then(|y| fnY(y).map_err(MyError::from))
{
Ok(_) => println!("Success!"),
Err(e) => error!("error = {}", e),
}
Последнее можно упростить с помощью последней версии для разработки map_for
ящик:
match map_for!(y <- fnX (x);
v <- fnY (y);
=> v)
{
Ok(_) => println!("Success"),
Err(e @ MyError { .. }) => error!("error = {}", e),
}
- Обратите внимание, что аннотация
@ MyError {..}
требуется только в том случае, если компилятор не может автоматически определить тип ошибки. - Полный отказ от ответственности: я являюсь автором
map_for
ящика.