map_ok/lib.rs
1//! # MapOk
2//!
3//! This crate provides the [`MapOk`] trait that allows mapping [`Ok`] variants in an iterator to a different type.
4//!
5//! # Examples
6//!
7//! ```
8//! use std::num::ParseIntError;
9//! use std::str::FromStr;
10//! use map_ok::MapOk;
11//!
12//! struct Person {
13//! age: u8,
14//! }
15//!
16//! impl Person {
17//! fn new(age: u8) -> Self {
18//! Person { age }
19//! }
20//! }
21//!
22//! impl FromStr for Person {
23//! type Err = ParseIntError;
24//!
25//! fn from_str(s: &str) -> Result<Self, Self::Err> {
26//! let age = u8::from_str(s)?;
27//! Ok(Person::new(age))
28//! }
29//! }
30//!
31//! let input = vec!["10", "20", "x", "30"];
32//! let mut iterator = input.into_iter()
33//! .map(Person::from_str)
34//! .map_ok(|p| p.age);
35//!
36//! assert_eq!(iterator.next(), Some(Ok(10)));
37//! assert_eq!(iterator.next(), Some(Ok(20)));
38//! assert!(iterator.next().unwrap().is_err());
39//! assert_eq!(iterator.next(), Some(Ok(30)));
40//! assert_eq!(iterator.next(), None);
41//! ```
42
43mod box_ok;
44mod map_ok;
45
46pub use box_ok::{BoxOk, BoxingFn};
47pub use map_ok::{MapOk, MapOkIter};
48
49/// Commonly used imports.
50pub mod prelude {
51 pub use crate::{BoxOk, BoxingFn};
52 pub use crate::{MapOk, MapOkIter};
53}