use isoloom_plan::{Environment, MachineShape};
use isoloom_spec::model::MachineFile;
use isoloom_spec::shell::quote;
#[must_use]
pub fn variable(machine: &str, n: usize) -> String {
format!("ISOLOOM_FILE_{}_{n}", machine.to_ascii_uppercase().replace('-', "_"))
}
#[must_use]
pub fn copied_from_project(f: &MachineFile) -> bool {
f.source.is_some() && f.sets_owner_or_mode()
}
#[must_use]
pub fn project_variables(env: &Environment) -> Vec<(String, String)> {
env.machines
.iter()
.filter(|(_, mp)| mp.shape == MachineShape::Container)
.flat_map(|(machine, mp)| {
mp.files
.iter()
.enumerate()
.filter(|(_, f)| copied_from_project(f))
.filter_map(move |(n, f)| Some((variable(machine, n), f.source.clone()?)))
})
.collect()
}
#[must_use]
pub fn host_environment(env: &Environment) -> String {
project_variables(env)
.into_iter()
.map(|(var, path)| format!("{var}=\"$(cat {}; printf x)\" && {var}=\"${{{var}%x}}\" && export {var} && ", quote(&path)))
.collect::<Vec<_>>()
.concat()
}