google_cloud_auth/
errors.rs1use http::StatusCode;
18use std::error::Error;
19
20pub use gax::error::CredentialsError;
21
22pub(crate) fn retryable<T: Error + Send + Sync + 'static>(source: T) -> CredentialsError {
24 CredentialsError::new(true, source)
25}
26
27#[allow(dead_code)]
28pub(crate) fn retryable_from_str<T: Into<String>>(message: T) -> CredentialsError {
29 CredentialsError::from_str(true, message)
30}
31
32pub(crate) fn non_retryable<T: Error + Send + Sync + 'static>(source: T) -> CredentialsError {
34 CredentialsError::new(false, source)
35}
36
37pub(crate) fn non_retryable_from_str<T: Into<String>>(message: T) -> CredentialsError {
38 CredentialsError::from_str(false, message)
39}
40
41pub(crate) fn is_retryable(c: StatusCode) -> bool {
42 match c {
43 StatusCode::INTERNAL_SERVER_ERROR
46 | StatusCode::SERVICE_UNAVAILABLE
47 | StatusCode::REQUEST_TIMEOUT
48 | StatusCode::TOO_MANY_REQUESTS => true,
49 _ => false,
50 }
51}
52
53#[cfg(test)]
54mod test {
55 use super::*;
56 use test_case::test_case;
57
58 #[test_case(StatusCode::INTERNAL_SERVER_ERROR)]
59 #[test_case(StatusCode::SERVICE_UNAVAILABLE)]
60 #[test_case(StatusCode::REQUEST_TIMEOUT)]
61 #[test_case(StatusCode::TOO_MANY_REQUESTS)]
62 fn retryable(c: StatusCode) {
63 assert!(is_retryable(c));
64 }
65
66 #[test_case(StatusCode::NOT_FOUND)]
67 #[test_case(StatusCode::UNAUTHORIZED)]
68 #[test_case(StatusCode::BAD_REQUEST)]
69 #[test_case(StatusCode::BAD_GATEWAY)]
70 #[test_case(StatusCode::PRECONDITION_FAILED)]
71 fn non_retryable(c: StatusCode) {
72 assert!(!is_retryable(c));
73 }
74
75 #[test]
76 fn helpers() {
77 let e = super::retryable_from_str("test-only-err-123");
78 assert!(e.is_retryable(), "{e}");
79 assert!(e.source().unwrap().source().is_none());
80 let got = format!("{e}");
81 assert!(got.contains("test-only-err-123"), "{got}");
82
83 let input = "NaN".parse::<u32>().unwrap_err();
84 let e = super::retryable(input.clone());
85 assert!(e.is_retryable(), "{e}");
86 let got = format!("{e}");
87 assert!(got.contains(&format!("{input}")), "{got}");
88
89 let e = super::non_retryable_from_str("test-only-err-123");
90 assert!(!e.is_retryable(), "{e}");
91 let got = format!("{e}");
92 assert!(got.contains("test-only-err-123"), "{got}");
93
94 let e = super::non_retryable(input.clone());
95 assert!(!e.is_retryable(), "{e}");
96 let got = format!("{e}");
97 assert!(got.contains(&format!("{input}")), "{got}");
98 }
99}