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}