pipedash-core 0.4.0

Framework-agnostic core library for Pipedash
Documentation
use serde::{
    Deserialize,
    Serialize,
};

use super::error::FailureKind;

#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum RefreshState {
    Ok,
    Failed,
    Pending,
    Recent,
    NotFound,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct RefreshResult {
    pub provider_id: i64,
    pub state: RefreshState,
    pub kind: Option<FailureKind>,
    pub message: Option<String>,
}

impl RefreshResult {
    pub fn new(provider_id: i64, state: RefreshState) -> Self {
        Self {
            provider_id,
            state,
            kind: None,
            message: None,
        }
    }

    pub fn failed(provider_id: i64, kind: FailureKind, message: String) -> Self {
        Self {
            provider_id,
            state: RefreshState::Failed,
            kind: Some(kind),
            message: Some(message),
        }
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn serializes_to_the_wire_contract() {
        let result = RefreshResult::failed(7, FailureKind::RateLimited, "slow down".to_string());

        assert_eq!(
            serde_json::to_value(&result).unwrap(),
            serde_json::json!({
                "provider_id": 7,
                "state": "failed",
                "kind": "rate_limited",
                "message": "slow down"
            })
        );
        assert_eq!(
            serde_json::to_value(RefreshResult::new(1, RefreshState::NotFound)).unwrap(),
            serde_json::json!({
                "provider_id": 1,
                "state": "not_found",
                "kind": null,
                "message": null
            })
        );
    }
}