use std::{convert::Infallible, fmt};
use crate::validate::{
EdgeValidationError, FaceValidationError, ShellValidationError,
SketchValidationError, SolidValidationError,
};
use super::checks::{AdjacentHalfEdgesNotConnected, FaceHasNoBoundary};
#[derive(Clone, Debug, thiserror::Error)]
pub enum ValidationError {
#[error(transparent)]
AdjacentHalfEdgesNotConnected(#[from] AdjacentHalfEdgesNotConnected),
#[error(transparent)]
FaceHasNoBoundary(#[from] FaceHasNoBoundary),
#[error("`Edge` validation error")]
Edge(#[from] EdgeValidationError),
#[error("`Face` validation error")]
Face(#[from] FaceValidationError),
#[error("`Shell` validation error")]
Shell(#[from] ShellValidationError),
#[error("`Solid` validation error")]
Solid(#[from] SolidValidationError),
#[error("`Sketch` validation error")]
Sketch(#[from] SketchValidationError),
}
impl From<Infallible> for ValidationError {
fn from(infallible: Infallible) -> Self {
match infallible {}
}
}
#[derive(Debug, thiserror::Error)]
pub struct ValidationErrors(pub Vec<ValidationError>);
impl fmt::Display for ValidationErrors {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let num_errors = self.0.len();
writeln!(f, "{num_errors} unhandled validation errors:")?;
for err in &self.0 {
writeln!(f, "{err}")?;
}
Ok(())
}
}