use regex::Regex;
use std::collections::HashMap;
use std::sync::LazyLock;
use tera::Value;
#[derive(Clone)]
pub struct TemplateVars {
pub(super) vars: HashMap<String, String>,
pub(super) env: HashMap<String, String>,
pub(super) config_env: HashMap<String, String>,
pub(super) custom_vars: HashMap<String, String>,
pub(super) outputs: HashMap<String, String>,
pub(super) structured: HashMap<String, Value>,
}
impl TemplateVars {
pub fn new() -> Self {
Self {
vars: HashMap::new(),
env: HashMap::new(),
config_env: HashMap::new(),
custom_vars: HashMap::new(),
outputs: HashMap::new(),
structured: HashMap::new(),
}
}
pub fn set(&mut self, key: &str, value: &str) {
self.vars.insert(key.to_string(), value.to_string());
}
pub fn unset(&mut self, key: &str) -> bool {
self.vars.remove(key).is_some()
}
pub fn unset_structured(&mut self, key: &str) -> bool {
self.structured.remove(key).is_some()
}
pub fn get(&self, key: &str) -> Option<&String> {
self.vars.get(key)
}
pub fn set_env(&mut self, key: &str, value: &str) {
self.env.insert(key.to_string(), value.to_string());
}
pub fn set_config_env(&mut self, key: &str, value: &str) {
self.env.insert(key.to_string(), value.to_string());
self.config_env.insert(key.to_string(), value.to_string());
}
pub fn set_custom_var(&mut self, key: &str, value: &str) {
self.custom_vars.insert(key.to_string(), value.to_string());
}
pub fn set_output(&mut self, key: &str, value: &str) {
self.outputs.insert(key.to_string(), value.to_string());
}
pub fn get_output(&self, key: &str) -> Option<&String> {
self.outputs.get(key)
}
pub fn set_structured(&mut self, key: &str, value: Value) {
self.structured.insert(key.to_string(), value);
}
pub fn all(&self) -> &HashMap<String, String> {
&self.vars
}
pub fn all_env(&self) -> &HashMap<String, String> {
&self.env
}
pub fn all_config_env(&self) -> &HashMap<String, String> {
&self.config_env
}
pub fn get_structured(&self, key: &str) -> Option<&tera::Value> {
self.structured.get(key)
}
pub fn all_structured(&self) -> &HashMap<String, Value> {
&self.structured
}
}
impl Default for TemplateVars {
fn default() -> Self {
Self::new()
}
}
pub fn clear_per_target_vars(tv: &mut TemplateVars) {
for key in PER_TARGET_VARS {
tv.set(key, "");
}
}
pub const PER_TARGET_VARS: &[&str] = &[
"Os", "Arch", "Target", "Arm", "Arm64", "Amd64", "Mips", "I386", "Ppc64", "Riscv64",
];
pub const PER_ARTIFACT_VARS: &[&str] = &["ArtifactName", "ArtifactExt", "ArtifactID"];
pub fn clear_per_artifact_vars(tv: &mut TemplateVars) {
clear_per_target_vars(tv);
for key in PER_ARTIFACT_VARS {
tv.set(key, "");
}
}
pub(super) const NUMERIC_FIELDS: &[&str] =
&["Major", "Minor", "Patch", "Timestamp", "CommitTimestamp"];
pub(super) static ENV_REF_RE: LazyLock<Regex> =
LazyLock::new(|| crate::util::static_regex(r"Env\.([A-Za-z_][A-Za-z0-9_]*)"));