wfe_core/models/
error_behavior.rs1use std::time::Duration;
2
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
6pub enum ErrorBehavior {
8 Retry {
10 #[serde(with = "duration_millis")]
11 interval: Duration,
12 #[serde(default = "default_max_retries")]
13 max_retries: u32,
14 },
15 Suspend,
17 Terminate,
19 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
41pub fn serialize<S: Serializer>(duration: &Duration, serializer: S) -> Result<S::Ok, S::Error> {
43 serializer.serialize_u64(duration.as_millis() as u64)
44 }
45
46pub 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}