clickup_cli/commands/
member.rs1use 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 {
13 #[arg(long, conflicts_with = "list")]
15 task: Option<String>,
16 #[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}