use clap::{ArgGroup, Args, Subcommand};
#[derive(Clone, Debug, Subcommand)]
pub enum DiscussCommands {
Open(DiscussOpenArgs),
Append(DiscussAppendArgs),
Resolve(DiscussResolveArgs),
Reopen(DiscussReopenArgs),
List(DiscussListArgs),
Show(DiscussShowArgs),
}
#[derive(Clone, Debug, Args)]
#[command(
group(
ArgGroup::new("positional_open")
.args(["file", "symbol", "body"])
.multiple(true)
.conflicts_with("named_open")
),
group(
ArgGroup::new("named_open")
.args(["file_flag", "symbol_flag", "body_flag"])
.multiple(true)
)
)]
pub struct DiscussOpenArgs {
#[arg(
value_name = "FILE",
required_unless_present_all = ["file_flag", "symbol_flag", "body_flag"]
)]
pub file: Option<String>,
#[arg(
value_name = "SYMBOL",
required_unless_present_all = ["file_flag", "symbol_flag", "body_flag"]
)]
pub symbol: Option<String>,
#[arg(
value_name = "BODY",
required_unless_present_all = ["file_flag", "symbol_flag", "body_flag"]
)]
pub body: Option<String>,
#[arg(
long = "file",
value_name = "FILE",
required_unless_present_all = ["file", "symbol", "body"]
)]
pub file_flag: Option<String>,
#[arg(
long = "symbol",
value_name = "SYMBOL",
required_unless_present_all = ["file", "symbol", "body"]
)]
pub symbol_flag: Option<String>,
#[arg(
long = "body",
value_name = "BODY",
required_unless_present_all = ["file", "symbol", "body"]
)]
pub body_flag: Option<String>,
#[arg(long)]
pub title: Option<String>,
#[arg(long)]
pub state: Option<String>,
#[arg(long)]
pub visibility: Option<String>,
#[arg(long, value_name = "REF")]
pub thread: Option<String>,
}
#[derive(Clone, Debug, Args)]
pub struct DiscussAppendArgs {
pub discussion_id: String,
pub body: String,
}
#[derive(Clone, Debug, Args)]
#[command(group(
ArgGroup::new("resolution")
.required(true)
.args(["mode", "into_annotation"])
))]
pub struct DiscussResolveArgs {
pub discussion_id: String,
#[arg(long, value_enum)]
pub mode: Option<ResolveModeArg>,
#[arg(long, requires = "body")]
pub into_annotation: bool,
#[arg(long, requires = "mode")]
pub state: Option<String>,
#[arg(long, requires = "mode")]
pub reason: Option<String>,
#[arg(long, requires = "into_annotation")]
pub body: Option<String>,
#[arg(
long,
value_parser = ["constraint", "invariant", "rationale"],
requires = "into_annotation"
)]
pub kind: Option<String>,
#[arg(long, requires = "into_annotation")]
pub tag: Vec<String>,
}
#[derive(Clone, Debug, clap::ValueEnum)]
pub enum ResolveModeArg {
ByEdit,
Dismiss,
}
#[derive(Clone, Debug, Args)]
pub struct DiscussReopenArgs {
pub discussion_id: String,
#[arg(long)]
pub reason: String,
}
#[derive(Clone, Debug, Args)]
pub struct DiscussListArgs {
#[arg(long)]
pub state: Option<String>,
#[arg(long)]
pub file: Option<String>,
#[arg(long)]
pub symbol: Option<String>,
#[arg(long, default_value = "open")]
pub status: String,
}
#[derive(Clone, Debug, Args)]
pub struct DiscussShowArgs {
pub discussion_id: String,
}