use std::path::Path;
use serde::{Deserialize, Serialize};
use crate::config::validation::{require_nonempty, require_nonzero};
use crate::errors::OrionError;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(default)]
pub struct ServerConfig {
pub host: String,
pub port: u16,
pub shutdown_drain_secs: u64,
pub tls: TlsConfig,
pub compression: CompressionConfig,
}
impl Default for ServerConfig {
fn default() -> Self {
Self {
host: "0.0.0.0".to_string(),
port: 8080,
shutdown_drain_secs: 30,
tls: TlsConfig::default(),
compression: CompressionConfig::default(),
}
}
}
impl ServerConfig {
pub(crate) fn validate(&self) -> Result<(), OrionError> {
require_nonzero(u64::from(self.port), "server.port")?;
if self.tls.enabled {
require_nonempty(
&self.tls.cert_path,
"server.tls.cert_path (required when TLS is enabled)",
)?;
require_nonempty(
&self.tls.key_path,
"server.tls.key_path (required when TLS is enabled)",
)?;
if !Path::new(&self.tls.cert_path).exists() {
return Err(OrionError::Config {
message: format!("TLS certificate file not found: '{}'", self.tls.cert_path),
});
}
if !Path::new(&self.tls.key_path).exists() {
return Err(OrionError::Config {
message: format!("TLS private key file not found: '{}'", self.tls.key_path),
});
}
}
Ok(())
}
}
impl IngestConfig {
pub(crate) fn validate(&self) -> Result<(), OrionError> {
require_nonzero(self.max_payload_size as u64, "ingest.max_payload_size")
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default)]
pub struct CompressionConfig {
pub enabled: bool,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(default)]
pub struct TlsConfig {
pub enabled: bool,
pub cert_path: String,
pub key_path: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(default)]
pub struct IngestConfig {
pub max_payload_size: usize,
}
impl Default for IngestConfig {
fn default() -> Self {
Self {
max_payload_size: 1_048_576, }
}
}