backend/src/config.rs
Radical 026d48c6e7 feat: load config from proper location
also adds a way to change load location using cmdline arguments
2025-05-01 01:08:45 +02:00

78 lines
1.6 KiB
Rust

use crate::Error;
use serde::Deserialize;
use sqlx::postgres::PgConnectOptions;
use tokio::fs::read_to_string;
#[derive(Debug, Deserialize)]
pub struct ConfigBuilder {
database: Database,
web: Option<WebBuilder>,
}
#[derive(Debug, Deserialize, Clone)]
pub struct Database {
username: String,
password: String,
host: String,
database: String,
port: u16,
}
#[derive(Debug, Deserialize)]
struct WebBuilder {
url: Option<String>,
port: Option<u16>,
ssl: Option<bool>,
}
impl ConfigBuilder {
pub async fn load(path: String) -> Result<Self, Error> {
let raw = read_to_string(path).await?;
let config = toml::from_str(&raw)?;
Ok(config)
}
pub fn build(self) -> Config {
let web = if let Some(web) = self.web {
Web {
url: web.url.unwrap_or(String::from("0.0.0.0")),
port: web.port.unwrap_or(8080),
}
} else {
Web {
url: String::from("0.0.0.0"),
port: 8080,
}
};
Config {
database: self.database,
web,
}
}
}
#[derive(Debug, Clone)]
pub struct Config {
pub database: Database,
pub web: Web,
}
#[derive(Debug, Clone)]
pub struct Web {
pub url: String,
pub port: u16,
}
impl Database {
pub fn connect_options(&self) -> PgConnectOptions {
PgConnectOptions::new()
.database(&self.database)
.host(&self.host)
.username(&self.username)
.password(&self.password)
.port(self.port)
}
}