Допустим, у меня есть attrs: Vec<Attribute>
некоторых атрибутов функции и функция fn map_attribute(attr: &Attribute) -> Result<TokenStream, Error>
, которая отображает атрибуты в некотором коде.
Я знаю, что могу написать что-то вроде этого:
attrs.into_iter()
.map(map_attribute)
.collect::<Result<Vec<_>, _>()?
Однако это не то, что я хочу. То, что я хочу, это выкладывать все ошибки сразу, а не останавливаться с первой ошибкой. В настоящее время я делаю что-то вроде этого:
let mut codes : Vec<TokenStream> = Vec::new();
let mut errors: Vec<Error> = Vec::new();
for attr in attrs {
match map_attribute(attr) {
Ok(code) => codes.push(code),
Err(err) => errors.push(err)
}
}
let mut error_iter = errors.into_iter();
if let Some(first) = error_iter.nth(0) {
return Err(iter.fold(first, |mut e0, e1| { e0.combine(e1); e0 }));
}
Эта вторая версия делает то, что я хочу, но значительно более многословна, чем первая версия. Есть ли лучший / более идиоматический c способ добиться этого, если это возможно, без создания собственного итератора?