use std::path::PathBuf;
use clap::{Parser, Subcommand, ValueHint};
use url::Url;
use crate::logging::LogLevelFilter;
use self::{
changelog::ChangelogArgs, completion::CompletionArgs, new::NewArgs, portal::PortalArgs,
verbose::Verbosity,
};
pub mod changelog;
pub mod completion;
pub mod new;
pub mod portal;
mod verbose;
const ENV_CONFIG_PATH: &str = "FACTI_CONFIG";
const ENV_LOG_LEVEL: &str = "FACTI_LOG_LEVEL";
const ENV_API_KEY: &str = "FACTI_API_KEY";
const ENV_API_KEY_FILE: &str = "FACTI_API_KEY_FILE";
const ENV_PORTAL_BASE_URL: &str = "FACTI_PORTAL_BASE_URL";
const ENV_GAME_BASE_URL: &str = "FACTI_GAME_BASE_URL";
#[derive(Parser, Debug)]
#[command(author, version, about)]
pub struct Cli {
#[clap(flatten)]
pub verbose: Verbosity,
#[arg(
short,
long,
env = ENV_LOG_LEVEL,
alias = "log-level-filter",
global = true
)]
pub log_level: Option<LogLevelFilter>,
#[arg(short, long, env = ENV_CONFIG_PATH, value_hint = ValueHint::FilePath)]
pub config: Option<PathBuf>,
#[arg(short = 'k', long, env = ENV_API_KEY, value_hint = ValueHint::Other)]
pub api_key: Option<String>,
#[arg(long, conflicts_with_all = &["api_key", "api_key_file"])]
pub api_key_stdin: bool,
#[arg(long, env = ENV_API_KEY_FILE, value_hint = ValueHint::FilePath, conflicts_with_all = &["api_key", "api_key_stdin"])]
pub api_key_file: Option<PathBuf>,
#[arg(long, env = ENV_PORTAL_BASE_URL, value_hint = ValueHint::Url)]
pub portal_base_url: Option<Url>,
#[arg(long, env = ENV_GAME_BASE_URL, value_hint = ValueHint::Url)]
pub game_base_url: Option<Url>,
#[command(subcommand)]
pub command: Commands,
}
#[derive(Subcommand, Debug)]
pub enum Commands {
Portal(PortalArgs),
#[command(visible_alias = "init")]
New(Box<NewArgs>),
Changelog(ChangelogArgs),
Completion(CompletionArgs),
#[cfg(debug_assertions)]
#[command(name = "noop", visible_alias = "nop")]
NoOp,
#[cfg(debug_assertions)]
#[command(name = "logtest")]
LogTest,
}
impl Cli {
pub fn log_level_filter(&self) -> Option<LogLevelFilter> {
if let Some(ll) = self.log_level {
return Some(ll);
}
match self.verbose.is_given() {
true => Some(self.verbose.log_level_filter().into()),
false => None,
}
}
}