use anyhow::Result;
use serde::{Deserialize, Serialize};
use std::net::IpAddr;
use std::env;
use std::path::PathBuf;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ServerConfig {
pub host: IpAddr,
pub port: u16,
pub log_level: String,
pub cors: CorsConfig,
pub limits: LimitsConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CorsConfig {
pub enabled: bool,
pub origins: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LimitsConfig {
pub max_request_size_mb: usize,
pub request_timeout_seconds: u64,
}
impl Default for ServerConfig {
fn default() -> Self {
Self {
host: "127.0.0.1".parse().unwrap(),
port: 8560,
log_level: "info".to_string(),
cors: CorsConfig {
enabled: true,
origins: vec!["*".to_string()],
},
limits: LimitsConfig {
max_request_size_mb: 10,
request_timeout_seconds: 60,
},
}
}
}
pub async fn load_server_config() -> Result<ServerConfig> {
let config_dir = env::var("CONFIG_DIR").unwrap_or_else(|_| "config".to_string());
let config_path = PathBuf::from(config_dir).join("server.json");
if let Ok(content) = tokio::fs::read_to_string(config_path).await {
if let Ok(config) = serde_json::from_str::<ServerConfig>(&content) {
return Ok(config);
}
}
Ok(ServerConfig::default())
}