feat: add actual example

Signed-off-by: kjuulh <contact@kjuulh.io>
This commit is contained in:
2024-05-21 22:58:08 +02:00
parent 461f8acb73
commit f27d538b38
9 changed files with 216 additions and 24 deletions

View 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<_>>(),
)
}
}