use crate::output::{OutputFormat, print_output};
use anyhow::Result;
use clap::{Args, Subcommand};
use grr_chat::ChatClient;
#[derive(Subcommand, Debug)]
pub enum ChatCommands {
Spaces(SpacesArgs),
Space(SpaceArgs),
Messages(MessagesArgs),
Send(SendArgs),
}
#[derive(Args, Debug)]
pub struct SpacesArgs {
#[arg(short, long, default_value = "25")]
pub max: usize,
#[arg(short, long, value_enum, default_value = "json")]
pub format: OutputFormat,
}
#[derive(Args, Debug)]
pub struct SpaceArgs {
pub space_id: String,
#[arg(short, long, value_enum, default_value = "json")]
pub format: OutputFormat,
}
#[derive(Args, Debug)]
pub struct MessagesArgs {
pub space_id: String,
#[arg(short, long, default_value = "25")]
pub max: usize,
#[arg(short, long, value_enum, default_value = "json")]
pub format: OutputFormat,
}
#[derive(Args, Debug)]
pub struct SendArgs {
pub space_id: String,
#[arg(short, long)]
pub text: String,
#[arg(short, long, value_enum, default_value = "json")]
pub format: OutputFormat,
}
pub async fn handle_chat_cmd(client: &ChatClient, cmd: ChatCommands) -> Result<()> {
match cmd {
ChatCommands::Spaces(args) => {
let spaces = client.list_spaces(Some(args.max)).await?;
print_output(&spaces, args.format)?;
}
ChatCommands::Space(args) => {
let space = client.get_space(&args.space_id).await?;
print_output(&space, args.format)?;
}
ChatCommands::Messages(args) => {
let messages = client.list_messages(&args.space_id, Some(args.max)).await?;
print_output(&messages, args.format)?;
}
ChatCommands::Send(args) => {
anyhow::ensure!(!args.text.trim().is_empty(), "--text must not be empty");
let message = client.send_message(&args.space_id, &args.text).await?;
print_output(&message, args.format)?;
}
}
Ok(())
}