use core::fmt::Display;
#[derive(Debug, Clone, PartialEq)]
pub enum Error {
InvalidAngle(f64, f64),
InvalidLatitudeDegrees(i32),
InvalidLongitudeDegrees(i32),
InvalidMinutes(u32),
InvalidSeconds(f32),
InvalidCharacter(char, String),
InvalidWhitespace(String),
InvalidNumericFormat(String),
InvalidNumericValue(f64),
InvalidCoordinate,
#[cfg(feature = "urn")]
InvalidUrnScheme,
}
impl Display for Error {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Error::InvalidAngle(v, limit) => write!(
f,
"Invalid value `{v}` for angle; expecting `-{limit}..={limit}`."
),
Error::InvalidLatitudeDegrees(v) => write!(
f,
"Invalid value `{v}` for latitude degrees; expecting `-90..=90`."
),
Error::InvalidLongitudeDegrees(v) => write!(
f,
"Invalid value `{v}` for longitude degrees; expecting `-180..=180`."
),
Error::InvalidMinutes(v) => {
write!(f, "Invalid value `{v}` for minutes; expecting `0..60`.")
}
Error::InvalidSeconds(v) => {
write!(f, "Invalid value `{v}` for seconds; expecting `0.0..60.0`.")
}
Error::InvalidCharacter(c, s) => {
write!(f, "Invalid character `{c}` parsing value `\"{s}\"`.")
}
Error::InvalidWhitespace(s) => {
write!(f, "Invalid whitespace parsing value `\"{s}\"`.")
}
Error::InvalidNumericFormat(s) => {
write!(f, "Invalid numeric format parsing value `\"{s}\"`.")
}
Error::InvalidCoordinate => {
write!(
f,
"Invalid `Latitude` and `Longitude` pair constructing `Coordinate`."
)
}
#[cfg(feature = "url")]
Error::InvalidUrnScheme => write!(f, "URI scheme must be `geo:`."),
Error::InvalidNumericValue(v) => write!(f, "Invalid floating point value, `{v}`"),
}
}
}
impl std::error::Error for Error {}