more_itertools/selecting/
only.rs

1use crate::error::Error;
2use crate::error;
3use crate::look_ahead_back::spy::spy;
4
5pub fn only<T>(iter: Box<dyn Iterator<Item = Result<T,Error>>>, default: Option<T>) -> Option<Result<T, Error>> 
6where
7T: Clone + 'static
8{
9    let ret = spy(iter, 2);
10    if let Some(v_ret) = ret {
11        match v_ret {
12            Ok(ok_v_ret) => {
13                if ok_v_ret.len() > 1 {
14                    return Some(Err(error::value_error("[only:too long]".to_string())));
15                } else if ok_v_ret.len() == 0 {
16                    if let Some(v_default) = default {
17                        return Some(Ok(v_default));
18                    } else {
19                        return Some(Err(error::value_error("[only:too short and no default]".to_string())));
20                    }
21                } else {
22                    let result = ok_v_ret[0].clone();
23                    return Some(Ok(result));
24                }
25            },
26            Err(err_v_ret) => { // upstream error
27                return Some(Err(err_v_ret));
28            }
29        }
30    } else {
31        if let Some(v_default) = default {
32            return Some(Ok(v_default));
33        } else {
34            return Some(Err(error::value_error("[only:too short and no default]".to_string())));
35        }
36    }
37}
38
39#[cfg(test)]
40mod tests {
41    use crate::utils::generate_okok_iterator;
42
43    use super::*;
44
45    #[test]
46    fn test1() {
47        let v1: Vec<String>= Vec::new();
48        let ret1 = only(generate_okok_iterator(v1), Some("missing".to_string()));
49        assert_eq!(ret1.unwrap().ok().unwrap(), "missing".to_string());
50
51
52        let v1: Vec<String>= vec!["too".to_string(), "many".to_string()];
53        let ret1 = only(generate_okok_iterator(v1), Some("missing".to_string()));
54        assert_eq!(*ret1.unwrap().err().unwrap().message().unwrap(), String::from("[only:too long]"));
55
56
57        let v1: Vec<String>= vec!["too".to_string()];
58        let ret1 = only(generate_okok_iterator(v1), Some("missing".to_string()));
59        assert_eq!(*ret1.unwrap().ok().unwrap(), String::from("too"));
60    }
61}