# `all-the-errors`
[![Build Status]][actions] [![Latest Version]][crates_dot_io]
[Build Status]: https://img.shields.io/github/actions/workflow/status/avirshup/all-the-errors/ci.yml?branch=main
[actions]: https://github.com/avirshup/all-the-errors/actions?query=branch%3Amaster
[Latest Version]: https://img.shields.io/crates/v/all-the-errors.svg
[crates_dot_io]: https://crates.io/crates/all-the-errors
 [^memesrc]
A silly little trait with a few methods for getting _all_ the errors out of a
`Iterator<Item=Result<T,E>>`.
When you bring the trait `all_the_errors::CollectAllTheErrors` into scope,
it automatically implements 3 methods on `Iterator`s: `partition_results`,
`collect_all_results`, and `collect_oks_or_iter_errs`.
No-std compatible: does not use `std` interally (although it's
mostly _useful_ with allocation, as in the example below).
## Example: collecting into `Vec`s
For clarity, let's assume you want to collect results into `Vec`s
(see the docs for the generic signature).
The methods available on an `iter: Iterable<Item=Result<T, E>>` are:
1. `iter.partition_results() -> (Vec<T>, Vec<E>)`
2. `iter.collected_results() -> Result<Vec<T>, Vec<E>>`
3. `iter.collect_oks_or_iter_errs() -> Result<Vec<T>, impl Iterator<Item=E>>`
For example:
```rust
use all_the_errors::CollectAllTheErrors;
assert_eq!(
[Ok(1), Ok(2), Err("a"), Err("b")]
.into_iter()
.partition_results(),
(vec![1, 2], vec!["a", "b"])
);
assert_eq!(
[Ok(1), Ok(2)]
.into_iter()
.collected_results(),
Ok(vec![1, 2])
);
assert_eq!(
[Ok(1), Ok(2), Err("a"), Err("b")]
.into_iter()
.collected_results(),
Err(vec!["a", "b"])
);
```
## Why?
This is useful because, given the stdlib's trait implementations,
`Iterator::collect` will stop collecting results after the first error.
This allows you to transform, for instance, `Iterator<Item=Result<T, E>>`
into an `Result<Vec<T>, E>` - i.e., either many `T`s or just one `E`.
But sometimes, though, you want all the errors - e.g.,
`Result<Vec<T>, Vec<E>>`, or even a tuple of `(Vec<T>, Vec<E>)`.
`Iterator::partition` can give you
`(Vec<Result<T, E>>, Vec<Result<T,E>>)`, which is annoying
because you have to unwrap everything yourself
_and_ it adds 2 unecessary allocations.
### What about splitting it into 2 different iterators?
## License and Copyright Boilerplate
- **License**:
This project is provided under the [MIT License](./LICENSE).
- **Copyrightability**:
All material here was written by (and for) the human authors.
No LLM-derived content is present in any form.