use isoloom_plan::{Environment, MachinePlan, MachineShape};
use isoloom_spec::model;
#[derive(Debug, Clone, Copy)]
pub(crate) struct Machine<'a> {
pub(crate) name: &'a str,
pub(crate) spec: &'a model::Machine,
pub(crate) plan: &'a MachinePlan,
}
impl<'a> Machine<'a> {
pub(crate) fn of(env: &'a Environment, name: &str) -> Option<Machine<'a>> {
let (name, plan) = env.machines.get_key_value(name)?;
let spec = env.spec().machines.get(name)?;
Some(Machine { name, spec, plan })
}
pub(crate) fn all(env: &'a Environment) -> impl Iterator<Item = Machine<'a>> {
env.machines.iter().filter_map(|(name, plan)| {
let spec = env.spec().machines.get(name)?;
Some(Machine { name, spec, plan })
})
}
pub(crate) fn containers(env: &'a Environment) -> impl Iterator<Item = Machine<'a>> {
Machine::all(env).filter(|m| m.plan.shape == MachineShape::Container)
}
pub(crate) fn supplied_access(env: &'a Environment) -> impl Iterator<Item = Machine<'a>> {
Machine::all(env).filter(|m| m.spec.access && m.plan.shape != MachineShape::Container)
}
pub(crate) fn is_appliance(&self) -> bool {
self.spec.docker.as_ref().is_some_and(|d| d.appliance.is_some())
}
}