use clap::Parser;
use std::path::PathBuf;
use crate::analyzer::{
TpTargetMode, DEFAULT_TARGET_TRUE_PEAK, SPLIT_TARGET_TRUE_PEAK_HIGH, SPLIT_TARGET_TRUE_PEAK_LOW,
};
#[derive(Parser, Debug)]
#[command(version, about, long_about = None)]
pub struct Cli {
pub paths: Vec<String>,
#[arg(long, value_name = "DB", allow_hyphen_values = true, conflicts_with = "tp_split_bitrate")]
pub tp_target: Option<f64>,
#[arg(long)]
pub tp_split_bitrate: bool,
#[arg(long, conflicts_with = "no_lossless")]
pub lossless: bool,
#[arg(long)]
pub no_lossless: bool,
#[arg(long, conflicts_with = "no_reencode")]
pub reencode: bool,
#[arg(long)]
pub no_reencode: bool,
#[arg(long, value_name = "DIR", num_args = 0..=1, default_missing_value = "")]
pub backup: Option<PathBuf>,
#[arg(long, value_name = "PATH", num_args = 0..=1, default_missing_value = "", conflicts_with = "no_report")]
pub report: Option<PathBuf>,
#[arg(long)]
pub no_report: bool,
#[arg(long)]
pub analyze_only: bool,
#[arg(long)]
pub no_update_check: bool,
}
impl Cli {
pub fn is_non_interactive(&self) -> bool {
!self.paths.is_empty()
|| self.lossless
|| self.no_lossless
|| self.reencode
|| self.no_reencode
|| self.backup.is_some()
|| self.report.is_some()
|| self.no_report
|| self.analyze_only
|| self.tp_target.is_some()
|| self.tp_split_bitrate
}
pub fn tp_mode(&self) -> TpTargetMode {
if let Some(t) = self.tp_target {
TpTargetMode::Uniform(t)
} else if self.tp_split_bitrate {
TpTargetMode::SplitBitrate(SPLIT_TARGET_TRUE_PEAK_HIGH, SPLIT_TARGET_TRUE_PEAK_LOW)
} else {
TpTargetMode::Uniform(DEFAULT_TARGET_TRUE_PEAK)
}
}
pub fn lossless_enabled(&self) -> bool {
!self.no_lossless
}
pub fn reencode_enabled(&self) -> bool {
self.reencode && !self.no_reencode
}
pub fn report_enabled(&self) -> bool {
!self.no_report
}
}