rsub 0.1.0

A high-performance message broker with QUIC transport and pub/sub messaging patterns
Documentation
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)
}