use serde_json::value::Value;
use std::collections::HashMap;
use tera::*;
use uuid::Uuid;
use crate::updater::tera_helpers::filters::string::get_shared_environment_variables;
pub fn uuid_v4(args: &HashMap<String, Value>) -> Result<Value> {
let uuid = Uuid::new_v4();
let format = match args.get("format") {
Some(val) => try_get_value!("uuid_v4", "format", String, val),
None => String::default(),
};
let uuid_string = match format.as_str() {
"hyphenated" => uuid.hyphenated().to_string(),
"urn" => uuid.urn().to_string(),
_ => uuid.simple().to_string(),
};
Ok(Value::String(uuid_string))
}
pub fn env(args: &HashMap<String, Value>) -> Result<Value> {
let shared_env = get_shared_environment_variables().clone();
let name: String = args
.get("name")
.ok_or_else(|| Error::msg("Function `env` didn't receive a `name` argument"))
.and_then(|val| Ok(try_get_value!("env", "name", String, val)))?;
let prefixed_key = format!("{}_{}", crate::PROJECT_NAME.to_uppercase(), name);
{
let env = shared_env.read().unwrap();
if let Some(value) = env.get(&prefixed_key) {
return Ok(Value::String(value.clone()));
}
if let Some(value) = env.get(&name) {
return Ok(Value::String(value.clone()));
}
}
let value = std::env::var(&prefixed_key)
.or_else(|_| std::env::var(&name))
.map(|var| {
let mut env = shared_env.write().unwrap();
env.insert(prefixed_key.clone(), var.clone());
Value::String(var)
})
.or_else(|_| {
args.get("default")
.cloned()
.ok_or_else(|| Error::msg(format!("Environment variable `{}` not found", name)))
})?;
Ok(value)
}
#[cfg(test)]
mod tests {
use serde_json::json;
use crate::updater::tera_helpers::filters::string::set_env;
use super::*;
fn args(pairs: &[(&str, serde_json::Value)]) -> HashMap<String, serde_json::Value> {
pairs
.iter()
.map(|(k, v)| (k.to_string(), v.clone()))
.collect()
}
#[test]
fn test_uuid_v4() {
let result = uuid_v4(&HashMap::new()).unwrap();
let uuid = Uuid::parse_str(&result.as_str().unwrap()).unwrap();
assert_eq!(uuid.get_variant(), uuid::Variant::RFC4122);
assert_eq!(uuid.get_version(), Some(uuid::Version::Random));
let arguments = args(&[("format", json!("hyphenated"))]);
let result = uuid_v4(&arguments).unwrap();
let uuid = Uuid::parse_str(&result.as_str().unwrap()).unwrap();
assert_eq!(uuid.get_variant(), uuid::Variant::RFC4122);
assert_eq!(uuid.get_version(), Some(uuid::Version::Random));
let arguments = args(&[("format", json!("urn"))]);
let result = uuid_v4(&arguments).unwrap();
let uuid = Uuid::parse_str(&result.as_str().unwrap()).unwrap();
assert_eq!(uuid.get_variant(), uuid::Variant::RFC4122);
assert_eq!(uuid.get_version(), Some(uuid::Version::Random));
let first_result = uuid_v4(&HashMap::new());
let second_result = uuid_v4(&HashMap::new());
assert!(first_result.is_ok());
assert!(second_result.is_ok());
let first_value = first_result.unwrap();
let second_value = second_result.unwrap();
assert_ne!(first_value, second_value);
}
#[test]
fn test_env() {
let value = json!("TestValue");
let arguments = args(&[("name", json!("MY_ENV_VAR2"))]);
set_env(&value, &arguments).unwrap();
let result = env(&arguments).unwrap();
assert_eq!(result, Value::String("TestValue".to_string()));
let arguments = args(&[
("name", json!("NON_EXISTING_ENV_VAR")),
("default", json!("DefaultValue")),
]);
let result = env(&arguments).unwrap();
assert_eq!(result, json!("DefaultValue"));
let arguments = args(&[("name", json!("NON_EXISTING_ENV_VAR"))]);
let result = env(&arguments);
assert!(result.is_err());
assert_eq!(
result.err().unwrap().to_string(),
"Environment variable `NON_EXISTING_ENV_VAR` not found"
);
}
}