use anyhow::{Context, Result};
use clap::Parser;
use std::path::PathBuf;
use crate::kernel::muskingum::MuskingumCungeKernel;
#[derive(Parser, Debug)]
#[command(version, about, long_about = None)]
struct Args {
route_dir: PathBuf,
#[arg(short, long, default_value_t = 300)]
internal_timestep_seconds: usize,
#[arg(short, long, default_value_t = MuskingumCungeKernel::TRouteModernized)]
kernel: MuskingumCungeKernel,
}
pub struct Config {
pub config_dir: PathBuf,
pub csv_dir: PathBuf,
pub gpkg_file: PathBuf,
pub internal_timestep_seconds: usize,
pub output_dir: PathBuf,
pub kernel: MuskingumCungeKernel,
}
pub fn get_args() -> Result<Config> {
let args = Args::parse();
let root_dir = args.route_dir;
let csv_dir = root_dir.join("outputs").join("ngen");
let config_dir = root_dir.join("config");
let output_dir = root_dir.join("outputs").join("troute");
let gpkg_file = config_dir
.read_dir()
.context("Failed to read config directory")?
.filter_map(Result::ok)
.find(|entry| entry.path().extension().map_or(false, |ext| ext == "gpkg"))
.ok_or_else(|| anyhow::anyhow!("No .gpkg file found in config directory"))?
.path();
Ok(Config {
config_dir,
csv_dir,
gpkg_file,
internal_timestep_seconds: args.internal_timestep_seconds,
output_dir,
kernel: args.kernel,
})
}