use derive_builder::Builder;
use es_entity::clock::{Clock, ClockHandle};
use serde::{Deserialize, Serialize};
use std::time::Duration;
#[serde_with::serde_as]
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct JobPollerConfig {
#[serde_as(as = "serde_with::DurationSeconds<u64>")]
#[serde(default = "default_job_lost_interval")]
pub job_lost_interval: Duration,
#[serde(default = "default_max_jobs_per_process")]
pub max_jobs_per_process: usize,
#[serde(default = "default_min_jobs_per_process")]
pub min_jobs_per_process: usize,
#[serde_as(as = "serde_with::DurationSeconds<u64>")]
#[serde(default = "default_shutdown_timeout")]
pub shutdown_timeout: Duration,
}
impl Default for JobPollerConfig {
fn default() -> Self {
Self {
job_lost_interval: default_job_lost_interval(),
max_jobs_per_process: default_max_jobs_per_process(),
min_jobs_per_process: default_min_jobs_per_process(),
shutdown_timeout: default_shutdown_timeout(),
}
}
}
#[derive(Builder, Debug, Clone)]
#[builder(build_fn(skip))]
pub struct JobSvcConfig {
#[builder(setter(into, strip_option), default)]
pub(super) pg_con: Option<String>,
#[builder(setter(into, strip_option), default)]
pub(super) max_connections: Option<u32>,
#[builder(default)]
pub(super) exec_migrations: bool,
#[builder(setter(into, strip_option), default)]
pub(super) pool: Option<sqlx::PgPool>,
#[builder(default)]
pub poller_config: JobPollerConfig,
#[builder(setter(into), default = "Clock::handle()")]
pub clock: ClockHandle,
}
impl JobSvcConfig {
pub fn builder() -> JobSvcConfigBuilder {
JobSvcConfigBuilder::default()
}
}
impl JobSvcConfigBuilder {
pub fn build(&mut self) -> Result<JobSvcConfig, String> {
match (self.pg_con.as_ref(), self.pool.as_ref()) {
(None, None) | (Some(None), None) | (None, Some(None)) => {
return Err("One of pg_con or pool must be set".to_string());
}
(Some(_), Some(_)) => return Err("Only one of pg_con or pool must be set".to_string()),
_ => (),
}
if matches!(self.pg_con.as_ref(), Some(Some(_))) && self.exec_migrations.is_none() {
self.exec_migrations = Some(true);
}
Ok(JobSvcConfig {
pg_con: self.pg_con.clone().flatten(),
max_connections: self.max_connections.flatten(),
exec_migrations: self.exec_migrations.unwrap_or(false),
pool: self.pool.clone().flatten(),
poller_config: self.poller_config.clone().unwrap_or_default(),
clock: self
.clock
.clone()
.unwrap_or_else(|| Clock::handle().clone()),
})
}
}
fn default_job_lost_interval() -> Duration {
Duration::from_secs(60 * 5)
}
fn default_max_jobs_per_process() -> usize {
50
}
fn default_min_jobs_per_process() -> usize {
30
}
fn default_shutdown_timeout() -> Duration {
Duration::from_secs(5)
}