1use log::error;
2
3pub type StdErr = dyn std::error::Error;
5pub type StdErrSS = dyn std::error::Error + Send + Sync;
7pub type BoxErr = Box<StdErr>;
9pub type ERes<T> = std::result::Result<T, BoxErr>;
11pub type SRes<T> = std::result::Result<T, Box<StdErrSS>>;
13
14pub 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
26pub 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}