use clap::{Parser, ValueEnum};
use std::path::PathBuf;
use crate::{RootArgs, parse_kind_filter};
use super::worklist_item_kind::parse_work_item_kind_filter;
use super::worklist_types::WorklistFilters;
#[derive(Debug, Clone, Parser)]
pub(crate) struct WorklistArgs {
#[command(flatten)]
pub(super) root: RootArgs,
#[arg(long)]
pub(super) config: Option<PathBuf>,
#[arg(long, value_parser = parse_worklist_kind_filter)]
pub(super) kind: Option<String>,
#[arg(long)]
pub(super) family: Option<String>,
#[arg(long, value_parser = parse_work_item_kind_filter)]
pub(super) item_kind: Option<String>,
#[arg(
long,
value_parser = [
"matched",
"new",
"stale",
"expired",
"review_due",
"ambiguous",
"invalid_selector",
"missing_required_field",
"evidence_missing",
"baseline_debt"
]
)]
pub(super) status: Option<String>,
#[arg(long)]
pub(super) allow_id: Option<String>,
#[arg(long)]
pub(super) path: Option<String>,
#[arg(long)]
pub(super) source_package: Option<String>,
#[arg(long)]
pub(super) owner: Option<String>,
#[arg(long)]
pub(super) classification: Option<String>,
#[arg(long)]
pub(super) baseline_debt: bool,
#[arg(long)]
pub(super) broad_scope: bool,
#[arg(long, value_parser = ["low", "medium", "high"])]
pub(super) risk: Option<String>,
#[arg(long, value_parser = ["small", "medium"])]
pub(super) difficulty: Option<String>,
#[arg(long)]
pub(super) missing_evidence: bool,
#[arg(long)]
pub(super) include_untracked: bool,
#[arg(long, value_enum, default_value_t = WorklistFormat::Json)]
pub(super) format: WorklistFormat,
#[arg(long)]
pub(super) output: Option<PathBuf>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum)]
pub(super) enum WorklistFormat {
Human,
Json,
}
fn parse_worklist_kind_filter(value: &str) -> Result<String, String> {
parse_kind_filter(value)
.map(|_| value.to_string())
.map_err(|_| format!("unknown worklist kind `{value}`"))
}
pub(super) fn worklist_filters(args: &WorklistArgs) -> WorklistFilters<'_> {
WorklistFilters {
kind: args.kind.as_deref(),
family: args.family.as_deref(),
item_kind: args.item_kind.as_deref(),
status: args.status.as_deref(),
allow_id: args.allow_id.as_deref(),
path: args.path.as_deref(),
source_package: args.source_package.as_deref(),
owner: args.owner.as_deref(),
classification: args.classification.as_deref(),
baseline_debt: args.baseline_debt,
broad_scope: args.broad_scope,
risk: args.risk.as_deref(),
difficulty: args.difficulty.as_deref(),
missing_evidence: args.missing_evidence,
}
}