use crate::config::InputConfig;
use clap::Args;
use derive_getters::Getters;
use std::ffi::OsString;
use std::path::PathBuf;
#[derive(Args, Debug, Getters)]
pub struct InputOptions {
#[arg(short = 'i', long = "input", name = "FILE_OR_DIR")]
inputs: Vec<PathBuf>,
#[arg(short = 'R', long)]
recursive: bool,
#[arg(short = 'x', long = "extension", value_name = "XTN")]
extensions: Vec<String>,
}
impl From<InputOptions> for InputConfig {
fn from(opts: InputOptions) -> Self {
let extensions = opts
.extensions()
.iter()
.map(|ext| OsString::from(ext.trim_start_matches('.')))
.collect();
let inputs = if opts.inputs.is_empty() {
vec![std::env::current_dir().expect("Failed to determine current directory.")]
} else {
opts.inputs
};
InputConfig::new(extensions, inputs, opts.recursive)
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::path::PathBuf;
#[test]
fn parse_input_options() {
let opts = InputOptions {
inputs: vec![PathBuf::from("input.jpg")],
recursive: true,
extensions: vec!["jpg".into()],
};
let config = InputConfig::from(opts);
assert_eq!(config.extensions(), &["jpg"]);
assert_eq!(config.inputs(), &[PathBuf::from("input.jpg")]);
assert!(config.recursive());
}
#[test]
fn parse_input_options_no_inputs() {
let opts = InputOptions {
inputs: vec![],
recursive: true,
extensions: vec!["jpg".into()],
};
let config = InputConfig::from(opts);
assert_eq!(config.extensions(), &["jpg"]);
assert_eq!(
config.inputs(),
&[std::env::current_dir().expect("Failed to determine current directory.")]
);
assert!(config.recursive());
}
}