config_items/
res.rs

1use log::error;
2
3/// Standard error
4pub type StdErr = dyn std::error::Error;
5/// Thread-safe standard error
6pub type StdErrSS = dyn std::error::Error + Send + Sync;
7/// boxed StdErr
8pub type BoxErr = Box<StdErr>;
9/// Result template
10pub type ERes<T> = std::result::Result<T, BoxErr>;
11/// Thread-safe Result template
12pub type SRes<T> = std::result::Result<T, Box<StdErrSS>>;
13
14/// Fail if second parameter is None
15pub fn get_some<T>(name:&str, opt:Option<T>) -> ERes<T> {
16    match opt {
17        Some(v)=>Ok(v),
18        None=>{
19            let e = format!("get_some({name}) must be Some()");
20            error!("{e}");
21            Err(e.into())
22        }
23    }
24}
25
26/// Fail if second parameter is None, thread-safely
27pub fn get_somes<T>(name:&str, opt:Option<T>) -> SRes<T> {
28    match opt {
29        Some(v)=>Ok(v),
30        None=>{
31            let e = format!("get_somes({name}) must be Some()");
32            error!("{e}");
33            Err(e.into())
34        }
35    }
36}
37
38#[cfg(test)]
39mod tests {
40
41    use super::*;
42
43    fn ok() -> ERes<()> { Ok(()) }
44    fn err() -> ERes<()> { Err("bad".into()) }
45    
46    fn none() -> Option<bool> { None }
47    fn some() -> Option<bool> { Some(true) }
48    
49    fn sok() -> SRes<()> { Ok(()) }
50    fn serr() -> SRes<()> { Err("sbad".into()) }
51
52    #[test]
53    fn test_res() {
54        assert!(ok().is_ok());
55        assert!(err().is_err());
56
57        assert!(sok().is_ok());
58        assert!(serr().is_err());
59
60        match get_some("none", none()) {
61            Ok(_) => assert!(false),
62            Err(e) => assert_eq!(e.to_string(), "get_some(none) must be Some()".to_string()),
63        }
64
65        assert!(get_some("none", none()).is_err());
66        assert!(get_some("some", some()).is_ok());
67    }
68}