use getset::Getters;
use serde_derive::{Deserialize, Serialize};
use std::env;
use tomlenv::Environment;
const ENV: &str = "env";
#[derive(Clone, Debug, Default, Deserialize, Getters, Hash, Eq, PartialEq, Serialize)]
pub struct Runtime {
#[get = "pub"]
ip: Option<String>,
#[get = "pub"]
port: Option<u32>,
#[get = "pub"]
path: Option<String>,
}
impl Runtime {
pub fn env() -> String {
env::var(ENV).unwrap_or_else(|_| {
let env_str = Environment::Local.to_string();
env::set_var(ENV, &env_str);
env_str
})
}
}
#[cfg(test)]
mod test {
use super::{Runtime, ENV};
use std::env;
use tomlenv::Environment;
fn validate_env(currenv: &str) {
env::set_var(ENV, ¤v);
assert_eq!(Runtime::env(), currenv);
assert!(env::var(ENV).is_ok());
env::remove_var(ENV);
}
#[test]
fn local_env_when_not_set() {
let local_env = Environment::Local.to_string();
env::remove_var(ENV);
assert_eq!(&Runtime::env(), &local_env);
assert!(env::var(ENV).is_ok());
env::remove_var(ENV);
validate_env(&local_env);
validate_env(&Environment::Dev.to_string());
validate_env(&Environment::Test.to_string());
validate_env(&Environment::Stage.to_string());
validate_env(&Environment::Prod.to_string());
}
}