use std::fmt;
use std::io;
pub type Result<T> = std::result::Result<T, RasterError>;
#[derive(Debug)]
pub enum RasterError {
Io(io::Error),
UnknownFormat(String),
MissingField(String),
ParseError {
field: String,
value: String,
expected: String,
},
InvalidDimensions {
cols: usize,
rows: usize,
},
OutOfBounds {
band: isize,
col: isize,
row: isize,
bands: usize,
cols: usize,
rows: usize,
},
UnsupportedDataType(String),
CorruptData(String),
Other(String),
}
impl fmt::Display for RasterError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
RasterError::Io(e) => write!(f, "I/O error: {e}"),
RasterError::UnknownFormat(s) => write!(f, "unknown raster format: {s}"),
RasterError::MissingField(s) => write!(f, "missing required header field: {s}"),
RasterError::ParseError { field, value, expected } => {
write!(f, "parse error in field '{field}': got '{value}', expected {expected}")
}
RasterError::InvalidDimensions { cols, rows } => {
write!(f, "invalid dimensions: {cols}×{rows}")
}
RasterError::OutOfBounds { band, col, row, bands, cols, rows } => {
write!(f, "pixel ({band},{col},{row}) is out of bounds ({bands}×{cols}×{rows})")
}
RasterError::UnsupportedDataType(s) => {
write!(f, "data type not supported by this format: {s}")
}
RasterError::CorruptData(s) => write!(f, "corrupt data: {s}"),
RasterError::Other(s) => write!(f, "{s}"),
}
}
}
impl std::error::Error for RasterError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match self {
RasterError::Io(e) => Some(e),
_ => None,
}
}
}
impl From<io::Error> for RasterError {
fn from(e: io::Error) -> Self {
RasterError::Io(e)
}
}
impl From<std::num::ParseIntError> for RasterError {
fn from(e: std::num::ParseIntError) -> Self {
RasterError::Other(format!("integer parse error: {e}"))
}
}
impl From<std::num::ParseFloatError> for RasterError {
fn from(e: std::num::ParseFloatError) -> Self {
RasterError::Other(format!("float parse error: {e}"))
}
}