use std::path::PathBuf;
use crate::env;
#[derive(Debug, Clone, PartialEq)]
pub struct HydroSettings {
pub root_path: Option<PathBuf>,
pub settings_file: Option<PathBuf>,
pub secrets_file: Option<PathBuf>,
pub env: String,
pub envvar_prefix: String,
pub encoding: String,
pub envvar_nested_sep: String,
}
impl Default for HydroSettings {
fn default() -> Self {
let hydro_suffix = "_FOR_HYDRO";
Self {
root_path: env::get_var("ROOT_PATH", hydro_suffix),
settings_file: env::get_var("SETTINGS_FILE", hydro_suffix),
secrets_file: env::get_var("SECRETS_FILE", hydro_suffix),
env: env::get_var_default(
"ENV",
hydro_suffix,
"development".into(),
),
envvar_prefix: env::get_var_default(
"ENVVAR_PREFIX",
hydro_suffix,
"HYDRO".into(),
),
encoding: env::get_var_default(
"ENCODING",
hydro_suffix,
"utf-8".into(),
),
envvar_nested_sep: env::get_var_default(
"ENVVAR_NESTED_SEP",
hydro_suffix,
"__".into(),
),
}
}
}
impl HydroSettings {
pub fn set_root_path(mut self, p: PathBuf) -> Self {
self.root_path = Some(p);
self
}
pub fn set_settings_file(mut self, p: PathBuf) -> Self {
self.settings_file = Some(p);
self
}
pub fn set_secrets_file(mut self, p: PathBuf) -> Self {
self.secrets_file = Some(p);
self
}
pub fn set_env(mut self, e: String) -> Self {
self.env = e;
self
}
pub fn set_envvar_prefix(mut self, p: String) -> Self {
self.envvar_prefix = p;
self
}
pub fn set_encoding(mut self, e: String) -> Self {
self.encoding = e;
self
}
pub fn set_envvar_nested_sep(mut self, s: String) -> Self {
self.envvar_nested_sep = s;
self
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::env::{remove_var, set_var};
#[test]
fn test_default() {
assert_eq!(
HydroSettings::default(),
HydroSettings {
root_path: None,
settings_file: None,
secrets_file: None,
env: "development".into(),
envvar_prefix: "HYDRO".into(),
encoding: "utf-8".into(),
envvar_nested_sep: "__".into(),
},
);
}
#[test]
fn test_default_with_env() {
set_var("ENCODING_FOR_HYDRO", "latin-1");
set_var("ROOT_PATH_FOR_HYDRO", "/an/absolute/path");
assert_eq!(
HydroSettings::default(),
HydroSettings {
root_path: Some("/an/absolute/path".into()),
settings_file: None,
secrets_file: None,
env: "development".into(),
envvar_prefix: "HYDRO".into(),
encoding: "latin-1".into(),
envvar_nested_sep: "__".into(),
},
);
remove_var("ENCODING_FOR_HYDRO");
remove_var("ROOT_PATH_FOR_HYDRO");
}
#[test]
fn test_one_builder_method() {
assert_eq!(
HydroSettings::default()
.set_root_path(PathBuf::from("~/test/dir")),
HydroSettings {
root_path: Some(PathBuf::from("~/test/dir")),
settings_file: None,
secrets_file: None,
env: "development".into(),
envvar_prefix: "HYDRO".into(),
encoding: "utf-8".into(),
envvar_nested_sep: "__".into(),
},
);
}
#[test]
fn test_all_builder_methods() {
assert_eq!(
HydroSettings::default()
.set_envvar_prefix("HY_".into())
.set_encoding("latin-1".into())
.set_secrets_file(PathBuf::from(".secrets.toml"))
.set_env("production".into())
.set_envvar_nested_sep("-".into())
.set_root_path(PathBuf::from("~/test/dir"))
.set_settings_file(PathBuf::from("settings.toml")),
HydroSettings {
root_path: Some(PathBuf::from("~/test/dir")),
settings_file: Some(PathBuf::from("settings.toml")),
secrets_file: Some(PathBuf::from(".secrets.toml")),
env: "production".into(),
envvar_prefix: "HY_".into(),
encoding: "latin-1".into(),
envvar_nested_sep: "-".into(),
},
);
}
}