use crate::error::{Error, Result};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Config {
pub database_url: String,
pub mcp_port: u16,
pub log_level: String,
}
impl Config {
pub fn from_env() -> Result<Self> {
#[cfg(not(test))]
dotenvy::dotenv().ok();
let database_url = std::env::var("DATABASE_URL")
.map_err(|_| Error::Config("DATABASE_URL not set".to_string()))?;
if database_url.is_empty() {
return Err(Error::Config("DATABASE_URL not set or empty".to_string()));
}
let mcp_port = std::env::var("MCP_PORT")
.unwrap_or_else(|_| "3333".to_string())
.parse::<u16>()
.map_err(|e| Error::Config(format!("Invalid MCP_PORT: {e}")))?;
let log_level = std::env::var("LOG_LEVEL").unwrap_or_else(|_| "info".to_string());
Ok(Self {
database_url,
mcp_port,
log_level,
})
}
#[cfg(test)]
pub fn for_test(database_url: String) -> Self {
Self {
database_url,
mcp_port: 3333,
log_level: "info".to_string(),
}
}
}
impl Default for Config {
fn default() -> Self {
Self {
database_url: std::env::var("DATABASE_URL").unwrap_or_else(|_| String::new()), mcp_port: 3333,
log_level: "info".to_string(),
}
}
}