use clap::Subcommand;
use eyre::Result;
#[cfg(not(windows))]
use rustix::{fs::Mode, process::umask};
#[cfg(feature = "client")]
mod client;
mod contributors;
mod gen_completions;
mod external;
#[derive(Subcommand)]
#[command(infer_subcommands = true)]
#[allow(clippy::large_enum_variant)]
pub enum AtuinCmd {
#[cfg(feature = "client")]
#[command(flatten)]
Client(client::Cmd),
#[cfg(feature = "hex")]
Hex {
#[command(subcommand)]
cmd: Option<atuin_hex::Cmd>,
},
Uuid,
Contributors,
GenCompletions(gen_completions::Cmd),
#[command(external_subcommand)]
External(Vec<String>),
}
impl AtuinCmd {
pub fn run(self) -> Result<()> {
#[cfg(not(windows))]
{
let mode = Mode::RWXG | Mode::RWXO;
umask(mode);
}
match self {
#[cfg(feature = "client")]
Self::Client(client) => client.run(),
#[cfg(feature = "hex")]
Self::Hex { cmd } => {
atuin_hex::run(cmd);
Ok(())
}
Self::Contributors => {
contributors::run();
Ok(())
}
Self::Uuid => {
println!("{}", atuin_common::utils::uuid_v7().as_simple());
Ok(())
}
Self::GenCompletions(gen_completions) => gen_completions.run(),
Self::External(args) => external::run(&args),
}
}
}