thot_cli/commands/user/
mod.rs1use crate::result::Result;
2use clap::{ArgGroup, Args, Subcommand};
3use thot_core::types::UserId;
4mod commands;
5
6pub fn main(args: UserArgs, verbose: bool) -> Result {
7 match args.command {
8 Command::List => commands::list(verbose),
9 Command::Add(user) => commands::add(user),
10 Command::Delete(user) => commands::delete(user),
11 Command::Edit(e_args) => {
12 let name = match e_args.name {
13 None => None,
14 Some(name) if name.trim().is_empty() => Some(None),
15 Some(name) => Some(Some(name)),
16 };
17
18 let edits = EditUserFields {
19 name,
20 email: e_args.email,
21 };
22
23 commands::edit(e_args.id, edits)
24 }
25 }
26}
27
28#[derive(Debug, Args)]
29pub struct UserArgs {
30 #[clap(subcommand)]
31 command: Command,
32}
33
34#[derive(Debug, Subcommand)]
35enum Command {
36 List,
37 Add(AddArgs),
38 Delete(UserId),
39 Edit(EditArgs),
40}
41
42#[derive(Debug, Args)]
43pub struct AddArgs {
44 #[clap(short, long)]
45 name: Option<String>,
46
47 #[clap(short, long)]
48 email: String,
49}
50
51#[derive(Debug, Args)]
52#[clap(group(
53 ArgGroup::new("edit")
54 .required(true)
55 .multiple(true)
56))]
57pub struct EditArgs {
58 id: UserId,
59
60 #[clap(short, long, group = "edit")]
61 email: Option<String>,
62
63 #[clap(short, long, group = "edit")]
64 name: Option<String>,
65}
66
67#[derive(Debug)]
68pub struct EditUserFields {
69 email: Option<String>,
70 name: Option<Option<String>>,
71}