From ce65d9eeafcd1f9d5c3adef1c9b1af6258ee711a Mon Sep 17 00:00:00 2001 From: rtkay123 Date: Sun, 1 Feb 2026 13:33:07 +0200 Subject: feat: conn to db --- src/config/mod.rs | 155 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100644 src/config/mod.rs (limited to 'src/config/mod.rs') diff --git a/src/config/mod.rs b/src/config/mod.rs new file mode 100644 index 0000000..45e12c3 --- /dev/null +++ b/src/config/mod.rs @@ -0,0 +1,155 @@ +mod cli; +mod logging; +mod port; +pub use cli::Cli; +use serde::Deserialize; +use url::Url; + +use crate::{config::logging::LogLevel}; + +#[derive(Default, Deserialize, Debug, PartialEq, Eq)] +#[serde(rename_all = "kebab-case")] +pub enum Environment { + #[default] + Dev, + Prod, +} + +#[derive(Debug, Deserialize, Default)] +#[serde(rename_all = "kebab-case")] +pub struct Config { + #[serde(default)] + pub database: DatabaseOptions, + #[serde(default)] + pub server: Api, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "kebab-case")] +pub struct Api { + #[serde(default = "default_domain")] + pub domain: String, + + #[serde(default = "default_request_timeout")] + pub request_timeout: u64, + + #[serde(default = "default_port")] + pub port: u16, + + #[serde(default = "default_log_level")] + pub log_level: LogLevel, + + #[serde(default = "default_sys_name")] + pub system_name: String, + + #[serde(default)] + pub environment: Environment, +} + +impl Default for Api { + fn default() -> Self { + Self { + domain: default_domain(), + request_timeout: default_request_timeout(), + port: default_port(), + log_level: default_log_level(), + system_name: default_sys_name(), + environment: Environment::default(), + } + } +} + +#[derive(Clone, Debug, Deserialize)] +#[serde(rename_all = "kebab-case")] +pub struct DatabaseOptions { + #[serde(default = "default_database")] + pub url: Url, + pub pool_size: u32, +} + +impl DatabaseOptions { + pub fn create(url: & Url, pool_size: Option) -> Self { + Self { + url: url.to_owned(), + pool_size: pool_size.unwrap_or_else(|| { + let def = 100; + tracing::debug!(size = def, "Setting default db pool size"); + def + }), + } + } +} + +fn default_database() -> Url { + Url::parse("postgres://postgres:password@localhost:5432/sellershut") + .expect("valid default DATABASE url") +} + +impl Default for DatabaseOptions { + fn default() -> Self { + Self { + url: default_database(), + pool_size: 100 + + } + } +} + +fn default_sys_name() -> String { + "sellershut".to_string() +} + +fn default_domain() -> String { + "localhost".to_string() +} + +fn default_request_timeout() -> u64 { + 10 +} + +fn default_port() -> u16 { + 2210 +} + +fn default_log_level() -> LogLevel { + LogLevel::Debug +} + + +impl Config { + pub fn merge_with_cli(&mut self, cli: &Cli) { + let server = &mut self.server; + let dsn = &mut self.database; + + if let Some(port) = cli.port { + server.port = port; + } + + if let Some(domain) = &cli.domain { + server.domain = domain.to_string(); + } + + if let Some(log_level) = &cli.log_level { + server.log_level = *log_level; + } + + if let Some(timeout) = cli.timeout_duration { + server.request_timeout = timeout; + } + + if let Some(db_url) = &cli.db { + dsn.url = db_url.clone(); + } + } +} + +#[cfg(test)] +mod tests { + use crate::config::Config; + + #[test] + fn config_file() { + let s = include_str!("../../sellershut.toml"); + assert!(toml::from_str::(s).is_ok()) + } +} -- cgit v1.2.3