use std::fmt::Display;
use crate::geometry::Geometry;
use super::ValidationConfig;
pub trait ValidationCheck<T>: Sized {
fn check(
object: &T,
geometry: &Geometry,
config: &ValidationConfig,
) -> impl Iterator<Item = Self>;
fn check_and_return_first_error(
object: &T,
geometry: &Geometry,
) -> Result<(), Self> {
let config = ValidationConfig::default();
let mut errors = Self::check(object, geometry, &config);
if let Some(err) = errors.next() {
return Err(err);
}
Ok(())
}
fn check_and_expect_one_error(object: &T, geometry: &Geometry) -> Self
where
Self: Display,
{
let config = ValidationConfig::default();
let mut errors = Self::check(object, geometry, &config).peekable();
let err = errors
.next()
.expect("Expected one validation error; none found");
if errors.peek().is_some() {
println!("Unexpected validation errors:");
for err in errors {
println!("{err}");
}
panic!("Expected only one validation error")
}
err
}
}