#[cfg(all(test, feature = "observers"))]
mod tests;
#[cfg(feature = "observers")]
use fraiseql_observers::config::{EmailSmtpConfig, TransportConfig};
use serde::{Deserialize, Serialize};
#[cfg(feature = "observers")]
const fn default_observers_enabled() -> bool {
true
}
#[cfg(feature = "observers")]
const fn default_poll_interval_ms() -> u64 {
100
}
#[cfg(feature = "observers")]
const fn default_batch_size() -> usize {
100
}
#[cfg(feature = "observers")]
const fn default_channel_capacity() -> usize {
1000
}
#[cfg(feature = "observers")]
const fn default_auto_reload() -> bool {
true
}
#[cfg(feature = "observers")]
const fn default_reload_interval_secs() -> u64 {
60
}
#[cfg(feature = "observers")]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(default)]
pub struct ObserverPoolConfig {
#[serde(default = "default_observer_pool_min")]
pub min_connections: u32,
#[serde(default = "default_observer_pool_max")]
pub max_connections: u32,
#[serde(default = "default_observer_acquire_timeout")]
pub acquire_timeout_secs: u64,
}
#[cfg(feature = "observers")]
const fn default_observer_pool_min() -> u32 {
2
}
#[cfg(feature = "observers")]
const fn default_observer_pool_max() -> u32 {
5
}
#[cfg(feature = "observers")]
const fn default_observer_acquire_timeout() -> u64 {
10
}
#[cfg(feature = "observers")]
impl Default for ObserverPoolConfig {
fn default() -> Self {
Self {
min_connections: default_observer_pool_min(),
max_connections: default_observer_pool_max(),
acquire_timeout_secs: default_observer_acquire_timeout(),
}
}
}
#[cfg(feature = "observers")]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(default, deny_unknown_fields)]
pub struct ObserverRuntimeSettings {
#[serde(default = "default_poll_interval_ms")]
pub poll_interval_ms: u64,
#[serde(default = "default_batch_size")]
pub batch_size: usize,
#[serde(default = "default_channel_capacity")]
pub channel_capacity: usize,
#[serde(default = "default_auto_reload")]
pub auto_reload: bool,
#[serde(default = "default_reload_interval_secs")]
pub reload_interval_secs: u64,
#[serde(default)]
pub max_dlq_size: Option<usize>,
#[serde(default)]
pub transport: TransportConfig,
#[serde(default)]
pub email: Option<EmailSmtpConfig>,
#[serde(default)]
pub pool: ObserverPoolConfig,
}
#[cfg(feature = "observers")]
impl Default for ObserverRuntimeSettings {
fn default() -> Self {
Self {
poll_interval_ms: default_poll_interval_ms(),
batch_size: default_batch_size(),
channel_capacity: default_channel_capacity(),
auto_reload: default_auto_reload(),
reload_interval_secs: default_reload_interval_secs(),
max_dlq_size: None,
transport: TransportConfig::default(),
email: None,
pool: ObserverPoolConfig::default(),
}
}
}
#[cfg(feature = "observers")]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ObserverConfig {
#[serde(default = "default_observers_enabled")]
pub enabled: bool,
#[serde(default)]
pub runtime: ObserverRuntimeSettings,
#[serde(default, rename = "poll_interval_ms", skip_serializing)]
pub(crate) legacy_poll_interval_ms: Option<toml::Value>,
#[serde(default, rename = "batch_size", skip_serializing)]
pub(crate) legacy_batch_size: Option<toml::Value>,
#[serde(default, rename = "channel_capacity", skip_serializing)]
pub(crate) legacy_channel_capacity: Option<toml::Value>,
#[serde(default, rename = "auto_reload", skip_serializing)]
pub(crate) legacy_auto_reload: Option<toml::Value>,
#[serde(default, rename = "reload_interval_secs", skip_serializing)]
pub(crate) legacy_reload_interval_secs: Option<toml::Value>,
#[serde(default, rename = "max_dlq_size", skip_serializing)]
pub(crate) legacy_max_dlq_size: Option<toml::Value>,
#[serde(default, rename = "pool", skip_serializing)]
pub(crate) legacy_pool: Option<toml::Value>,
}
#[cfg(feature = "observers")]
impl ObserverConfig {
#[must_use]
pub fn misplaced_runtime_keys(&self) -> Vec<&'static str> {
let mut keys = Vec::new();
if self.legacy_poll_interval_ms.is_some() {
keys.push("poll_interval_ms");
}
if self.legacy_batch_size.is_some() {
keys.push("batch_size");
}
if self.legacy_channel_capacity.is_some() {
keys.push("channel_capacity");
}
if self.legacy_auto_reload.is_some() {
keys.push("auto_reload");
}
if self.legacy_reload_interval_secs.is_some() {
keys.push("reload_interval_secs");
}
if self.legacy_max_dlq_size.is_some() {
keys.push("max_dlq_size");
}
if self.legacy_pool.is_some() {
keys.push("pool");
}
keys
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AdmissionConfig {
#[serde(default = "default_admission_max_concurrent")]
pub max_concurrent: usize,
#[serde(default = "default_admission_max_queue_depth")]
pub max_queue_depth: u64,
}
pub(crate) const fn default_admission_max_concurrent() -> usize {
500
}
pub(crate) const fn default_admission_max_queue_depth() -> u64 {
1000
}