use std::path::PathBuf;
pub use crate::selector::{ProjectMismatch, split_selector};
use crate::selector::{Target, resolve_target};
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum StartPlan {
WholeConfig {
config: PathBuf,
},
Project {
config: PathBuf,
project: String,
},
Service {
config: PathBuf,
service: String,
project: Option<String>,
},
StageAdHoc {
config: PathBuf,
},
}
pub fn resolve_plan(
config: PathBuf,
service: Option<&str>,
project: Option<&str>,
ad_hoc: bool,
) -> Result<StartPlan, ProjectMismatch> {
if ad_hoc {
return Ok(StartPlan::StageAdHoc { config });
}
Ok(match resolve_target(service, project)? {
Target::Everything => StartPlan::WholeConfig { config },
Target::Project { project } => StartPlan::Project { config, project },
Target::Service { service, project } => StartPlan::Service {
config,
service,
project,
},
})
}
#[cfg(test)]
mod tests {
use super::*;
fn cfg() -> PathBuf {
PathBuf::from("/x/systemg.yaml")
}
#[test]
fn no_selectors_targets_the_whole_config() {
assert_eq!(
resolve_plan(cfg(), None, None, false).unwrap(),
StartPlan::WholeConfig { config: cfg() }
);
}
#[test]
fn project_flag_targets_one_project() {
assert_eq!(
resolve_plan(cfg(), None, Some("alpha"), false).unwrap(),
StartPlan::Project {
config: cfg(),
project: "alpha".into()
}
);
}
#[test]
fn bare_service_leaves_project_for_resident_resolution() {
assert_eq!(
resolve_plan(cfg(), Some("worker"), None, false).unwrap(),
StartPlan::Service {
config: cfg(),
service: "worker".into(),
project: None
}
);
}
#[test]
fn qualified_selector_splits_project_and_service() {
assert_eq!(
resolve_plan(cfg(), Some("alpha/worker"), None, false).unwrap(),
StartPlan::Service {
config: cfg(),
service: "worker".into(),
project: Some("alpha".into())
}
);
}
#[test]
fn project_flag_and_matching_selector_agree() {
assert_eq!(
resolve_plan(cfg(), Some("alpha/worker"), Some("alpha"), false).unwrap(),
StartPlan::Service {
config: cfg(),
service: "worker".into(),
project: Some("alpha".into())
}
);
}
#[test]
fn project_flag_conflicting_with_selector_is_a_mismatch() {
let err =
resolve_plan(cfg(), Some("beta/worker"), Some("alpha"), false).unwrap_err();
assert_eq!(err.flag, "alpha");
assert_eq!(err.selector, "beta");
}
#[test]
fn ad_hoc_stages_regardless_of_selectors() {
assert_eq!(
resolve_plan(cfg(), None, None, true).unwrap(),
StartPlan::StageAdHoc { config: cfg() }
);
}
}