use crate::remote_cli::RemoteAction;
use crate::write;
use clap::{Args, Parser, Subcommand};
use std::path::PathBuf;
#[derive(Parser)]
#[command(name = "gy", version, about = "The gy ledger")]
pub struct Cli {
#[arg(long, global = true)]
pub json: bool,
#[arg(short = 'C', global = true, value_name = "DIR")]
pub directory: Option<PathBuf>,
#[arg(long, global = true, value_name = "NAME")]
pub scope: Option<String>,
#[command(subcommand)]
pub command: Command,
}
#[derive(Subcommand)]
pub enum Command {
Init {
#[arg(value_name = "NAME")]
name: String,
},
Show {
#[arg(required = true, value_name = "ID")]
ids: Vec<String>,
#[arg(long)]
full: bool,
},
List {
#[arg(long = "type", value_name = "KIND")]
kind: Option<String>,
#[arg(long, value_name = "STATUS")]
status: Option<String>,
#[arg(long, value_name = "ID")]
targets: Option<String>,
#[arg(long, value_name = "TEXT")]
grep: Option<String>,
#[arg(long, value_name = "NAME")]
actor: Option<String>,
#[arg(long, value_name = "SEQ|DATE")]
since: Option<String>,
},
Next,
Handover,
Publish {
#[arg(long, value_name = "SEQ", hide = true)]
since: Option<u64>,
#[arg(long, value_name = "DIR")]
out: Option<PathBuf>,
},
Serve,
Remote {
#[command(subcommand)]
action: RemoteAction,
},
#[command(hide = true)]
Sync,
#[command(hide = true)]
Share {
#[arg(value_name = "URL")]
url: String,
},
#[command(hide = true)]
Join,
Need {
#[command(subcommand)]
action: NeedAction,
},
Question {
#[command(subcommand)]
action: QuestionAction,
},
Criterion {
#[command(subcommand)]
action: CriterionAction,
},
Req {
#[command(subcommand)]
action: ReqAction,
},
Scope {
#[command(subcommand)]
action: ScopeAction,
},
Decide(DecideArgs),
Link(LinkArgs),
Edit(EditArgs),
Undo(UndoArgs),
}
#[derive(Subcommand)]
pub enum NeedAction {
#[command(override_usage = "gy need add [OPTIONS] --targets <AC> [--targets <AC>]... <TITLE>")]
Add {
title: String,
#[arg(long, value_name = "AC", required = true)]
targets: Vec<String>,
#[arg(long, value_name = "D")]
spawned_by: Option<String>,
#[arg(long = "body-file", value_name = "PATH")]
body_file: Option<String>,
},
Close {
id: String,
#[arg(long, value_name = "KIND", help = write::closed_by_help())]
by: String,
#[arg(long, value_name = "TEXT")]
evidence: String,
},
}
#[derive(Subcommand)]
pub enum QuestionAction {
#[command(
override_usage = "gy question add [OPTIONS] --decider <NAME> --options <A> --options <B> <TITLE>"
)]
Add {
title: String,
#[arg(long, value_name = "NAME")]
decider: String,
#[arg(long = "options", value_name = "OPTION", required = true)]
options: Vec<String>,
#[arg(long = "body-file", value_name = "PATH")]
body_file: Option<String>,
},
Close {
id: String,
#[arg(long, value_name = "KIND", help = write::closure_help())]
by: String,
#[arg(long, value_name = "TEXT")]
evidence: String,
#[arg(long, value_name = "D")]
decision: Option<String>,
},
}
#[derive(Subcommand)]
pub enum CriterionAction {
Add {
title: String,
#[arg(long = "body-file", value_name = "PATH")]
body_file: Option<String>,
},
Satisfy {
id: String,
#[arg(long, value_name = "TEXT")]
evidence: String,
#[arg(long)]
revoke: bool,
},
}
#[derive(Args)]
pub struct DecideArgs {
pub title: String,
#[arg(long = "scope-note", value_name = "TEXT")]
pub scope_note: String,
#[arg(long = "body-file", value_name = "PATH")]
pub body_file: Option<String>,
#[arg(long, value_name = "Q")]
pub closes: Vec<String>,
#[arg(long, num_args = 2, value_names = ["RELATION", "D"], help = write::relate_help())]
pub relate: Vec<String>,
#[arg(long, value_name = "TEXT")]
pub mark: Option<String>,
#[arg(long, value_name = "TEXT")]
pub source: Option<String>,
}
#[derive(Args)]
pub struct LinkArgs {
pub from: String,
#[arg(help = write::relation_help())]
pub relation: String,
pub to: String,
#[arg(long, value_name = "TEXT")]
pub mark: Option<String>,
#[arg(long)]
pub remove: bool,
}
#[derive(Args)]
pub struct EditArgs {
pub id: String,
#[arg(long, value_name = "TEXT")]
pub reason: String,
#[arg(long, value_name = "TITLE")]
pub title: Option<String>,
#[arg(long = "body-file", value_name = "PATH")]
pub body_file: Option<String>,
#[arg(long, value_name = "KEY=VALUE")]
pub set: Vec<String>,
#[arg(long, value_name = "KEY=VALUE")]
pub append: Vec<String>,
}
#[derive(Args)]
pub struct UndoArgs {
#[arg(long, value_name = "TEXT")]
pub reason: String,
}
#[derive(Subcommand)]
pub enum ScopeAction {
Rename { old: String, new: String },
}
#[derive(Subcommand)]
pub enum ReqAction {
#[command(override_usage = "gy req add [OPTIONS] --need <N> [--need <N>]... <TITLE>")]
Add {
title: String,
#[arg(long = "need", value_name = "N", required = true)]
needs: Vec<String>,
#[arg(long = "relies-on", value_name = "D")]
relies_on: Vec<String>,
#[arg(long, value_name = "AC")]
targets: Vec<String>,
#[arg(long = "ref", value_name = "REF")]
reference: Option<String>,
#[arg(long = "body-file", value_name = "PATH")]
body_file: Option<String>,
},
Approve {
id: String,
#[arg(long, value_name = "TEXT")]
design: String,
#[arg(long = "heard-by", value_name = "NAME")]
heard_by: String,
#[arg(long, value_name = "TEXT")]
evidence: String,
},
Revise {
id: String,
#[arg(long, value_name = "TEXT")]
reason: String,
#[arg(long, value_name = "TEXT")]
source: String,
},
Done {
id: String,
#[arg(long, value_name = "TEXT")]
evidence: String,
},
Cancel {
id: String,
#[arg(long, value_name = "TEXT")]
reason: String,
#[arg(long, value_name = "TEXT")]
source: String,
},
}