use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct NamedSourceConfig {
pub name: String,
#[serde(flatten)]
pub config: SourceConfig,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(tag = "type")]
pub enum SourceConfig {
#[serde(rename = "postgresql")]
PostgreSQL(Box<PostgreSQLConfig>),
#[serde(rename = "mysql")]
MySQL(MySQLConfig),
#[serde(rename = "mongodb")]
MongoDB(MongoDBConfig),
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct PostgreSQLConfig {
#[serde(flatten)]
pub connection: PostgreSQLConnection,
#[serde(default = "default_slot_name")]
pub slot_name: String,
#[serde(default = "default_publication")]
pub publication: String,
#[serde(default)]
pub pool: PoolConfig,
#[serde(default)]
pub ssl: SslConfig,
#[serde(default)]
pub statement_cache: StatementCacheConfig,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(untagged)]
pub enum PostgreSQLConnection {
ConnectionString(String),
Parameters {
host: String,
port: u16,
database: String,
username: String,
#[serde(skip_serializing)]
password: String,
},
}
#[derive(Debug, Clone, Deserialize, Serialize, Default)]
pub struct PoolConfig {
#[serde(default = "default_pool_size")]
pub max_size: u32,
#[serde(default = "default_min_idle")]
pub min_idle: u32,
#[serde(default)]
pub connection_timeout: Option<u64>,
#[serde(default)]
pub idle_timeout: Option<u64>,
}
#[derive(Debug, Clone, Deserialize, Serialize, Default)]
pub struct SslConfig {
#[serde(default)]
pub mode: SslMode,
#[serde(default)]
pub ca_cert: Option<String>,
#[serde(default)]
pub client_cert: Option<String>,
#[serde(default)]
pub client_key: Option<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize, Default)]
#[serde(rename_all = "snake_case")]
pub enum SslMode {
#[default]
Disable,
Prefer,
Require,
VerifyCa,
VerifyFull,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct StatementCacheConfig {
#[serde(default = "default_cache_enabled")]
pub enabled: bool,
#[serde(default = "default_cache_max_size")]
pub max_size: usize,
}
impl Default for StatementCacheConfig {
fn default() -> Self {
Self {
enabled: default_cache_enabled(),
max_size: default_cache_max_size(),
}
}
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct MySQLConfig {
pub connection_string: String,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct MongoDBConfig {
pub connection_string: String,
}
fn default_pool_size() -> u32 {
10
}
fn default_min_idle() -> u32 {
1
}
fn default_slot_name() -> String {
"meilibridge".to_string()
}
fn default_publication() -> String {
"meilibridge_pub".to_string()
}
fn default_cache_enabled() -> bool {
true
}
fn default_cache_max_size() -> usize {
100
}