use std::time::Duration;
use apalis_core::backend::queue::Queue;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Config {
#[serde(default = "default_batch_size")]
pub batch_size: usize,
#[serde(default = "default_heartbeat_interval")]
pub heartbeat_interval: Duration,
#[serde(default = "default_missed_heartbeats")]
pub missed_heartbeats: usize,
pub queue: Queue,
pub database_url: Option<String>,
#[serde(default = "default_events")]
pub lock_tasks: bool,
#[serde(default = "default_events")]
pub persist_results: bool,
}
impl Default for Config {
fn default() -> Self {
Self {
batch_size: 10,
heartbeat_interval: Duration::from_secs(30),
missed_heartbeats: 2,
queue: Queue::from("default"),
database_url: None,
lock_tasks: true,
persist_results: true,
}
}
}
fn default_batch_size() -> usize {
10
}
fn default_heartbeat_interval() -> Duration {
Duration::from_secs(30)
}
fn default_missed_heartbeats() -> usize {
2
}
fn default_events() -> bool {
true
}
impl Config {
#[must_use]
pub fn batch_size(mut self, size: usize) -> Self {
assert!(size > 0, "batch size cannot be 0");
self.batch_size = size;
self
}
#[must_use]
pub fn heartbeat_interval(mut self, interval: Duration) -> Self {
self.heartbeat_interval = interval;
self
}
#[must_use]
pub fn queue(mut self, queue: impl AsRef<str>) -> Self {
self.queue = Queue::from(queue.as_ref());
self
}
#[must_use]
pub fn missed_heartbeats(mut self, missed_heartbeats: usize) -> Self {
self.missed_heartbeats = missed_heartbeats;
self
}
#[must_use]
pub fn database_url(mut self, database_url: impl Into<String>) -> Self {
self.database_url = Some(database_url.into());
self
}
#[must_use]
pub fn lock_tasks(mut self, lock_tasks: bool) -> Self {
self.lock_tasks = lock_tasks;
self
}
#[must_use]
pub fn persist_results(mut self, persist_results: bool) -> Self {
self.persist_results = persist_results;
self
}
#[must_use]
pub fn orphaned_duration(&self) -> Duration {
self.heartbeat_interval * self.missed_heartbeats as u32
}
}