use std::env; use thiserror::Error; #[derive(Debug, Clone)] pub struct Config { pub db_user: String, pub db_password: String, pub db_host: String, pub db_port: u16, pub db_name: String, } #[derive(Debug, Error)] pub enum ConfigError { #[error("missing env var: {0}")] MissingVar(&'static str), #[error("invalid DB_PORT: {0}")] InvalidPort(String), } impl Config { pub fn from_env() -> Result { dotenvy::dotenv().ok(); let db_user = env::var("DB_USERNAME").map_err(|_| ConfigError::MissingVar("DB_USERNAME"))?; let db_password = env::var("DB_PASSWORD").map_err(|_| ConfigError::MissingVar("DB_PASSWORD"))?; let db_host = env::var("DB_HOST").map_err(|_| ConfigError::MissingVar("DB_HOST"))?; let db_name = env::var("DB_NAME").map_err(|_| ConfigError::MissingVar("DB_NAME"))?; let db_port_raw = env::var("DB_PORT").map_err(|_| ConfigError::MissingVar("DB_PORT"))?; let db_port = db_port_raw .parse::() .map_err(|_| ConfigError::InvalidPort(db_port_raw))?; Ok(Self { db_user, db_password, db_host, db_port, db_name, }) } pub fn database_url(&self) -> String { format!( "postgres://{}:{}@{}:{}/{}", self.db_user, self.db_password, self.db_host, self.db_port, self.db_name ) } }