use indexmap::IndexMap;
use isoloom_plan::{Environment, MachinePlan, MachineShape};
use crate::file::{ComposeFile, Secret, ServiceSecret};
pub(super) fn of_machine(mp: &MachinePlan) -> Vec<ServiceSecret> {
mp.secrets
.iter()
.map(|s| ServiceSecret {
source: s.name.clone(),
target: s.path.clone(),
uid: s.uid.map(|u| u.to_string()),
gid: s.gid.map(|g| g.to_string()),
mode: s.mode.map(|m| format!("{m:04o}")),
})
.collect()
}
pub(super) fn of_file(env: &Environment) -> IndexMap<String, Secret> {
let containers: Vec<&MachinePlan> = env.machines.values().filter(|m| m.shape == MachineShape::Container).collect();
env.spec()
.secrets
.keys()
.filter(|name| containers.iter().any(|m| m.secrets.iter().any(|s| &s.name == *name)))
.map(|name| {
let environment = isoloom_render::secrets::compose_variable(env.spec(), name);
(name.clone(), Secret { environment })
})
.collect()
}
pub(super) fn usage(file: &ComposeFile) -> String {
if file.secrets.is_empty() {
return String::new();
}
let vars: Vec<&str> = file.secrets.values().map(|s| s.environment.as_str()).collect();
let inputs = file.secrets.values().any(|s| !s.environment.starts_with("ISOLOOM_SECRET_"));
if inputs {
format!(
"# Secrets and inputs, delivered as files: set {} for `up` (each value, never in the file).\n",
vars.join(", ")
)
} else {
format!(
"# Secrets: `isoloom run docker` reads them from their stores; by hand, set {} for `up`.\n",
vars.join(", ")
)
}
}