use std::path::PathBuf;
use crate::selector::{ProjectMismatch, Target, resolve_target};
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum StatusPlan {
Everything {
config: PathBuf,
},
Project {
config: PathBuf,
project: String,
},
Service {
config: PathBuf,
service: String,
project: Option<String>,
},
}
impl StatusPlan {
pub fn config(&self) -> &PathBuf {
match self {
StatusPlan::Everything { config }
| StatusPlan::Project { config, .. }
| StatusPlan::Service { config, .. } => config,
}
}
}
pub fn resolve_plan(
config: PathBuf,
service: Option<&str>,
project: Option<&str>,
) -> Result<StatusPlan, ProjectMismatch> {
Ok(match resolve_target(service, project)? {
Target::Everything => StatusPlan::Everything { config },
Target::Project { project } => StatusPlan::Project { config, project },
Target::Service { service, project } => StatusPlan::Service {
config,
service,
project,
},
})
}
#[cfg(test)]
mod tests {
use super::*;
fn cfg() -> PathBuf {
PathBuf::from("/x/systemg.yaml")
}
#[test]
fn no_selectors_reports_everything() {
assert_eq!(
resolve_plan(cfg(), None, None).unwrap(),
StatusPlan::Everything { config: cfg() }
);
}
#[test]
fn project_flag_reports_one_project() {
assert_eq!(
resolve_plan(cfg(), None, Some("alpha")).unwrap(),
StatusPlan::Project {
config: cfg(),
project: "alpha".into()
}
);
}
#[test]
fn bare_service_matches_across_projects() {
assert_eq!(
resolve_plan(cfg(), Some("worker"), None).unwrap(),
StatusPlan::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).unwrap(),
StatusPlan::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")).unwrap_err();
assert_eq!(err.flag, "alpha");
assert_eq!(err.selector, "beta");
}
}