use clap::{Parser, Subcommand};
use std::io::Write;
use termcolor::StandardStream;
use crate::{
api::{self, server::ServerClient, words::RequestArgs},
error::Result,
};
use super::ExecuteSubcommand;
#[derive(Debug, Parser)]
#[clap(args_conflicts_with_subcommands = true)]
#[clap(subcommand_negates_reqs = true)]
pub struct Command {
#[command(flatten)]
pub request: RequestArgs,
#[command(subcommand)]
pub subcommand: Option<WordsSubcommand>,
}
#[derive(Clone, Debug, Subcommand)]
pub enum WordsSubcommand {
Add(api::words::add::Request),
Delete(api::words::delete::Request),
}
impl ExecuteSubcommand for Command {
async fn execute(self, mut stdout: StandardStream, server_client: ServerClient) -> Result<()> {
let words = match self.subcommand {
Some(WordsSubcommand::Add(request)) => {
let words_response = server_client.words_add(&request).await?;
serde_json::to_string_pretty(&words_response)?
},
Some(WordsSubcommand::Delete(request)) => {
let words_response = server_client.words_delete(&request).await?;
serde_json::to_string_pretty(&words_response)?
},
None => {
let words_response = server_client.words(&self.request.into()).await?;
serde_json::to_string_pretty(&words_response)?
},
};
writeln!(&mut stdout, "{words}")?;
Ok(())
}
}