From b4cc08bfaaa372b089695b62c1c55bf82a081b20 Mon Sep 17 00:00:00 2001 From: phoenix Date: Sat, 30 May 2026 23:39:38 -0400 Subject: [PATCH] Adding env module --- src/env/environment.rs | 106 +++++++++++++++++++++++++++++++++++++++++ src/env/keys.rs | 52 ++++++++++++++++++++ src/env/mod.rs | 40 ++++++++++++++++ src/env/utility.rs | 15 ++++++ src/main.rs | 1 + 5 files changed, 214 insertions(+) create mode 100644 src/env/environment.rs create mode 100644 src/env/keys.rs create mode 100644 src/env/mod.rs create mode 100644 src/env/utility.rs diff --git a/src/env/environment.rs b/src/env/environment.rs new file mode 100644 index 0000000..6ebf5c8 --- /dev/null +++ b/src/env/environment.rs @@ -0,0 +1,106 @@ +pub async fn get_db_url() -> crate::env::EnvVar { + dotenvy::dotenv().ok(); + let key = crate::env::keys::DB_URL; + let value = std::env::var(key).expect(key); + + crate::env::init_envvar(key, &value) +} + +pub async fn get_secret_main_key() -> crate::env::EnvVar { + dotenvy::dotenv().ok(); + let key = crate::env::keys::SECRET_MAIN_KEY; + let value = std::env::var(key).expect(key); + + crate::env::init_envvar(key, &value) +} + +pub async fn get_service_passphrase() -> crate::env::EnvVar { + dotenvy::dotenv().ok(); + let key = crate::env::keys::SERVICE_PASSPHRASE; + let value = std::env::var(key).expect(key); + + crate::env::init_envvar(key, &value) +} + +pub async fn get_secret_key() -> crate::env::EnvVar { + dotenvy::dotenv().ok(); + let key = crate::env::keys::SECRET_KEY; + let value = std::env::var(key).expect(key); + + crate::env::init_envvar(key, &value) +} + +pub async fn get_root_directory() -> crate::env::EnvVar { + dotenvy::dotenv().ok(); + let key = crate::env::keys::ROOT_DIRECTORY; + let value = std::env::var(key).expect(key); + + crate::env::init_envvar(key, &value) +} + +pub async fn get_app_base_api_url() -> crate::env::EnvVar { + dotenvy::dotenv().ok(); + let key = crate::env::keys::TEXTSENDER_BASE_API_URL; + let value = std::env::var(key).expect(key); + + crate::env::init_envvar(key, &value) +} + +pub async fn get_app_auth_base_api_url() -> crate::env::EnvVar { + dotenvy::dotenv().ok(); + let key = crate::env::keys::TEXTSENDER_AUTH_BASE_API_URL; + let value = std::env::var(key).expect(key); + + crate::env::init_envvar(key, &value) +} + +pub async fn get_app_env() -> crate::env::EnvVar { + dotenvy::dotenv().ok(); + let key = crate::env::keys::APP_ENV; + let value = std::env::var(key).expect(key); + + crate::env::init_envvar(key, &value) +} + +pub async fn get_backend_port() -> crate::env::EnvVar { + dotenvy::dotenv().ok(); + let key = crate::env::keys::BACKEND_PORT; + let value = std::env::var(key).expect(key); + crate::env::init_envvar(key, &value) +} + +pub async fn get_frontend_url() -> crate::env::EnvVar { + dotenvy::dotenv().ok(); + let key = crate::env::keys::FRONTEND_URL; + let value = std::env::var(key).expect(key); + + crate::env::init_envvar(key, &value) +} + +pub async fn get_rust_log() -> crate::env::EnvVar { + dotenvy::dotenv().ok(); + let key = crate::env::keys::RUST_LOG; + let value = std::env::var(key).expect(key); + + crate::env::init_envvar(key, &value) +} + +pub async fn get_allowed_origins() -> crate::env::EnvVar { + dotenvy::dotenv().ok(); + let key = crate::env::keys::ALLOWED_ORIGINS; + let value = std::env::var(key).expect(key); + + let mut envvar = crate::env::init_envvar(key, &value); + crate::env::init_delimiter(&mut envvar, ','); + + envvar +} + +/// Get environment not specified in the code +pub async fn get_env(environment: &str) -> crate::env::EnvVar { + dotenvy::dotenv().ok(); + let my_error = format!("{environment} {}", crate::env::keys::error::GENERAL_ERROR); + let value = std::env::var(environment).expect(&my_error); + + crate::env::init_envvar(environment, &value) +} diff --git a/src/env/keys.rs b/src/env/keys.rs new file mode 100644 index 0000000..9b187bd --- /dev/null +++ b/src/env/keys.rs @@ -0,0 +1,52 @@ +/// Environment key for Database management +pub const DB_URL: &str = "DATABASE_URL"; + +/// Environment key for secret main key +/// Used for the textsender app +pub const SECRET_MAIN_KEY: &str = "SECRET_MAIN_KEY"; + +/// Environment key for service logins +pub const SERVICE_PASSPHRASE: &str = "SERVICE_PASSPHRASE"; + +/// Environment key for secret key +/// Generic use of secret key that could be found in various apps +pub const SECRET_KEY: &str = "SECRET_KEY"; + +/// Environment key for root directory for the textsender app +pub const ROOT_DIRECTORY: &str = "ROOT_DIRECTORY"; + +/// Environment key for textsender api url +pub const TEXTSENDER_BASE_API_URL: &str = "TEXTSENDER_BASE_API_URL"; + +/// Environment key for textsender auth api url +pub const TEXTSENDER_AUTH_BASE_API_URL: &str = "TEXTSENDER_AUTH_BASE_API_URL"; + +/// Environment key for App status +pub const APP_ENV: &str = "APP_ENV"; +/// Environment key for backend port. Used for both auth and core functionality +pub const BACKEND_PORT: &str = "BACKEND_PORT"; +/// Environment key for frontend url +pub const FRONTEND_URL: &str = "FRONTEND_URL"; +/// Environment key for application logging +pub const RUST_LOG: &str = "RUST_LOG"; +/// Environment key for allowed origins for CORS support +pub const ALLOWED_ORIGINS: &str = "ALLOWED_ORIGINS"; + +pub mod error { + use const_format::concatcp; + + pub const GENERAL_ERROR: &str = "must not be set in enviornment file"; + pub const DB_URL: &str = concatcp!(super::DB_URL, " ", GENERAL_ERROR); + pub const SECRET_MAIN_KEY: &str = concatcp!(super::SECRET_MAIN_KEY, " ", GENERAL_ERROR); + pub const SERVICE_LOGIN: &str = concatcp!(super::SERVICE_PASSPHRASE, " ", GENERAL_ERROR); + pub const SECRET_KEY: &str = concatcp!(super::SECRET_KEY, " ", GENERAL_ERROR); + pub const ROOT_DIRECTORY: &str = concatcp!(super::ROOT_DIRECTORY, " ", GENERAL_ERROR); + pub const TEXTSENDER_BASE_API_URL: &str = concatcp!(super::TEXTSENDER_BASE_API_URL, " ", GENERAL_ERROR); + pub const TEXTSENDER_AUTH_BASE_API_URL: &str = + concatcp!(super::TEXTSENDER_AUTH_BASE_API_URL, " ", GENERAL_ERROR); + pub const APP_ENV: &str = concatcp!(super::APP_ENV, " ", GENERAL_ERROR); + pub const BACKEND_PORT: &str = concatcp!(super::BACKEND_PORT, " ", GENERAL_ERROR); + pub const FRONTEND_URL: &str = concatcp!(super::FRONTEND_URL, " ", GENERAL_ERROR); + pub const RUST_LOG: &str = concatcp!(super::RUST_LOG, " ", GENERAL_ERROR); + pub const ALLOWED_ORIGINS: &str = concatcp!(super::ALLOWED_ORIGINS, " ", GENERAL_ERROR); +} diff --git a/src/env/mod.rs b/src/env/mod.rs new file mode 100644 index 0000000..20cc9b7 --- /dev/null +++ b/src/env/mod.rs @@ -0,0 +1,40 @@ +pub mod environment; +pub mod keys; +pub mod utility; + +#[derive(Debug, Default, Clone)] +pub struct EnvVar { + pub key: String, + pub value: String, + pub has_delimiter: bool, + pub delimiter: char, +} + +pub fn init_envvar(key: &str, value: &str) -> EnvVar { + EnvVar { + key: key.to_string(), + value: value.to_string(), + has_delimiter: false, + ..Default::default() + } +} + +pub fn init_delimiter(envvar: &mut EnvVar, delimiter: char) { + let mut amount_of_delimiters_found: i32 = 0; + + for v in envvar.value.chars() { + if v == delimiter { + amount_of_delimiters_found += 1; + } + } + + let has_delimiter = amount_of_delimiters_found >= 1; + + if has_delimiter { + envvar.has_delimiter = has_delimiter; + envvar.delimiter = delimiter; + } else { + envvar.has_delimiter = has_delimiter; + } +} + diff --git a/src/env/utility.rs b/src/env/utility.rs new file mode 100644 index 0000000..6abea3a --- /dev/null +++ b/src/env/utility.rs @@ -0,0 +1,15 @@ +/// Take the Environment variable and delimitize it. If the value has a delimiter, +/// extract it into some strings +pub fn delimitize(var: &crate::env::EnvVar) -> Result, std::io::Error> { + if var.has_delimiter { + Ok(var + .value + .split(var.delimiter) + .map(|c| c.parse::().unwrap()) + .collect()) + } else { + Err(std::io::Error::other( + "Environment variable does not have a delimiter", + )) + } +} diff --git a/src/main.rs b/src/main.rs index 96a37e1..b09d0f4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,4 @@ +pub mod env; #[tokio::main]