Skip to content

Commit

Permalink
Add an example of collecting errors while iterating successes
Browse files Browse the repository at this point in the history
Inspired by the comments from people looking for something like this in <rust-lang/rust#87047 (comment)>.
  • Loading branch information
scottmcm committed Feb 25, 2022
1 parent 21807dc commit 2be9574
Showing 1 changed file with 19 additions and 0 deletions.
19 changes: 19 additions & 0 deletions src/error/iter_result.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,25 @@ fn main() {
}
```

## Collect the failed items with `map_err()` and `filter_map()`

`map_err` calls a function with the error, so by adding that to the previous
`filter_map` solution we can save them off to the side while iterating.

```rust,editable
fn main() {
let strings = vec!["42", "tofu", "93", "999", "18"];
let mut errors = vec![];
let numbers: Vec<_> = strings
.into_iter()
.map(|s| s.parse::<u8>())
.filter_map(|r| r.map_err(|e| errors.push(e)).ok())
.collect();
println!("Numbers: {:?}", numbers);
println!("Errors: {:?}", errors);
}
```

## Fail the entire operation with `collect()`

`Result` implements `FromIter` so that a vector of results (`Vec<Result<T, E>>`)
Expand Down

0 comments on commit 2be9574

Please sign in to comment.