use clap::Parser;
use rasterfakers::geotiff::{FakeGeoTiff, FakeGeoTiffConfig};
use std::error::Error;
#[derive(Parser)]
#[command(name = "RasterFakers")]
#[command(version = "0.1.0")]
#[command(about = "Generates fake GeoTIFF files", long_about = None)]
struct CliArgs {
#[arg(short = 'o', long)]
output: String,
#[arg(short = 'w', long, default_value_t = 256)]
width: usize,
#[arg(short = 'e', long, default_value_t = 256)]
height: usize,
#[arg(short = 'b', long, default_value_t = 1)]
bands: usize,
#[arg(short = 't', long, default_value = "f64")]
data_type: String,
#[arg(short = 'p', long, default_value = "EPSG:4326")]
projection: String,
#[arg(short = 'r', long, default_value = "1.0,1.0")]
pixel_resolution: String,
#[arg(short = 'c', long, default_value = "0.0,0.0")]
upper_left_corner: String,
}
fn main() -> Result<(), Box<dyn Error>> {
let args = CliArgs::parse();
let pixel_resolution = parse_tuple(&args.pixel_resolution)?;
let upper_left_corner = parse_tuple(&args.upper_left_corner)?;
let config = FakeGeoTiffConfig {
width: args.width,
height: args.height,
bands: args.bands,
projection: Some(args.projection),
pixel_resolution: Some(pixel_resolution),
upper_left_corner: Some(upper_left_corner),
output_path: Some(args.output.clone()),
..Default::default()
};
match args.data_type.as_str() {
"u8" => {
FakeGeoTiff::<u8>::from_config(config).write_to_file()?;
}
"u16" => {
FakeGeoTiff::<u16>::from_config(config).write_to_file()?;
}
"i16" => {
FakeGeoTiff::<i16>::from_config(config).write_to_file()?;
}
"u32" => {
FakeGeoTiff::<u32>::from_config(config).write_to_file()?;
}
"i32" => {
FakeGeoTiff::<i32>::from_config(config).write_to_file()?;
}
"f32" => {
FakeGeoTiff::<f32>::from_config(config).write_to_file()?;
}
"f64" => {
FakeGeoTiff::<f64>::from_config(config).write_to_file()?;
}
_ => {
eprintln!("Unsupported data type: {}", args.data_type);
std::process::exit(1);
}
}
println!("GeoTIFF generated successfully at {}", args.output);
Ok(())
}
fn parse_tuple(s: &str) -> Result<(f64, f64), Box<dyn Error>> {
let parts: Vec<&str> = s.split(',').collect();
if parts.len() != 2 {
return Err(format!("Expected two comma-separated values, got '{}'", s).into());
}
let first = parts[0].trim().parse::<f64>()?;
let second = parts[1].trim().parse::<f64>()?;
Ok((first, second))
}