use clap::{Args, Parser, Subcommand, ValueEnum};
use std::path::PathBuf;
#[derive(Parser, Debug)]
#[command(
name = "geoenrich",
version,
about = "Enrich longitude/latitude points with geospatial attributes"
)]
pub struct Cli {
#[command(subcommand)]
pub command: Commands,
}
#[derive(Subcommand, Debug)]
pub enum Commands {
Coast(CoastArgs),
Depth(DepthArgs),
Sea(SeaArgs),
Place(PlaceArgs),
Nearest(NearestArgs),
}
#[derive(ValueEnum, Clone, Copy, Debug, PartialEq, Eq)]
pub enum Format {
Auto,
Parquet,
Csv,
Tsv,
#[value(name = "csv.gz")]
CsvGz,
#[value(name = "tsv.gz")]
TsvGz,
}
#[derive(ValueEnum, Clone, Copy, Debug, PartialEq, Eq)]
pub enum DistUnit {
Km,
M,
}
#[derive(Args, Debug)]
pub struct CommonArgs {
pub input: PathBuf,
#[arg(short, long)]
pub output: Option<PathBuf>,
#[arg(short = 'c', long)]
pub config: Option<PathBuf>,
#[arg(long, value_enum, default_value_t = Format::Auto)]
pub in_format: Format,
#[arg(long, value_enum, default_value_t = Format::Auto)]
pub out_format: Format,
#[arg(long)]
pub overwrite: bool,
#[arg(long, default_value = "longitude")]
pub lon_col: String,
#[arg(long, default_value = "latitude")]
pub lat_col: String,
#[arg(long, default_value_t = 3)]
pub decimals: u32,
#[arg(short = 't', long)]
pub threads: Option<usize>,
}
#[derive(Args, Debug)]
pub struct RegionArgs {
#[arg(long)]
pub region: Option<String>,
#[arg(long, allow_hyphen_values = true)]
pub min_lon: Option<f64>,
#[arg(long, allow_hyphen_values = true)]
pub max_lon: Option<f64>,
#[arg(long, allow_hyphen_values = true)]
pub min_lat: Option<f64>,
#[arg(long, allow_hyphen_values = true)]
pub max_lat: Option<f64>,
#[arg(long, allow_hyphen_values = true)]
pub proj_lon0: Option<f64>,
#[arg(long, allow_hyphen_values = true)]
pub proj_lat0: Option<f64>,
}
#[derive(Args, Debug)]
pub struct CoastArgs {
#[command(flatten)]
pub common: CommonArgs,
#[command(flatten)]
pub region: RegionArgs,
#[arg(long)]
pub data: Option<PathBuf>,
#[arg(long, value_enum, default_value_t = DistUnit::Km)]
pub unit: DistUnit,
#[arg(long, default_value = "dist_to_coast")]
pub column: String,
}
#[derive(Args, Debug)]
pub struct DepthArgs {
#[command(flatten)]
pub common: CommonArgs,
#[arg(long)]
pub data: Option<PathBuf>,
#[arg(long)]
pub positive: bool,
#[arg(long, default_value = "bathymetry")]
pub column: String,
}
#[derive(Args, Debug)]
pub struct SeaArgs {
#[command(flatten)]
pub common: CommonArgs,
#[command(flatten)]
pub region: RegionArgs,
#[arg(long)]
pub data: Option<PathBuf>,
#[arg(long, default_value = "NAME")]
pub name_field: String,
#[arg(long, default_value = "sea_name")]
pub column: String,
}
#[derive(Args, Debug)]
pub struct PlaceArgs {
#[command(flatten)]
pub common: CommonArgs,
#[command(flatten)]
pub region: RegionArgs,
#[arg(long)]
pub countries: Option<PathBuf>,
#[arg(long)]
pub municipalities: Option<PathBuf>,
}
#[derive(Args, Debug)]
pub struct NearestArgs {
#[command(flatten)]
pub common: CommonArgs,
#[arg(long)]
pub to: PathBuf,
#[arg(long, value_enum, default_value_t = Format::Auto)]
pub to_format: Format,
#[arg(long, default_value = "longitude")]
pub to_lon_col: String,
#[arg(long, default_value = "latitude")]
pub to_lat_col: String,
#[arg(long, default_value = "name")]
pub name_field: String,
#[arg(long, value_enum, default_value_t = DistUnit::Km)]
pub unit: DistUnit,
#[arg(long, default_value = "nearest_name")]
pub name_column: String,
#[arg(long, default_value = "nearest_dist")]
pub dist_column: String,
}