use crate::cli::InputPathHandler;
use crate::error::SubXError;
use clap::Args;
use std::path::PathBuf;
#[derive(Args, Debug)]
pub struct DetectEncodingArgs {
#[arg(short, long)]
pub verbose: bool,
#[arg(
short = 'i',
long = "input",
value_name = "PATH",
conflicts_with = "file_paths"
)]
pub input_paths: Vec<PathBuf>,
#[arg(short, long)]
pub recursive: bool,
#[arg(required = true, conflicts_with = "input_paths")]
pub file_paths: Vec<String>,
#[arg(long, default_value_t = false)]
pub no_extract: bool,
}
#[cfg(test)]
mod tests {
use crate::cli::{Cli, Commands};
use clap::Parser;
use std::path::PathBuf;
#[test]
fn test_detect_encoding_args_file_paths() {
let cli = Cli::try_parse_from(["subx-cli", "detect-encoding", "a.srt", "b.ass"]).unwrap();
let args = match cli.command {
Commands::DetectEncoding(a) => a,
_ => panic!("Expected DetectEncoding command"),
};
assert!(args.input_paths.is_empty());
assert_eq!(
args.file_paths,
vec!["a.srt".to_string(), "b.ass".to_string()]
);
assert!(!args.recursive);
}
#[test]
fn test_detect_encoding_args_input_paths() {
let cli = Cli::try_parse_from([
"subx-cli",
"detect-encoding",
"-i",
"dir1",
"-i",
"dir2",
"--recursive",
"--verbose",
])
.unwrap();
let args = match cli.command {
Commands::DetectEncoding(a) => a,
_ => panic!("Expected DetectEncoding command"),
};
assert!(args.file_paths.is_empty());
assert_eq!(
args.input_paths,
vec![PathBuf::from("dir1"), PathBuf::from("dir2")]
);
assert!(args.recursive);
assert!(args.verbose);
}
#[test]
fn test_detect_encoding_args_conflict_file_and_input() {
let res = Cli::try_parse_from(["subx-cli", "detect-encoding", "file.srt", "-i", "dir"]);
assert!(res.is_err());
}
}
impl DetectEncodingArgs {
pub fn get_input_handler(&self) -> Result<InputPathHandler, SubXError> {
let merged_paths = InputPathHandler::merge_paths_from_multiple_sources(
&[],
&self.input_paths,
&self.file_paths,
)?;
Ok(InputPathHandler::from_args(&merged_paths, self.recursive)?
.with_extensions(&["srt", "ass", "vtt", "ssa", "sub", "txt"])
.with_no_extract(self.no_extract))
}
pub fn get_file_paths(&self) -> Result<Vec<PathBuf>, SubXError> {
if !self.input_paths.is_empty() {
let handler = InputPathHandler::from_args(&self.input_paths, self.recursive)?
.with_extensions(&["srt", "ass", "vtt", "ssa", "sub", "txt"]);
return handler.collect_files().map(|cf| cf.into_paths());
}
if !self.file_paths.is_empty() {
return Ok(self.file_paths.iter().map(PathBuf::from).collect());
}
Err(SubXError::NoInputSpecified)
}
}