use clap::builder::PossibleValue;
use clap::{ArgGroup, Parser};
use std::path::PathBuf;
use tackler_api::txn_ts;
#[derive(Parser)]
#[command(author, version=env!("VERSION"), about, long_about = None)]
#[command(group(
ArgGroup::new("input")
.required(true)
.args(["input_filename", "input_fs_dir", "input_git_repo"]),
))]
pub(crate) struct Cli {
#[arg(long = "audit.mode", value_name = "true|false")]
pub(crate) audit_mode: Option<bool>,
#[arg(long="input.file",
value_name = "txn file path",
conflicts_with_all([
"input_fs_dir",
"input_fs_ext",
"input_git_repo",
"input_git_ref",
"input_git_dir"])
)]
pub(crate) input_filename: Option<PathBuf>,
#[arg(long="input.fs.dir",
value_name = "txn dir path",
requires("input_fs_ext"),
conflicts_with_all([
"input_git_repo",
"input_git_ref",
"input_git_dir"])
)]
pub(crate) input_fs_dir: Option<PathBuf>,
#[arg(long = "input.fs.ext", value_name = "txn file extension")]
pub(crate) input_fs_ext: Option<String>,
#[arg(
long = "input.git.repo",
value_name = "git repo path",
requires("input_git_ref"),
requires("input_git_dir")
)]
pub(crate) input_git_repo: Option<PathBuf>,
#[arg(
long = "input.git.ref",
value_name = "git ref",
requires("input_git_repo"),
requires("input_git_dir")
)]
pub(crate) input_git_ref: Option<String>,
#[arg(
long = "input.git.dir",
value_name = "git-path prefix",
requires("input_git_repo"),
requires("input_git_ref")
)]
pub(crate) input_git_dir: Option<String>,
#[arg(
long = "report-tz",
value_name = "timezone name",
num_args(1),
default_value = "UTC"
)]
pub(crate) report_tz: Option<String>,
#[arg(long = "accounts", value_name = "regex", num_args(1..))]
pub(crate) accounts: Option<Vec<String>>,
#[arg(long = "reports", value_name = "type", num_args(1..),
value_parser([
PossibleValue::new("register"),
PossibleValue::new("balance"),
PossibleValue::new("balance-group"),
])
)]
pub(crate) reports: Option<Vec<String>>,
#[arg(long = "group-by", value_name = "group-by", num_args(1), default_value = "year",
value_parser([
PossibleValue::new(txn_ts::GroupBy::YEAR),
PossibleValue::new(txn_ts::GroupBy::MONTH),
PossibleValue::new(txn_ts::GroupBy::DATE),
PossibleValue::new(txn_ts::GroupBy::ISO_WEEK),
PossibleValue::new(txn_ts::GroupBy::ISO_WEEK_DATE),
])
)]
pub(crate) group_by: Option<String>,
#[arg(long = "exports", value_name = "type", num_args(1..),
value_parser([
PossibleValue::new("identity"),
PossibleValue::new("equity"),
])
)]
pub(crate) exports: Option<Vec<String>>,
#[arg(
long = "equity.account.name",
value_name = "account name",
num_args(1),
default_value = "Equity:Default·Account",
requires("exports")
)]
pub(crate) equity_account_name: Option<String>,
#[arg(long = "api-filter-def", value_name = "filter def in json")]
pub(crate) api_filter_def: Option<String>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn verify_cli() {
use clap::CommandFactory;
Cli::command().debug_assert()
}
}