Skip to main content

wfe_core/models/
error_behavior.rs

1use std::time::Duration;
2
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
6/// Errorbehavior.
7pub enum ErrorBehavior {
8    /// Retry.
9    Retry {
10        #[serde(with = "duration_millis")]
11        interval: Duration,
12        #[serde(default = "default_max_retries")]
13        max_retries: u32,
14    },
15    /// Suspend.
16    Suspend,
17    /// Terminate.
18    Terminate,
19    /// Compensate.
20    Compensate,
21}
22
23fn default_max_retries() -> u32 {
24    3
25}
26
27impl Default for ErrorBehavior {
28    fn default() -> Self {
29        Self::Retry {
30            interval: Duration::from_secs(60),
31            max_retries: default_max_retries(),
32        }
33    }
34}
35
36mod duration_millis {
37    use std::time::Duration;
38
39    use serde::{Deserialize, Deserializer, Serializer};
40
41/// Serialize.
42    pub fn serialize<S: Serializer>(duration: &Duration, serializer: S) -> Result<S::Ok, S::Error> {
43        serializer.serialize_u64(duration.as_millis() as u64)
44    }
45
46/// Deserialize.
47    pub fn deserialize<'de, D: Deserializer<'de>>(deserializer: D) -> Result<Duration, D::Error> {
48        let millis = u64::deserialize(deserializer)?;
49        Ok(Duration::from_millis(millis))
50    }
51}
52
53#[cfg(test)]
54mod tests {
55    use super::*;
56    use pretty_assertions::assert_eq;
57
58    #[test]
59    fn default_is_retry_60s() {
60        let behavior = ErrorBehavior::default();
61        assert_eq!(
62            behavior,
63            ErrorBehavior::Retry {
64                interval: Duration::from_secs(60),
65                max_retries: 3,
66            }
67        );
68    }
69
70    #[test]
71    fn serde_round_trip() {
72        let variants = vec![
73            ErrorBehavior::Retry {
74                interval: Duration::from_secs(30),
75                max_retries: 3,
76            },
77            ErrorBehavior::Suspend,
78            ErrorBehavior::Terminate,
79            ErrorBehavior::Compensate,
80        ];
81        for variant in variants {
82            let json = serde_json::to_string(&variant).unwrap();
83            let deserialized: ErrorBehavior = serde_json::from_str(&json).unwrap();
84            assert_eq!(variant, deserialized);
85        }
86    }
87}