mod coord;
mod geometry;
mod geometry_collection;
mod line;
mod line_string;
mod multi_line_string;
mod multi_point;
mod multi_polygon;
mod point;
mod polygon;
mod rect;
#[cfg(test)]
mod tests;
mod triangle;
mod utils;
pub use geometry::InvalidGeometry;
pub use geometry_collection::InvalidGeometryCollection;
pub use line::InvalidLine;
pub use line_string::InvalidLineString;
pub use multi_line_string::InvalidMultiLineString;
pub use multi_point::InvalidMultiPoint;
pub use multi_polygon::InvalidMultiPolygon;
pub use point::InvalidPoint;
pub use polygon::InvalidPolygon;
pub use rect::InvalidRect;
pub use triangle::InvalidTriangle;
use std::boxed::Box;
use std::fmt;
pub trait Validation {
type Error: std::error::Error;
fn is_valid(&self) -> bool {
self.check_validation().is_ok()
}
fn validation_errors(&self) -> Vec<Self::Error> {
let mut validation_errors = Vec::new();
self.visit_validation(Box::new(|problem| {
validation_errors.push(problem);
Ok::<(), Self::Error>(())
}))
.expect("no errors are returned");
validation_errors
}
fn check_validation(&self) -> Result<(), Self::Error> {
self.visit_validation(Box::new(Err))
}
fn visit_validation<T>(
&self,
handle_validation_error: Box<dyn FnMut(Self::Error) -> Result<(), T> + '_>,
) -> Result<(), T>;
}
#[derive(Debug, PartialEq, Clone, Copy)]
pub enum RingRole {
Exterior,
Interior(usize),
}
impl fmt::Display for RingRole {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
RingRole::Exterior => write!(f, "exterior ring"),
RingRole::Interior(idx) => write!(f, "interior ring at index {idx}"),
}
}
}
#[derive(Debug, PartialEq, Clone)]
pub struct GeometryIndex(pub usize);
#[derive(Debug, PartialEq, Eq, Clone)]
pub struct CoordIndex(pub usize);
#[cfg(test)]
pub(crate) use test_macros::*;
#[cfg(test)]
mod test_macros {
macro_rules! assert_valid {
($to_validate:expr) => {
assert!(
$to_validate.is_valid(),
"Validation errors: {:?}",
$to_validate.validation_errors()
);
};
}
pub(crate) use assert_valid;
macro_rules! assert_validation_errors {
($to_validate:expr, $errors:expr) => {
assert!(!$to_validate.is_valid());
assert!(
!$errors.is_empty(),
"Use `assert_valid!` instead to verify there are no errors."
);
assert_eq!($errors, $to_validate.validation_errors());
};
}
pub(crate) use assert_validation_errors;
}