use serde::Deserialize;
#[derive(Debug, Deserialize, Clone)]
pub struct InfrastructureConfig {
pub redis: RedisConfig,
#[serde(default)]
pub control_plane_redis: Option<RedisConfig>,
#[serde(default)]
pub bridge: Option<BridgeConfig>,
#[serde(default)]
pub postgres: Option<PostgresConfig>,
#[serde(default)]
pub mlflow: Option<MlflowConfig>,
#[serde(default)]
pub minio: Option<MinioConfig>,
}
#[derive(Debug, Deserialize, Clone)]
pub struct RedisConfig {
pub url: String,
#[serde(default = "default_max_connections")]
pub max_connections: usize,
#[serde(default = "default_connection_timeout")]
pub connection_timeout_ms: u64,
}
impl Default for RedisConfig {
fn default() -> Self {
Self {
url: "redis://localhost:6379".to_string(),
max_connections: default_max_connections(),
connection_timeout_ms: default_connection_timeout(),
}
}
}
#[derive(Debug, Deserialize, Clone)]
pub struct PostgresConfig {
pub host: String,
pub port: u16,
pub database: String,
pub username: String,
pub password: String,
#[serde(default = "default_max_connections")]
pub max_connections: usize,
}
#[derive(Debug, Deserialize, Clone)]
pub struct MlflowConfig {
pub tracking_uri: String,
pub artifact_location: String,
}
#[derive(Debug, Deserialize, Clone)]
pub struct MinioConfig {
pub endpoint: String,
pub access_key: String,
pub secret_key: String,
#[serde(default)]
pub secure: bool,
}
#[derive(Debug, Deserialize, Clone)]
pub struct BridgeConfig {
#[serde(default = "default_bridge_enabled")]
pub enabled: bool,
#[serde(default = "default_local_topics")]
pub local_topics: Vec<String>,
#[serde(default = "default_bridged_topics")]
pub bridged_topics: Vec<String>,
#[serde(default)]
pub robot_id: Option<String>,
}
impl Default for BridgeConfig {
fn default() -> Self {
Self {
enabled: default_bridge_enabled(),
local_topics: default_local_topics(),
bridged_topics: default_bridged_topics(),
robot_id: None,
}
}
}
fn default_bridge_enabled() -> bool {
true
}
fn default_local_topics() -> Vec<String> {
vec![
"/sensor/camera/*".to_string(),
"/sensor/lidar/*".to_string(),
"/sensor/imu/*".to_string(),
]
}
fn default_bridged_topics() -> Vec<String> {
vec![
"/system/*".to_string(),
"/telemetry/*".to_string(),
"/logs/*".to_string(),
"/fleet/*".to_string(),
]
}
fn default_max_connections() -> usize {
10
}
fn default_connection_timeout() -> u64 {
5000
}