rhythm-backend/src/config.rs
2026-04-16 11:56:27 +02:00

53 lines
1.4 KiB
Rust

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<Self, ConfigError> {
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::<u16>()
.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
)
}
}