94
crates/cuddle-clusters/src/catalog/cluster_vars.rs
Normal file
94
crates/cuddle-clusters/src/catalog/cluster_vars.rs
Normal file
@@ -0,0 +1,94 @@
|
||||
use std::collections::HashMap;
|
||||
|
||||
use crate::Component;
|
||||
|
||||
#[derive(PartialEq, Eq, Debug, Clone)]
|
||||
pub enum ClusterVariable {
|
||||
String(String),
|
||||
}
|
||||
|
||||
#[derive(PartialEq, Eq, Debug, Clone, Default)]
|
||||
pub struct ClusterEnv {
|
||||
vars: HashMap<String, ClusterVariable>,
|
||||
}
|
||||
|
||||
#[derive(PartialEq, Eq, Debug, Clone, Default)]
|
||||
pub struct ClusterVariables {
|
||||
env: ClusterEnv,
|
||||
name: String,
|
||||
namespace: String,
|
||||
}
|
||||
|
||||
#[derive(Default)]
|
||||
pub struct ClusterVars {}
|
||||
|
||||
impl Component for ClusterVars {
|
||||
fn name(&self) -> String {
|
||||
"cluster/vars".into()
|
||||
}
|
||||
|
||||
fn validate(&self, _value: &serde_yaml::Value) -> anyhow::Result<()> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn render_value(
|
||||
&self,
|
||||
environment: &str,
|
||||
value: &serde_yaml::Value,
|
||||
) -> Option<anyhow::Result<minijinja::Value>> {
|
||||
let mut vars = ClusterVariables::default();
|
||||
|
||||
// TODO: actually extract values
|
||||
|
||||
if let Some(mapping) = value.as_mapping() {
|
||||
if let Some(env) = mapping.get("env") {
|
||||
if let Some(env_entries) = env.as_mapping() {
|
||||
for (name, value) in env_entries {
|
||||
if let (Some(name), Some(value)) = (name.as_str(), value.as_str()) {
|
||||
vars.env
|
||||
.vars
|
||||
.insert(name.to_string(), ClusterVariable::String(value.into()));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
vars.name = environment.into();
|
||||
vars.namespace = environment.into();
|
||||
|
||||
Some(Ok(minijinja::Value::from_object(vars)))
|
||||
}
|
||||
}
|
||||
|
||||
impl minijinja::value::Object for ClusterVariables {
|
||||
fn get_value(self: &std::sync::Arc<Self>, key: &minijinja::Value) -> Option<minijinja::Value> {
|
||||
let out = match key.as_str()? {
|
||||
"env" => minijinja::Value::from_object(self.env.clone()),
|
||||
"name" => minijinja::Value::from_safe_string(self.name.clone()),
|
||||
"namespace" => minijinja::Value::from_safe_string(self.namespace.clone()),
|
||||
_ => return None,
|
||||
};
|
||||
|
||||
Some(out)
|
||||
}
|
||||
}
|
||||
|
||||
impl minijinja::value::Object for ClusterEnv {
|
||||
fn get_value(self: &std::sync::Arc<Self>, key: &minijinja::Value) -> Option<minijinja::Value> {
|
||||
let var = self.vars.get(key.as_str()?)?;
|
||||
|
||||
match var {
|
||||
ClusterVariable::String(s) => Some(minijinja::Value::from_safe_string(s.clone())),
|
||||
}
|
||||
}
|
||||
|
||||
fn enumerate(self: &std::sync::Arc<Self>) -> minijinja::value::Enumerator {
|
||||
minijinja::value::Enumerator::Values(
|
||||
self.vars
|
||||
.keys()
|
||||
.map(|key| minijinja::Value::from_safe_string(key.clone()))
|
||||
.collect::<Vec<_>>(),
|
||||
)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user