ocypod 0.8.0

Ocypod is a Redis-backed service for orchestrating background jobs.
Documentation
use redis::{self, from_redis_value, FromRedisValue, RedisResult};
use serde::{Deserialize, Serialize};

use crate::models::Duration;

#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
#[serde(default)]
pub struct Settings {
    pub timeout: Duration,
    pub heartbeat_timeout: Duration,
    pub expires_after: Duration,
    pub retries: u64,
    pub retry_delays: Vec<Duration>,
}

impl FromRedisValue for Settings {
    fn from_redis_value(v: &redis::Value) -> RedisResult<Self> {
        let (timeout, heartbeat_timeout, expires_after, retries, retry_delays): (
            Duration,
            Duration,
            Duration,
            u64,
            Option<String>,
        ) = from_redis_value(v)?;
        let retry_delays = match retry_delays {
            Some(s) => serde_json::from_str(&s).unwrap(),
            None => Vec::new(),
        };
        Ok(Self {
            timeout,
            heartbeat_timeout,
            expires_after,
            retries,
            retry_delays,
        })
    }
}

impl Default for Settings {
    fn default() -> Self {
        Self {
            timeout: Duration::from_secs(300),
            heartbeat_timeout: Duration::from_secs(0),
            expires_after: Duration::from_secs(300),
            retries: 0,
            retry_delays: Vec::new(),
        }
    }
}