use std::path::PathBuf;
use clap::{ArgGroup, Args, ValueEnum};
use serde::Serialize;
use super::{CommentModeArgs, CommentTextArgs, GroupingArgs, PrefixArgs, SummaryArgs};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, ValueEnum)]
pub enum CloseReason {
Completed,
#[value(name = "not-planned")]
NotPlanned,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, ValueEnum)]
pub enum LinkPrStatus {
#[value(name = "planned")]
Planned,
#[value(name = "in-progress")]
InProgress,
#[value(name = "blocked")]
Blocked,
}
#[derive(Debug, Clone, Args, Serialize)]
pub struct StartPlanArgs {
#[arg(long, value_name = "path")]
pub plan: PathBuf,
#[arg(long, value_name = "text")]
pub title: Option<String>,
#[arg(long, value_name = "path")]
pub task_spec_out: Option<PathBuf>,
#[arg(long, value_name = "path")]
pub issue_body_out: Option<PathBuf>,
#[command(flatten)]
pub prefixes: PrefixArgs,
#[command(flatten)]
pub grouping: GroupingArgs,
#[arg(long = "label", value_name = "name", default_values = ["issue", "plan"])]
pub label: Vec<String>,
}
#[derive(Debug, Clone, Args, Serialize)]
#[command(group(
ArgGroup::new("issue_source")
.required(true)
.args(["issue", "body_file"])
))]
#[command(group(
ArgGroup::new("target_scope")
.required(true)
.args(["task", "sprint"])
))]
pub struct LinkPrArgs {
#[arg(long, value_name = "number")]
pub issue: Option<u64>,
#[arg(long, value_name = "path")]
pub body_file: Option<PathBuf>,
#[arg(long, value_name = "task-id")]
pub task: Option<String>,
#[arg(long, value_parser = clap::value_parser!(u16).range(1..), value_name = "number")]
pub sprint: Option<u16>,
#[arg(
long = "pr-group",
value_name = "group",
requires = "sprint",
conflicts_with = "task"
)]
pub pr_group: Option<String>,
#[arg(long, value_name = "pr")]
pub pr: String,
#[arg(long, value_enum, default_value_t = LinkPrStatus::InProgress)]
pub status: LinkPrStatus,
}
#[derive(Debug, Clone, Args, Serialize)]
#[command(group(
ArgGroup::new("issue_source")
.required(true)
.args(["issue", "body_file"])
))]
pub struct StatusPlanArgs {
#[arg(long, value_name = "number")]
pub issue: Option<u64>,
#[arg(long, value_name = "path")]
pub body_file: Option<PathBuf>,
#[command(flatten)]
pub comment_mode: CommentModeArgs,
}
#[derive(Debug, Clone, Args, Serialize)]
#[command(group(
ArgGroup::new("issue_source")
.required(true)
.args(["issue", "body_file"])
))]
pub struct ReadyPlanArgs {
#[arg(long, value_name = "number")]
pub issue: Option<u64>,
#[arg(long, value_name = "path")]
pub body_file: Option<PathBuf>,
#[command(flatten)]
pub summary: SummaryArgs,
#[arg(long)]
pub label_update: bool,
#[arg(long = "label", value_name = "name", requires = "label_update")]
pub label: Option<String>,
#[arg(long = "remove-label", value_name = "name", requires = "label_update")]
pub remove_label: Vec<String>,
#[command(flatten)]
pub comment_mode: CommentModeArgs,
}
#[derive(Debug, Clone, Args, Serialize)]
pub struct ClosePlanArgs {
#[arg(long, value_name = "number")]
pub issue: Option<u64>,
#[arg(long, value_name = "path")]
pub body_file: Option<PathBuf>,
#[arg(long = "approved-comment-url", value_name = "url")]
pub approved_comment_url: String,
#[arg(long, value_enum, default_value_t = CloseReason::Completed)]
pub reason: CloseReason,
#[command(flatten)]
pub close_comment: CommentTextArgs,
#[arg(long)]
pub allow_not_done: bool,
}
#[derive(Debug, Clone, Args, Serialize)]
pub struct CleanupWorktreesArgs {
#[arg(long, value_name = "number")]
pub issue: u64,
}
#[derive(Debug, Clone, Args, Serialize)]
pub struct ResolveApprovalArgs {
#[arg(long, value_name = "number")]
pub pr: u64,
}