Skip to main content

pipedash_core/domain/
refresh.rs

1use serde::{
2    Deserialize,
3    Serialize,
4};
5
6use super::error::FailureKind;
7
8#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
9#[serde(rename_all = "snake_case")]
10pub enum RefreshState {
11    Ok,
12    Failed,
13    Pending,
14    Recent,
15    NotFound,
16}
17
18#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
19pub struct RefreshResult {
20    pub provider_id: i64,
21    pub state: RefreshState,
22    pub kind: Option<FailureKind>,
23    pub message: Option<String>,
24}
25
26impl RefreshResult {
27    pub fn new(provider_id: i64, state: RefreshState) -> Self {
28        Self {
29            provider_id,
30            state,
31            kind: None,
32            message: None,
33        }
34    }
35
36    pub fn failed(provider_id: i64, kind: FailureKind, message: String) -> Self {
37        Self {
38            provider_id,
39            state: RefreshState::Failed,
40            kind: Some(kind),
41            message: Some(message),
42        }
43    }
44}
45
46#[cfg(test)]
47mod tests {
48    use super::*;
49
50    #[test]
51    fn serializes_to_the_wire_contract() {
52        let result = RefreshResult::failed(7, FailureKind::RateLimited, "slow down".to_string());
53
54        assert_eq!(
55            serde_json::to_value(&result).unwrap(),
56            serde_json::json!({
57                "provider_id": 7,
58                "state": "failed",
59                "kind": "rate_limited",
60                "message": "slow down"
61            })
62        );
63        assert_eq!(
64            serde_json::to_value(RefreshResult::new(1, RefreshState::NotFound)).unwrap(),
65            serde_json::json!({
66                "provider_id": 1,
67                "state": "not_found",
68                "kind": null,
69                "message": null
70            })
71        );
72    }
73}