refined_type/rule/
non_empty.rs

1mod non_empty_map;
2mod non_empty_set;
3mod non_empty_string;
4mod non_empty_vec;
5mod non_empty_vec_deque;
6
7use crate::rule::composer::Not;
8use crate::rule::{EmptyDefinition, EmptyRule};
9use crate::Refined;
10pub use non_empty_map::*;
11pub use non_empty_set::*;
12pub use non_empty_string::*;
13pub use non_empty_vec::*;
14pub use non_empty_vec_deque::*;
15use std::fmt::Debug;
16use std::iter::Map;
17
18/// A type that holds a value satisfying the `NonEmptyRule`
19/// The definition of empty is defined by `EmptyDefinition`.
20pub type NonEmpty<T> = Refined<NonEmptyRule<T>>;
21
22/// Rule where the input value is not empty
23/// ```rust
24/// use refined_type::rule::{NonEmptyRule, Rule};
25/// assert!(NonEmptyRule::<String>::validate("non empty".to_string()).is_ok());
26/// assert!(NonEmptyRule::<String>::validate("".to_string()).is_err());
27///
28/// assert!(NonEmptyRule::<Vec<u8>>::validate(vec![1, 2, 3]).is_ok());
29/// assert!(NonEmptyRule::<Vec<u8>>::validate(Vec::new()).is_err());
30///
31/// assert!(NonEmptyRule::<u8>::validate(1).is_ok());
32/// assert!(NonEmptyRule::<u8>::validate(0).is_err());
33/// ```
34pub type NonEmptyRule<T> = Not<EmptyRule<T>>;
35
36impl<I: Debug + ExactSizeIterator + EmptyDefinition> NonEmpty<I> {
37    pub fn map<B, F>(self, f: F) -> Refined<NonEmptyRule<Map<I, F>>>
38    where
39        Self: Sized,
40        F: FnMut(I::Item) -> B,
41    {
42        let map_into_iter = self.into_value().map(f);
43        Refined::<NonEmptyRule<Map<I, F>>>::new(map_into_iter)
44            .expect("This error is always unreachable")
45    }
46
47    pub fn collect<B: Debug + FromIterator<I::Item> + EmptyDefinition>(self) -> NonEmpty<B>
48    where
49        Self: Sized,
50    {
51        NonEmpty::<B>::new(FromIterator::from_iter(self.into_value()))
52            .expect("This error is always unreachable")
53    }
54}