1use std::path::PathBuf;
4
5use clap::{Args, Parser, Subcommand};
6
7#[derive(Debug, Parser)]
8#[command(
9 name = "semora",
10 version,
11 about = "Publish Markdown and HTML to Semora and hear back from the page",
12 after_help = "Configuration: SEMORA_URL, SEMORA_API_KEY, SEMORA_DEFAULT_TAGS, SEMORA_WAIT_TIMEOUT \
13 (environment or a .env file in this folder or a parent), or `semora login`.\n\
14 Exit codes: 0 ok, 1 error, 2 timeout, 3 auth error, 4 not found."
15)]
16pub struct Cli {
17 #[arg(long, global = true, value_name = "URL")]
19 pub server: Option<String>,
20 #[arg(long, global = true, value_name = "KEY", hide_env_values = true)]
22 pub api_key: Option<String>,
23 #[arg(long, global = true)]
25 pub json: bool,
26 #[command(subcommand)]
27 pub cmd: Cmd,
28}
29
30#[derive(Debug, Subcommand)]
31pub enum Cmd {
32 Login {
34 #[arg(long)]
36 no_browser: bool,
37 #[arg(long)]
39 name: Option<String>,
40 },
41 Logout,
43 Whoami,
45 Push(PushArgs),
47 Watch(WatchArgs),
49 Wait(WaitArgs),
51 Say {
53 doc: String,
55 text: String,
57 #[arg(long)]
59 reply_to: Option<i64>,
60 },
61 Ls {
63 #[arg(short = 'q', long = "query")]
65 query: Option<String>,
66 #[arg(long)]
68 tag: Option<String>,
69 #[arg(long)]
71 kind: Option<String>,
72 #[arg(long, default_value_t = 50)]
73 limit: u32,
74 },
75 Show {
77 doc: String,
79 },
80 Get {
82 doc: String,
84 path: Option<String>,
86 #[arg(long)]
88 rev: Option<i64>,
89 #[arg(short = 'o', long = "output")]
91 output: Option<PathBuf>,
92 },
93 Tag {
95 doc: String,
97 #[arg(required = true, num_args = 1.., allow_hyphen_values = true)]
98 changes: Vec<String>,
99 },
100 Rm {
102 doc: String,
104 },
105 Open {
107 doc: String,
109 },
110 #[command(subcommand)]
112 Keys(KeysCmd),
113 Skill,
115}
116
117#[derive(Debug, Args)]
118pub struct PushArgs {
119 pub path: PathBuf,
121 #[arg(long)]
123 pub id: Option<String>,
124 #[arg(long, conflicts_with = "id")]
126 pub new: bool,
127 #[arg(long)]
128 pub title: Option<String>,
129 #[arg(long = "tag", value_name = "TAGS")]
131 pub tags: Vec<String>,
132 #[arg(short = 'm', long = "message")]
134 pub message: Option<String>,
135 #[arg(long)]
137 pub entry: Option<String>,
138 #[arg(long = "meta", value_name = "KEY=VALUE")]
140 pub meta: Vec<String>,
141 #[arg(long)]
143 pub wait: bool,
144 #[command(flatten)]
145 pub wait_opts: WaitOpts,
146}
147
148#[derive(Debug, Args, Clone, Default)]
149pub struct WaitOpts {
150 #[arg(long)]
152 pub timeout: Option<u64>,
153 #[arg(long)]
155 pub kinds: Option<String>,
156 #[arg(long)]
158 pub follow: bool,
159 #[arg(long, default_value_t = 3.0)]
161 pub collect: f64,
162 #[arg(long)]
164 pub save_dir: Option<PathBuf>,
165}
166
167#[derive(Debug, Args)]
168pub struct WaitArgs {
169 pub doc: String,
171 #[command(flatten)]
172 pub opts: WaitOpts,
173}
174
175#[derive(Debug, Args)]
176pub struct WatchArgs {
177 pub path: PathBuf,
179 #[arg(long)]
181 pub id: Option<String>,
182 #[arg(long)]
183 pub title: Option<String>,
184 #[arg(long = "tag", value_name = "TAGS")]
185 pub tags: Vec<String>,
186 #[arg(long)]
187 pub entry: Option<String>,
188}
189
190#[derive(Debug, Subcommand)]
191pub enum KeysCmd {
192 Ls,
194 Create {
196 name: String,
197 #[arg(long)]
199 scopes: Option<String>,
200 #[arg(long)]
202 expires_in_days: Option<u32>,
203 },
204 Revoke { id: i64 },
206}