use std::collections::BTreeMap;
use crate::syntax::{OsRef, ProjectPath, Step};
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub struct Configuration {
pub os: OsRef,
pub install: Vec<Step>,
pub configure: Vec<Step>,
pub start: Vec<Step>,
pub files: BTreeMap<ProjectPath, String>,
}
impl Configuration {
#[must_use]
pub fn app(os: OsRef, steps: Vec<Step>) -> Configuration {
Configuration {
os,
install: steps,
configure: Vec::new(),
start: Vec::new(),
files: BTreeMap::new(),
}
}
#[must_use]
pub fn entry(os: OsRef, install: Vec<Step>, configure: Vec<Step>, start: Vec<Step>, files: BTreeMap<ProjectPath, String>) -> Configuration {
Configuration {
os,
install,
configure,
start,
files,
}
}
pub fn steps(&self) -> impl Iterator<Item = &Step> {
self.install.iter().chain(&self.configure).chain(&self.start)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn an_apps_steps_all_install_and_read_back_in_order() {
let os: OsRef = "debian@12".parse().unwrap();
let steps: Vec<Step> = serde_yaml_ng::from_str("[{ run: a.sh }, reboot]").unwrap();
let c = Configuration::app(os, steps.clone());
assert_eq!(c.install, steps);
assert!(c.configure.is_empty() && c.start.is_empty() && c.files.is_empty());
assert_eq!(c.steps().map(Step::kind).collect::<Vec<_>>(), ["run", "reboot"]);
}
}