use serde::{Deserialize, Serialize};
use std::collections::HashMap;
mod api;
mod error_handling;
mod loader;
mod logging;
mod meilisearch;
mod monitoring;
mod performance;
pub mod pipeline;
mod redis;
mod source;
mod sync_task;
mod validation;
pub use api::*;
pub use error_handling::*;
pub use loader::*;
pub use logging::*;
pub use meilisearch::*;
pub use monitoring::*;
pub use performance::*;
pub use pipeline::*;
pub use redis::*;
pub use source::*;
pub use sync_task::*;
pub use validation::*;
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(deny_unknown_fields)]
pub struct Config {
#[serde(default)]
pub app: AppConfig,
#[serde(skip_serializing_if = "Option::is_none")]
pub source: Option<SourceConfig>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub sources: Vec<NamedSourceConfig>,
pub meilisearch: MeilisearchConfig,
pub sync_tasks: Vec<SyncTaskConfig>,
pub redis: RedisConfig,
#[serde(default)]
pub api: ApiConfig,
#[serde(default)]
pub logging: LoggingConfig,
#[serde(default)]
pub monitoring: MonitoringConfig,
#[serde(default)]
pub error_handling: ErrorHandlingConfig,
#[serde(default)]
pub plugins: PluginConfig,
#[serde(default)]
pub features: FeatureFlags,
#[serde(default)]
pub performance: PerformanceConfig,
#[serde(default, alias = "exactly_once_delivery")]
pub at_least_once_delivery: AtLeastOnceDeliveryConfig,
}
#[derive(Debug, Clone, Deserialize, Serialize, Default)]
pub struct AppConfig {
#[serde(default = "default_name")]
pub name: String,
#[serde(default = "default_instance_id")]
pub instance_id: String,
#[serde(default)]
pub tags: HashMap<String, String>,
}
#[derive(Debug, Clone, Deserialize, Serialize, Default)]
pub struct PluginConfig {
#[serde(default)]
pub directory: Option<String>,
#[serde(default)]
pub enabled: Vec<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize, Default)]
pub struct FeatureFlags {
#[serde(default = "default_true")]
pub auto_recovery: bool,
#[serde(default = "default_true")]
pub health_checks: bool,
#[serde(default = "default_true")]
pub metrics_export: bool,
#[serde(default)]
pub distributed_mode: bool,
}
fn default_name() -> String {
"meilibridge".to_string()
}
fn default_instance_id() -> String {
uuid::Uuid::new_v4().to_string()
}
fn default_true() -> bool {
true
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct AtLeastOnceDeliveryConfig {
#[serde(default = "default_true")]
pub enabled: bool,
#[serde(default = "default_deduplication_window")]
pub deduplication_window: usize,
#[serde(default = "default_transaction_timeout")]
pub transaction_timeout_secs: u64,
#[serde(default = "default_true")]
pub two_phase_commit: bool,
#[serde(default = "default_true")]
pub checkpoint_before_write: bool,
}
impl Default for AtLeastOnceDeliveryConfig {
fn default() -> Self {
Self {
enabled: true,
deduplication_window: default_deduplication_window(),
transaction_timeout_secs: default_transaction_timeout(),
two_phase_commit: true,
checkpoint_before_write: true,
}
}
}
fn default_deduplication_window() -> usize {
10000
}
fn default_transaction_timeout() -> u64 {
30
}