rs_fsring/
next.rs

1use crate::evt::Event;
2use crate::item::Name;
3
4pub mod u;
5
6pub fn get_next_simple_retry<N>(get_next: N, limit: usize) -> Event
7where
8    N: FnMut() -> Option<Result<Name, Event>>,
9{
10    let i = std::iter::from_fn(get_next);
11    let l = i.take(limit);
12    let mut f = l.flat_map(|r| r.ok());
13    f.next()
14        .map(Event::Empty)
15        .unwrap_or_else(|| Event::TooManyItemsAlready)
16}
17
18pub fn get_next_checked_new<N, E>(
19    mut get_next_unchecked: N,
20    is_empty: E,
21) -> impl FnMut() -> Result<Name, Event>
22where
23    N: FnMut() -> Result<Name, Event>,
24    E: Fn(&Name) -> Result<bool, Event>,
25{
26    move || {
27        let n: Name = get_next_unchecked()?;
28        match is_empty(&n) {
29            Ok(true) => Ok(n),
30            Err(Event::NoEntry(n)) => Ok(n),
31            Ok(false) => Err(Event::Used(n)),
32            Err(e) => Err(e),
33        }
34    }
35}
36
37#[cfg(test)]
38mod test_next {
39
40    mod get_next_simple_retry {
41
42        use crate::evt::Event;
43        use crate::item::Name;
44        use crate::next;
45
46        #[test]
47        fn test_empty_candidates() {
48            let get_next = || None;
49            let limit = 256;
50            let evt: Event = next::get_next_simple_retry(get_next, limit);
51            assert_eq!(evt, Event::TooManyItemsAlready);
52        }
53
54        #[test]
55        fn test_no_empty() {
56            let get_next = || Some(Err(Event::Used(Name::from(""))));
57            let limit = 256;
58            let evt: Event = next::get_next_simple_retry(get_next, limit);
59            assert_eq!(evt, Event::TooManyItemsAlready);
60        }
61
62        #[test]
63        fn test_empty1st() {
64            let get_next = || Some(Ok(Name::from("42")));
65            let limit = 256;
66            let evt: Event = next::get_next_simple_retry(get_next, limit);
67            assert_eq!(evt, Event::Empty(Name::from("42")));
68        }
69    }
70
71    mod get_next_checked_new {
72
73        use crate::evt::Event;
74        use crate::item::Name;
75        use crate::next;
76
77        #[test]
78        fn test_empty() {
79            let get_next_unchecked = || Ok(Name::from("42"));
80            let is_empty = |_: &Name| Ok(true);
81
82            let mut f = next::get_next_checked_new(get_next_unchecked, is_empty);
83            let n: Name = f().unwrap();
84            assert_eq!(n, Name::from("42"));
85        }
86
87        #[test]
88        fn test_noent() {
89            let get_next_unchecked = || Ok(Name::from(""));
90            let is_empty = |_: &Name| Err(Event::NoEntry(Name::from("42")));
91
92            let mut f = next::get_next_checked_new(get_next_unchecked, is_empty);
93            let n: Name = f().unwrap();
94            assert_eq!(n, Name::from("42"));
95        }
96
97        #[test]
98        fn test_used() {
99            let get_next_unchecked = || Ok(Name::from("42"));
100            let is_empty = |_: &Name| Ok(false);
101
102            let mut f = next::get_next_checked_new(get_next_unchecked, is_empty);
103            let r = f();
104            assert_eq!(r, Err(Event::Used(Name::from("42"))));
105        }
106
107        #[test]
108        fn test_unexpected() {
109            let get_next_unchecked = || Ok(Name::from(""));
110            let is_empty = |_: &Name| Err(Event::Broken(Name::from("42")));
111
112            let mut f = next::get_next_checked_new(get_next_unchecked, is_empty);
113            let r = f();
114            assert_eq!(r, Err(Event::Broken(Name::from("42"))));
115        }
116    }
117}