use std::{env, error::Error, fs::File, io::BufReader, path::Path};
fn main() -> Result<(), Box<dyn Error>> {
let mut args = env::args().skip(1);
if let (Some(file_path), Some(index), Some(subindex)) = (args.next(), args.next(), args.next())
{
let index: (usize, usize) = (index.parse()?, subindex.parse()?);
decode_layer(file_path, index)
} else {
panic!("Usage: decode_layer <path> <index>");
}
}
fn decode_layer<P>(path: P, message_index: (usize, usize)) -> Result<(), Box<dyn Error>>
where
P: AsRef<Path>,
{
let f = File::open(path)?;
let f = BufReader::new(f);
let grib2 = grib::from_reader(f)?;
let (_index, submessage) = grib2
.iter()
.find(|(index, _)| *index == message_index)
.ok_or("no such index")?;
let latlons = submessage.latlons()?;
let decoder = grib::Grib2SubmessageDecoder::from(submessage)?;
let values = decoder.dispatch()?;
for ((lat, lon), value) in latlons.zip(values) {
println!("{lat} {lon} {value}");
}
Ok(())
}