use clap::Args;
use miette::miette;
use svugy_model::model::{Model, ShownWorkflow};
use svugy_model::workflow::{Workflow, WorkflowId};
use crate::failure::Failure;
pub const WORKFLOW_CHOICE_GROUP: &str = "workflow_choice";
#[derive(Args)]
#[group(id = WORKFLOW_CHOICE_GROUP, multiple = false)]
pub struct WorkflowChoice {
#[arg(long, value_name = "ID")]
workflow: Option<WorkflowId>,
#[arg(long, requires = "output")]
all_workflows: bool,
}
pub enum ShownWorkflows<'m> {
One(ShownWorkflow<'m>),
Each(Vec<ShownWorkflow<'m>>),
}
impl WorkflowChoice {
pub fn shown_workflows<'m>(&self, model: &'m Model) -> Result<ShownWorkflows<'m>, Failure> {
let is_each_workflow_requested = self.all_workflows;
if is_each_workflow_requested {
let each_workflow = model.showing_each_workflow().collect();
let shown_each_workflow = ShownWorkflows::Each(each_workflow);
return Ok(shown_each_workflow);
}
let Some(workflow_id) = &self.workflow else {
let first_workflow = model.showing_first_workflow();
let shown_first_workflow = ShownWorkflows::One(first_workflow);
return Ok(shown_first_workflow);
};
let named_workflow = model.showing(workflow_id).ok_or_else(|| {
let workflow_ids: Vec<&str> = model
.workflows()
.iter()
.map(Workflow::id)
.map(WorkflowId::as_str)
.collect();
let known_ids = workflow_ids.join(", ");
let unknown_id = workflow_id.as_str();
let report = miette!(
help = format!("the input's workflows are: {known_ids}"),
"--workflow {unknown_id} names no workflow of the input"
);
Failure::Usage(report)
})?;
let shown_named_workflow = ShownWorkflows::One(named_workflow);
Ok(shown_named_workflow)
}
}