himalaya/src/cli.rs

146 lines
5 KiB
Rust
Raw Normal View History

2023-12-06 17:09:49 +00:00
use clap::{Parser, Subcommand};
use color_eyre::Result;
2023-12-06 20:46:31 +00:00
use std::path::PathBuf;
2023-12-06 17:09:49 +00:00
use crate::{
account::command::AccountSubcommand,
2023-12-06 20:46:31 +00:00
completion::command::CompletionGenerateCommand,
2023-12-06 17:09:49 +00:00
config::{self, TomlConfig},
envelope::command::EnvelopeSubcommand,
flag::command::FlagSubcommand,
folder::command::FolderSubcommand,
2023-12-06 20:46:31 +00:00
manual::command::ManualGenerateCommand,
message::{
attachment::command::AttachmentSubcommand, command::MessageSubcommand,
template::command::TemplateSubcommand,
},
output::OutputFmt,
2023-12-06 17:09:49 +00:00
printer::Printer,
};
#[derive(Parser, Debug)]
2023-12-08 11:18:18 +00:00
#[command(name = "himalaya", author, version, about)]
#[command(propagate_version = true, infer_subcommands = true)]
2023-12-06 17:09:49 +00:00
pub struct Cli {
#[command(subcommand)]
2024-01-03 21:49:39 +00:00
pub command: Option<HimalayaCommand>,
2023-12-06 17:09:49 +00:00
/// Override the default configuration file path.
2023-12-06 17:09:49 +00:00
///
/// The given paths are shell-expanded then canonicalized (if
/// applicable). If the first path does not point to a valid file,
/// the wizard will propose to assist you in the creation of the
/// configuration file. Other paths are merged with the first one,
/// which allows you to separate your public config from your
/// private(s) one(s).
#[arg(short, long = "config", global = true, env = "HIMALAYA_CONFIG")]
#[arg(value_name = "PATH", value_parser = config::path_parser)]
pub config_paths: Vec<PathBuf>,
2023-12-06 17:09:49 +00:00
/// Customize the output format.
2023-12-06 17:09:49 +00:00
///
/// The output format determine how to display commands output to
/// the terminal.
///
/// The possible values are:
///
/// - json: output will be in a form of a JSON-compatible object
///
/// - plain: output will be in a form of either a plain text or
/// table, depending on the command
#[arg(long, short, global = true)]
#[arg(value_name = "FORMAT", value_enum, default_value_t = Default::default())]
2023-12-06 17:09:49 +00:00
pub output: OutputFmt,
/// Enable logs with spantrace.
///
/// This is the same as running the command with `RUST_LOG=debug`
/// environment variable.
#[arg(long, global = true, conflicts_with = "trace")]
pub debug: bool,
/// Enable verbose logs with backtrace.
///
/// This is the same as running the command with `RUST_LOG=trace`
/// and `RUST_BACKTRACE=1` environment variables.
#[arg(long, global = true, conflicts_with = "debug")]
pub trace: bool,
2023-12-06 17:09:49 +00:00
}
#[derive(Subcommand, Debug)]
2023-12-06 20:46:31 +00:00
pub enum HimalayaCommand {
#[command(subcommand)]
#[command(alias = "accounts")]
2023-12-06 20:46:31 +00:00
Account(AccountSubcommand),
#[command(subcommand)]
#[command(visible_alias = "mailbox", aliases = ["mailboxes", "mboxes", "mbox"])]
#[command(alias = "folders")]
2023-12-06 20:46:31 +00:00
Folder(FolderSubcommand),
2023-12-06 17:09:49 +00:00
#[command(subcommand)]
#[command(alias = "envelopes")]
2023-12-06 22:12:06 +00:00
Envelope(EnvelopeSubcommand),
#[command(subcommand)]
#[command(alias = "flags")]
2023-12-07 09:10:18 +00:00
Flag(FlagSubcommand),
#[command(subcommand)]
#[command(alias = "messages", alias = "msgs", alias = "msg")]
Message(MessageSubcommand),
2023-12-07 21:37:28 +00:00
#[command(subcommand)]
2023-12-08 11:18:18 +00:00
#[command(alias = "attachments")]
Attachment(AttachmentSubcommand),
2023-12-07 21:37:28 +00:00
#[command(subcommand)]
2023-12-08 11:18:18 +00:00
#[command(alias = "templates", alias = "tpls", alias = "tpl")]
Template(TemplateSubcommand),
2023-12-06 20:46:31 +00:00
#[command(arg_required_else_help = true)]
#[command(alias = "manuals", alias = "mans")]
2023-12-06 20:46:31 +00:00
Manual(ManualGenerateCommand),
2023-12-06 17:09:49 +00:00
2023-12-06 20:46:31 +00:00
#[command(arg_required_else_help = true)]
#[command(alias = "completions")]
2023-12-06 20:46:31 +00:00
Completion(CompletionGenerateCommand),
2023-12-06 17:09:49 +00:00
}
2023-12-06 20:46:31 +00:00
impl HimalayaCommand {
pub async fn execute(self, printer: &mut impl Printer, config_paths: &[PathBuf]) -> Result<()> {
2023-12-06 17:09:49 +00:00
match self {
Self::Account(cmd) => {
let config = TomlConfig::from_paths_or_default(config_paths).await?;
cmd.execute(printer, &config).await
}
Self::Folder(cmd) => {
let config = TomlConfig::from_paths_or_default(config_paths).await?;
cmd.execute(printer, &config).await
}
Self::Envelope(cmd) => {
let config = TomlConfig::from_paths_or_default(config_paths).await?;
cmd.execute(printer, &config).await
}
Self::Flag(cmd) => {
let config = TomlConfig::from_paths_or_default(config_paths).await?;
cmd.execute(printer, &config).await
}
Self::Message(cmd) => {
let config = TomlConfig::from_paths_or_default(config_paths).await?;
cmd.execute(printer, &config).await
}
Self::Attachment(cmd) => {
let config = TomlConfig::from_paths_or_default(config_paths).await?;
cmd.execute(printer, &config).await
}
Self::Template(cmd) => {
let config = TomlConfig::from_paths_or_default(config_paths).await?;
cmd.execute(printer, &config).await
}
2023-12-06 20:46:31 +00:00
Self::Manual(cmd) => cmd.execute(printer).await,
Self::Completion(cmd) => cmd.execute().await,
2023-12-06 17:09:49 +00:00
}
}
}