thot_cli/commands/user/
mod.rs

1use 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}