use clap::{Parser, Subcommand};
use super::types::{DependencyTypeArg, IssueStatusArg, IssueTypeArg, SortOrderArg, SortPolicyArg};
use super::validators::{
validate_description, validate_issue_id, validate_label, validate_prefix, validate_title,
};
use crate::domain::{MAX_PRIORITY, MIN_PRIORITY};
#[derive(Parser, Debug, Clone)]
pub struct InitArgs {
#[arg(short, long, value_parser = validate_prefix)]
pub prefix: Option<String>,
#[arg(short, long)]
pub quiet: bool,
}
#[derive(Parser, Debug, Clone)]
pub struct CreateArgs {
#[arg(long, value_parser = validate_title)]
pub title: Option<String>,
#[arg(short = 'D', long, value_parser = validate_description)]
pub description: Option<String>,
#[arg(short, long, value_parser = clap::value_parser!(u8).range(MIN_PRIORITY as i64..=MAX_PRIORITY as i64), default_value = "2")]
pub priority: u8,
#[arg(short = 't', long = "type", value_enum, default_value = "task")]
pub issue_type: IssueTypeArg,
#[arg(short, long)]
pub assignee: Option<String>,
#[arg(short, long, value_delimiter = ',')]
pub labels: Vec<String>,
#[arg(long, value_delimiter = ',')]
pub deps: Vec<String>,
#[arg(long)]
pub design: Option<String>,
#[arg(long)]
pub acceptance: Option<String>,
#[arg(long)]
pub external_ref: Option<String>,
}
#[derive(Parser, Debug, Clone)]
pub struct ListArgs {
#[arg(short, long, value_enum)]
pub status: Option<IssueStatusArg>,
#[arg(short, long, value_parser = clap::value_parser!(u8).range(MIN_PRIORITY as i64..=MAX_PRIORITY as i64))]
pub priority: Option<u8>,
#[arg(short = 't', long = "type", value_enum)]
pub issue_type: Option<IssueTypeArg>,
#[arg(short, long)]
pub assignee: Option<String>,
#[arg(short, long)]
pub label: Option<String>,
#[arg(short = 'n', long, default_value = "50")]
pub limit: usize,
#[arg(long, value_enum, default_value = "priority")]
pub sort: SortOrderArg,
}
#[derive(Parser, Debug, Clone)]
pub struct ShowArgs {
#[arg(required = true, value_parser = validate_issue_id)]
pub issue_ids: Vec<String>,
}
#[derive(Parser, Debug, Clone)]
pub struct UpdateArgs {
#[arg(required = true, value_parser = validate_issue_id)]
pub issue_ids: Vec<String>,
#[arg(long, value_parser = validate_title)]
pub title: Option<String>,
#[arg(short = 'D', long, value_parser = validate_description)]
pub description: Option<String>,
#[arg(short, long, value_enum)]
pub status: Option<IssueStatusArg>,
#[arg(short, long, value_parser = clap::value_parser!(u8).range(MIN_PRIORITY as i64..=MAX_PRIORITY as i64))]
pub priority: Option<u8>,
#[arg(short, long, conflicts_with = "no_assignee")]
pub assignee: Option<String>,
#[arg(long, conflicts_with = "assignee")]
pub no_assignee: bool,
#[arg(long)]
pub design: Option<String>,
#[arg(long)]
pub acceptance: Option<String>,
#[arg(long)]
pub notes: Option<String>,
#[arg(long)]
pub external_ref: Option<String>,
}
#[derive(Parser, Debug, Clone)]
pub struct CloseArgs {
#[arg(required = true, value_parser = validate_issue_id)]
pub issue_ids: Vec<String>,
#[arg(short, long, default_value = "Completed")]
pub reason: String,
}
#[derive(Parser, Debug, Clone)]
pub struct ReopenArgs {
#[arg(required = true, value_parser = validate_issue_id)]
pub issue_ids: Vec<String>,
#[arg(short, long)]
pub reason: Option<String>,
}
#[derive(Parser, Debug, Clone)]
pub struct DeleteArgs {
#[arg(value_parser = validate_issue_id)]
pub issue_id: String,
#[arg(short, long)]
pub force: bool,
}
#[derive(Parser, Debug, Clone)]
pub struct ReadyArgs {
#[arg(short, long)]
pub assignee: Option<String>,
#[arg(short, long, value_parser = clap::value_parser!(u8).range(MIN_PRIORITY as i64..=MAX_PRIORITY as i64))]
pub priority: Option<u8>,
#[arg(short = 'n', long, default_value = "10")]
pub limit: usize,
#[arg(long, value_enum, default_value = "hybrid")]
pub sort: SortPolicyArg,
}
#[derive(Parser, Debug, Clone)]
pub struct DepArgs {
#[command(subcommand)]
pub action: DepAction,
}
#[derive(Subcommand, Debug, Clone)]
pub enum DepAction {
Add {
#[arg(value_parser = validate_issue_id)]
from: String,
#[arg(value_parser = validate_issue_id)]
to: String,
#[arg(short = 't', long = "type", value_enum, default_value = "blocks")]
dep_type: DependencyTypeArg,
},
Remove {
#[arg(value_parser = validate_issue_id)]
from: String,
#[arg(value_parser = validate_issue_id)]
to: String,
},
List {
#[arg(value_parser = validate_issue_id)]
issue_id: String,
#[arg(short, long)]
reverse: bool,
},
Tree {
#[arg(value_parser = validate_issue_id)]
issue_id: String,
#[arg(short, long, default_value = "5")]
depth: usize,
},
}
#[derive(Parser, Debug, Clone, Default)]
pub struct BlockedArgs {
#[arg(short, long)]
pub assignee: Option<String>,
}
#[derive(Parser, Debug, Clone, Default)]
pub struct StatsArgs {
#[arg(short, long)]
pub detailed: bool,
}
#[derive(Parser, Debug, Clone, Default)]
pub struct InfoArgs {
}
#[derive(Parser, Debug, Clone)]
pub struct StaleArgs {
#[arg(short, long, default_value = "30")]
pub days: u32,
#[arg(short, long, value_enum)]
pub status: Option<IssueStatusArg>,
#[arg(short = 'n', long, default_value = "50")]
pub limit: usize,
}
#[derive(Parser, Debug, Clone)]
pub struct LabelArgs {
#[command(subcommand)]
pub action: LabelAction,
}
#[derive(Subcommand, Debug, Clone)]
pub enum LabelAction {
Add {
#[arg(value_parser = validate_label)]
label: String,
#[arg(value_parser = validate_issue_id)]
issue_id: Option<String>,
#[arg(long = "ids", num_args = 1.., value_parser = validate_issue_id)]
ids: Vec<String>,
},
Remove {
#[arg(value_parser = validate_label)]
label: String,
#[arg(value_parser = validate_issue_id)]
issue_id: Option<String>,
#[arg(long = "ids", num_args = 1.., value_parser = validate_issue_id)]
ids: Vec<String>,
},
List {
#[arg(value_parser = validate_issue_id)]
issue_id: String,
},
ListAll,
}