use crate::selector::{ProjectMismatch, Target, resolve_target};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct InspectPlan {
pub service: String,
pub project: Option<String>,
pub live: bool,
}
#[derive(Debug, PartialEq, Eq)]
pub enum InspectPlanError {
NotAService,
Mismatch(ProjectMismatch),
}
pub fn resolve_plan(
service: &str,
project: Option<&str>,
live: bool,
) -> Result<InspectPlan, InspectPlanError> {
match resolve_target(Some(service), project).map_err(InspectPlanError::Mismatch)? {
Target::Service { service, project } => Ok(InspectPlan {
service,
project,
live,
}),
Target::Everything | Target::Project { .. } => Err(InspectPlanError::NotAService),
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn a_service_resolves() {
assert_eq!(
resolve_plan("web", None, false).unwrap(),
InspectPlan {
service: "web".into(),
project: None,
live: false
}
);
}
#[test]
fn project_qualified_service_resolves() {
assert_eq!(
resolve_plan("web", Some("demo"), true).unwrap(),
InspectPlan {
service: "web".into(),
project: Some("demo".into()),
live: true
}
);
}
#[test]
fn prefixed_selector_carries_its_project() {
assert_eq!(
resolve_plan("demo/web", None, false).unwrap(),
InspectPlan {
service: "web".into(),
project: Some("demo".into()),
live: false
}
);
}
#[test]
fn p_flag_conflicting_with_prefix_is_a_mismatch() {
assert!(matches!(
resolve_plan("other/web", Some("demo"), false),
Err(InspectPlanError::Mismatch(_))
));
}
}