use serde::{Deserialize, Serialize};
use std::path::PathBuf;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(default)]
pub struct ServerConfig {
pub log_level: String,
pub https: bool,
pub tls_cert: Option<String>,
pub tls_key: Option<String>,
#[serde(alias = "url")]
pub host: String,
pub port: u16,
pub threads: u32,
pub database: Option<String>,
pub auth_file: Option<String>,
pub require_auth: bool,
pub credential_cache_ttl_secs: u64,
pub enforce_access_control: bool,
pub completion_check_interval_secs: f64,
pub logging: ServerLoggingConfig,
pub admin_users: Vec<String>,
}
impl Default for ServerConfig {
fn default() -> Self {
Self {
log_level: "info".to_string(),
https: false,
tls_cert: None,
tls_key: None,
host: "0.0.0.0".to_string(),
port: 8080,
threads: 1,
database: None,
auth_file: None,
require_auth: false,
credential_cache_ttl_secs: 60,
enforce_access_control: false,
completion_check_interval_secs: 30.0,
logging: ServerLoggingConfig::default(),
admin_users: Vec::new(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(default)]
#[derive(Default)]
pub struct ServerLoggingConfig {
pub log_dir: Option<PathBuf>,
pub json_logs: bool,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_server_config_defaults() {
let config = ServerConfig::default();
assert_eq!(config.log_level, "info");
assert!(!config.https);
assert!(config.tls_cert.is_none());
assert!(config.tls_key.is_none());
assert_eq!(config.host, "0.0.0.0");
assert_eq!(config.port, 8080);
assert_eq!(config.threads, 1);
assert!(config.database.is_none());
assert!(!config.require_auth);
assert!(!config.enforce_access_control);
assert_eq!(config.completion_check_interval_secs, 30.0);
}
#[test]
fn test_logging_config_defaults() {
let config = ServerLoggingConfig::default();
assert!(config.log_dir.is_none());
assert!(!config.json_logs);
}
}