pg-api 0.1.0

A high-performance PostgreSQL REST API driver with rate limiting, connection pooling, and observability
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> {
    // Get config directory from environment or use default
    let config_dir = env::var("CONFIG_DIR").unwrap_or_else(|_| "config".to_string());
    let config_path = PathBuf::from(config_dir).join("server.json");
    
    // Try to load from file
    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);
        }
    }
    
    // Return default if file doesn't exist or is invalid
    Ok(ServerConfig::default())
}