У меня есть тип Foo
, методы которого могут "вызывать" ошибки связанного типа Foo::Err
.
pub trait Foo {
type Err;
fn foo(&mut self) -> Result<(), Self::Err>;
}
У меня есть другая черта Bar
с методом, предназначенным для обработки Foo
.Bar
может выдавать собственные ошибки (указанные ассоциированным типом Bar::Err
), но также могут встречаться ошибки, генерируемые Foo
, который он обрабатывает.
Я вижу два способа обработки, но я не знаю, какой из них наиболее идиоматичен для Rust.
Первый встраивает результат в результат:
pub trait Bar1 {
type Err;
fn bar<F: Foo>(&mut self, foo: F) -> Result<Result<F, F::Err>, Self::Err>;
}
Второй объединяет два типа ошибокв специальное перечисление:
pub trait Bar2 {
type Err;
fn bar<F: Foo>(&mut self, foo: F) -> Result<F, Choice<F::Err, Self::Err>>;
}
Второй выглядит семантически чище, но создает некоторые препятствия для обработки дополнительного перечисления.
детская площадка