more_itertools/selecting/
first.rs

1use crate::error::Error;
2use crate::error;
3
4/// https://more-itertools.readthedocs.io/en/v10.2.0/_modules/more_itertools/more.html#first
5pub fn first<T>(iter: &mut Box<dyn Iterator<Item = Result<T,Error>>>, default: Option<T>) -> Option<Result<T, Error>>
6where
7T: 'static + Clone
8{
9    let _next = iter.next();
10    if let Some(v_next) = _next {
11        match v_next {
12            Ok(ok_v_next) => {
13                return Some(Ok(ok_v_next.clone()));
14            },
15            Err(err_v_next) => {
16                return Some(Err(err_v_next));
17            }
18        }
19    } else {
20        if let Some(v_default) = default {
21            return Some(Ok(v_default.clone()));
22        } else {
23            return Some(Err(error::value_error(String::from("[first:empty iterable, and no default value]"))));
24        }
25    }
26}
27
28#[cfg(test)]
29mod tests {
30    use crate::utils::generate_okok_iterator;
31    use crate::utils::generate_okokerr_iterator;
32
33    use super::*;
34
35    #[test]
36    fn test1() {
37        let ret = first(&mut generate_okok_iterator(vec![2,3,4]), Some(5));
38        assert_eq!(2, ret.unwrap().ok().unwrap());
39
40        let ret2 = first(&mut generate_okok_iterator(vec![]), Some(5));
41        assert_eq!(5, ret2.unwrap().ok().unwrap());
42
43        let ret3 = first(&mut generate_okok_iterator(vec![]), None::<i32>);
44        assert_eq!(error::Kind::ValueError, ret3.unwrap().err().unwrap().kind());
45
46        let v = vec![1,2,3];
47        let ret4 = first(&mut generate_okok_iterator(v), Some(0));
48        assert_eq!(1, ret4.unwrap().ok().unwrap());
49
50        let ret5 = first(&mut generate_okokerr_iterator(vec![], error::overflow_error("for test".to_string())), Some(5));
51        assert_eq!(error::Kind::OverflowError, ret5.unwrap().err().unwrap().kind());
52    }
53}
54