use anyhow::{anyhow, Result};
use serde::Deserialize;
use std::fs::File;
use std::io::BufReader;
use crate::common::auth::AuthConfig;
#[derive(Debug, Deserialize)]
pub struct Config {
pub server: ServerConfig,
#[serde(default)]
pub tls: TlsConfig,
#[serde(default)]
pub auth: AuthConfig,
#[serde(default)]
pub cluster: Option<ClusterConfig>,
#[serde(default)]
pub logging: LoggingConfig,
}
#[derive(Debug, Deserialize)]
pub struct ServerConfig {
pub host: String,
pub port: u16,
#[serde(default)]
pub max_payload: Option<usize>,
#[serde(default)]
pub max_connections: Option<usize>,
}
#[derive(Debug, Deserialize, Default)]
pub struct TlsConfig {
#[serde(default)]
pub enabled: bool,
pub cert_file: Option<String>,
pub key_file: Option<String>,
}
#[derive(Debug, Deserialize)]
pub struct ClusterConfig {
pub name: String,
#[serde(default)]
pub peers: Vec<String>,
}
#[derive(Debug, Deserialize, Default)]
pub struct LoggingConfig {
#[serde(default = "default_log_level")]
pub level: String,
}
fn default_log_level() -> String {
"info".to_string()
}
pub fn read_config_file(file_name: String) -> Result<Config> {
let file =
File::open(&file_name).map_err(|_| anyhow!("Config file not found: {}", file_name))?;
let reader = BufReader::new(file);
let config: Config = serde_yaml::from_reader(reader)?;
Ok(config)
}