From 6dbe9b6bdb291d05b5ca510ae9dcb736fd3d5957 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Mon, 6 Nov 2023 14:31:22 -0500 Subject: [PATCH] Added `{Display|FromStr} for ResampleAlg` and `ResampleAlg::iter`. --- CHANGES.md | 4 +++ src/raster/rasterband.rs | 53 ++++++++++++++++++++++++++++++++++++++-- src/raster/tests.rs | 13 ++++++++++ 3 files changed, 68 insertions(+), 2 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 5ed4d013a..1e0567303 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,6 +2,10 @@ ## Unreleased +- Added `{Display|FromStr} for ResampleAlg` and `ResampleAlg::iter`. + + - + - **Breaking**: Replaced `TryFrom<&[(&str, &str); N]> for CslStringList` with `impl FromIterator for CslStringList`, `impl FromIterator for CslStringList` and `impl<'a> FromIterator<&'a str> for CslStringList` - Added `Extend for CslStringList`, and `CslStringList::merge` diff --git a/src/raster/rasterband.rs b/src/raster/rasterband.rs index f35fb6720..dbb540df0 100644 --- a/src/raster/rasterband.rs +++ b/src/raster/rasterband.rs @@ -11,13 +11,17 @@ use gdal_sys::{ }; use libc::c_int; use std::ffi::CString; -use std::fmt::{Debug, Formatter}; +use std::fmt::{Debug, Display, Formatter}; use std::marker::PhantomData; +use std::str::FromStr; #[cfg(feature = "ndarray")] use ndarray::Array2; use crate::errors::*; +use crate::raster::ResampleAlg::{ + Average, Bilinear, Cubic, CubicSpline, Gauss, Lanczos, Mode, NearestNeighbour, +}; /// [Dataset] methods for raster datasets. impl Dataset { @@ -106,7 +110,7 @@ impl Dataset { /// # Ok(()) /// # } /// ``` -#[derive(Debug, Copy, Clone)] +#[derive(Debug, Copy, Clone, PartialEq)] #[repr(u32)] pub enum ResampleAlg { /// Nearest neighbour @@ -132,6 +136,51 @@ impl ResampleAlg { pub fn to_gdal(&self) -> GDALRIOResampleAlg::Type { *self as GDALRIOResampleAlg::Type } + + /// Get an iterator over all the valid enumeration values. + pub fn iter() -> impl Iterator { + use ResampleAlg::*; + [ + NearestNeighbour, + Bilinear, + Cubic, + CubicSpline, + Lanczos, + Average, + Mode, + Gauss, + ] + .into_iter() + } +} + +impl Display for ResampleAlg { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + // Display format is the same as debug format. + Debug::fmt(self, f) + } +} + +impl FromStr for ResampleAlg { + type Err = GdalError; + + fn from_str(s: &str) -> std::result::Result { + match s.to_lowercase().as_str() { + "nearestneighbour" => Ok(NearestNeighbour), + "bilinear" => Ok(Bilinear), + "cubic" => Ok(Cubic), + "cubicspline" => Ok(CubicSpline), + "lanczos" => Ok(Lanczos), + "average" => Ok(Average), + "mode" => Ok(Mode), + "gauss" => Ok(Gauss), + o => Err(GdalError::BadArgument(format!( + "'{}' does not match one of {:?}", + o, + Self::iter().map(|e| e.to_string()).collect::>() + ))), + } + } } /// Wrapper type for gdal mask flags. diff --git a/src/raster/tests.rs b/src/raster/tests.rs index 3d4f20f20..3c97665ad 100644 --- a/src/raster/tests.rs +++ b/src/raster/tests.rs @@ -9,6 +9,7 @@ use crate::test_utils::{fixture, TempFixture}; use crate::vsi::unlink_mem_file; use crate::DriverManager; use std::path::Path; +use std::str::FromStr; #[cfg(feature = "ndarray")] use ndarray::arr2; @@ -749,3 +750,15 @@ fn test_raster_stats() { } ); } + +#[test] +fn test_resample_str() { + assert!(ResampleAlg::from_str("foobar").is_err()); + + for e in ResampleAlg::iter() { + let stringed = e.to_string(); + let parsed = ResampleAlg::from_str(&stringed); + assert!(parsed.is_ok(), "{stringed}"); + assert_eq!(parsed.unwrap(), e, "{stringed}"); + } +}