use crate::otp::otp_element::OTPDatabase;
use crate::{arguments::extract::ExtractArgs, dashboard};
use clap::{Parser, Subcommand};
use color_eyre::eyre::eyre;
use delete::DeleteArgs;
use enum_dispatch::enum_dispatch;
use self::{
add::AddArgs, edit::EditArgs, export::ExportArgs, import::ImportArgs, list::ListArgs,
passwd::PasswdArgs,
};
mod add;
mod delete;
mod edit;
mod export;
mod extract;
mod import;
mod list;
mod passwd;
#[enum_dispatch]
pub trait SubcommandExecutor {
fn run_command(self, otp_database: OTPDatabase) -> color_eyre::Result<OTPDatabase>;
}
#[derive(Parser)]
#[command(author, version = env!("COTP_VERSION"), about, long_about = None)]
pub struct CotpArgs {
#[command(subcommand)]
command: Option<CotpSubcommands>,
#[arg(long = "password-stdin", default_value_t = false)]
pub password_from_stdin: bool,
#[arg(short = 'd', long = "database-path")]
pub database_path: Option<String>,
}
#[derive(Subcommand)]
#[enum_dispatch(SubcommandExecutor)]
pub enum CotpSubcommands {
Add(AddArgs),
Edit(EditArgs),
List(ListArgs),
Delete(DeleteArgs),
Import(ImportArgs),
Export(ExportArgs),
Extract(ExtractArgs),
Passwd(PasswdArgs),
}
pub fn args_parser(matches: CotpArgs, read_result: OTPDatabase) -> color_eyre::Result<OTPDatabase> {
if let Some(command) = matches.command {
command.run_command(read_result)
} else {
dashboard(read_result).map_err(|e| eyre!("An error occurred: {e}"))
}
}
#[test]
fn verify_cli() {
use clap::CommandFactory;
CotpArgs::command().debug_assert();
}