Skip to main content

clickup_cli/commands/
member.rs

1use crate::client::ClickUpClient;
2use crate::commands::auth::resolve_token;
3use crate::error::CliError;
4use crate::git;
5use crate::output::OutputConfig;
6use crate::Cli;
7use clap::Subcommand;
8
9#[derive(Subcommand)]
10pub enum MemberCommands {
11    /// List members of a task or list (use --task or --list)
12    List {
13        /// Task ID
14        #[arg(long, conflicts_with = "list")]
15        task: Option<String>,
16        /// List ID
17        #[arg(long, conflicts_with = "task")]
18        list: Option<String>,
19    },
20}
21
22const MEMBER_FIELDS: &[&str] = &["id", "username", "email", "role"];
23
24pub async fn execute(command: MemberCommands, cli: &Cli) -> Result<(), CliError> {
25    let token = resolve_token(cli)?;
26    let client = ClickUpClient::new(&token, cli.timeout)?;
27    let output = OutputConfig::from_cli(&cli.output, &cli.fields, cli.no_header, cli.quiet);
28
29    match command {
30        MemberCommands::List { task, list } => {
31            let url = if let Some(id) = list {
32                format!("/v2/list/{}/member", id)
33            } else if let Some(resolved) = git::resolve_task(cli, task.as_deref(), true)? {
34                format!("/v2/task/{}/member", resolved.id)
35            } else {
36                return Err(CliError::ClientError {
37                    message: "Specify either --task ID or --list ID".into(),
38                    status: 0,
39                });
40            };
41            let resp = client.get(&url).await?;
42            let members = resp
43                .get("members")
44                .and_then(|m| m.as_array())
45                .cloned()
46                .unwrap_or_default();
47            output.print_items(&members, MEMBER_FIELDS, "id");
48            Ok(())
49        }
50    }
51}