1use crate::prelude::{Deserialize, Serialize};
7use crate::utils::config::get_env_or_none;
8use pretty_simple_display::{DebugPretty, DisplaySimple};
9
10#[derive(DebugPretty, DisplaySimple, Clone, Deserialize, Serialize)]
12pub struct RetryConfig {
13 pub max_retry_count: Option<u32>,
15 pub retry_delay_secs: Option<u64>,
17}
18
19impl RetryConfig {
20 #[must_use]
22 pub fn new() -> Self {
23 Self::default()
24 }
25
26 #[must_use]
30 pub fn infinite() -> Self {
31 Self {
32 max_retry_count: None, retry_delay_secs: get_env_or_none("RETRY_DELAY_SECS"),
34 }
35 }
36
37 #[must_use]
41 pub fn with_max_retries(max_retries: u32) -> Self {
42 Self {
43 max_retry_count: Some(max_retries),
44 retry_delay_secs: get_env_or_none("RETRY_DELAY_SECS"),
45 }
46 }
47
48 #[must_use]
50 pub fn with_delay(delay_secs: u64) -> Self {
51 Self {
52 max_retry_count: None, retry_delay_secs: Some(delay_secs),
54 }
55 }
56
57 #[must_use]
59 pub fn with_max_retries_and_delay(max_retries: u32, delay_secs: u64) -> Self {
60 Self {
61 max_retry_count: Some(max_retries),
62 retry_delay_secs: Some(delay_secs),
63 }
64 }
65
66 #[must_use]
68 pub fn max_retries(&self) -> u32 {
69 self.max_retry_count.unwrap_or(0)
70 }
71
72 #[must_use]
74 pub fn delay_secs(&self) -> u64 {
75 self.retry_delay_secs.unwrap_or(10)
76 }
77}
78
79impl Default for RetryConfig {
80 fn default() -> Self {
81 let max_retry_count: Option<u32> = get_env_or_none("MAX_RETRY_COUNT");
82 let retry_delay_secs: Option<u64> = get_env_or_none("RETRY_DELAY_SECS");
83
84 Self {
85 max_retry_count,
86 retry_delay_secs,
87 }
88 }
89}