use crate::ResetData;
use std::num::NonZeroUsize;
use std::path::PathBuf;
use crate::NonZeroDecimal;
use clap::Parser;
use crate::FPS;
#[derive(Debug, Parser)]
pub struct Cli {
#[arg(value_parser=is_file)]
pub input: PathBuf,
#[arg(value_parser=output_dne)]
pub output: PathBuf,
#[arg(value_parser=is_file, env)]
pub ai_binary: PathBuf,
#[arg(value_parser=is_dir, env)]
pub ai_model: PathBuf,
#[arg(long, value_enum, default_value_t=FPS::default())]
pub fps: FPS,
#[arg(short, value_parser=dne_or_is_dir)]
pub temp_dir: PathBuf,
#[arg(short='m', default_value_t = NonZeroUsize::new(50).unwrap())]
pub max_step_size: NonZeroUsize,
#[arg(long, default_value_t = default_ai_args())]
pub ai_args: String,
#[arg(short='r', default_value_t = ResetData::default())]
pub reset: ResetData,
#[arg(short='s', default_value_t = String::from(".1"), value_parser=can_be_decimal)]
pub scene_gt: String,
#[arg(long, default_value_t = NonZeroUsize::new(18).unwrap())]
pub crf: NonZeroUsize,
}
fn can_be_decimal(scene_gt: &str) -> Result<String, String> {
NonZeroDecimal::try_from(scene_gt)
.map_err(|e| format!("scene_gt should be a non-zero decimal: {e}"))?;
Ok(scene_gt.to_owned())
}
fn is_file(path: &str) -> Result<PathBuf, String> {
let path = PathBuf::from(path);
if !path.is_file() {
return Err(format!("path doesn't exist or isn't a file: {path:?}"));
}
Ok(path)
}
fn is_dir(path: &str) -> Result<PathBuf, String> {
let path = PathBuf::from(path);
if !path.is_dir() {
return Err(format!("path doesn't exist is isn't a directory: {path:?}"));
}
Ok(path)
}
fn dne_or_is_dir(path: &str) -> Result<PathBuf, String> {
let path = PathBuf::from(path);
if path.exists() && !path.is_dir() {
return Err(format!(
"Path should not exist or should be a folder: {path:?}"
));
}
Ok(path)
}
fn output_dne(path: &str) -> Result<PathBuf, String> {
let path = PathBuf::from(path);
if path.exists() {
return Err(format!(
"Output path already exist. Please delete the file to continue: {path:?}"
));
}
Ok(path)
}
fn default_ai_args() -> String {
let cpu_count = num_cpus::get();
format!("-g 0,-1 -j {cpu_count}:{cpu_count},16:32:16")
}