try_again/
fallible.rs

1pub trait NeedsRetry {
2    fn needs_retry(&self) -> bool;
3}
4
5impl<T, E> NeedsRetry for Result<T, E> {
6    fn needs_retry(&self) -> bool {
7        self.is_err()
8    }
9}
10
11impl<T> NeedsRetry for Option<T> {
12    fn needs_retry(&self) -> bool {
13        self.is_none()
14    }
15}
16
17impl NeedsRetry for std::process::ExitStatus {
18    fn needs_retry(&self) -> bool {
19        !self.success()
20    }
21}
22
23#[cfg(test)]
24mod test {
25    use assertr::prelude::*;
26    use super::NeedsRetry;
27
28    #[test]
29    fn result_does_not_need_retry_when_ok() {
30        let result: Result<(), ()> = Ok(());
31        assert_that(result.needs_retry()).is_false();
32    }
33
34    #[test]
35    fn result_needs_retry_when_err() {
36        let result: Result<(), ()> = Err(());
37        assert_that(result.needs_retry()).is_true();
38    }
39
40    #[test]
41    fn option_does_not_need_retry_when_some() {
42        let option: Option<()> = Some(());
43        assert_that(option.needs_retry()).is_false();
44    }
45
46    #[test]
47    fn option_needs_retry_when_none() {
48        let option: Option<()> = None;
49        assert_that(option.needs_retry()).is_true();
50    }
51
52    #[test]
53    fn exit_status_does_not_need_retry_when_successful() {
54        let successful_exit_status = std::process::ExitStatus::default();
55        assert_that(successful_exit_status.needs_retry()).is_false();
56    }
57}