use crate::config::CustomConfig;
use serde_derive::{Deserialize, Serialize};
use serde_with::{serde_as, skip_serializing_none};
use std::time::Duration;
use validator::Validate;
#[serde_as]
#[skip_serializing_none]
#[derive(Debug, Default, Clone, Validate, Serialize, Deserialize, bon::Builder)]
#[serde(default, rename_all = "kebab-case")]
#[non_exhaustive]
pub struct EnqueueConfig {
#[serde(default)]
#[builder(into)]
pub queue: Option<String>,
#[serde(flatten, default)]
#[builder(default)]
#[validate(nested)]
pub custom: CustomConfig,
}
#[serde_as]
#[skip_serializing_none]
#[derive(Debug, Default, Clone, Validate, Serialize, Deserialize, bon::Builder)]
#[serde(default, rename_all = "kebab-case")]
#[non_exhaustive]
pub struct WorkerConfig {
#[serde(default)]
pub timeout: Option<bool>,
#[serde(default)]
#[serde_as(as = "Option<serde_with::DurationMilliSeconds>")]
pub max_duration: Option<Duration>,
#[serde(flatten, default)]
pub retry_config: Option<RetryConfig>,
#[cfg(feature = "worker-sidekiq")]
#[serde(default)]
pub sidekiq: Option<SidekiqWorkerConfig>,
#[cfg(feature = "worker-pg")]
#[serde(default)]
pub pg: Option<PgWorkerConfig>,
#[serde(flatten, default)]
#[builder(default)]
#[validate(nested)]
pub custom: CustomConfig,
}
#[serde_as]
#[skip_serializing_none]
#[derive(Debug, Default, Clone, Validate, Serialize, Deserialize, bon::Builder)]
#[serde(default, rename_all = "kebab-case")]
#[non_exhaustive]
pub struct SidekiqWorkerConfig {
#[serde(default)]
pub disable_argument_coercion: Option<bool>,
}
#[serde_as]
#[skip_serializing_none]
#[derive(Debug, Default, Clone, Validate, Serialize, Deserialize, bon::Builder)]
#[serde(default, rename_all = "kebab-case")]
#[non_exhaustive]
pub struct RetryConfig {
#[serde(default)]
pub max_retries: Option<usize>,
#[serde(default)]
#[serde_as(as = "Option<serde_with::DurationMilliSeconds>")]
pub delay: Option<Duration>,
#[serde(default)]
#[serde_as(as = "Option<serde_with::DurationMilliSeconds>")]
pub delay_offset: Option<Duration>,
#[serde(default)]
#[serde_as(as = "Option<serde_with::DurationMilliSeconds>")]
pub max_delay: Option<Duration>,
#[serde(default)]
pub backoff_strategy: Option<BackoffStrategy>,
}
#[serde_as]
#[skip_serializing_none]
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
#[non_exhaustive]
pub enum BackoffStrategy {
#[default]
Exponential,
Linear,
None,
}
#[serde_as]
#[skip_serializing_none]
#[derive(Debug, Default, Clone, Validate, Serialize, Deserialize, bon::Builder)]
#[serde(default, rename_all = "kebab-case")]
#[non_exhaustive]
pub struct PgWorkerConfig {
#[serde(default)]
pub success_action: Option<CompletedAction>,
#[serde(default)]
pub failure_action: Option<CompletedAction>,
}
#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
#[non_exhaustive]
pub enum CompletedAction {
Archive,
Delete,
}