fj_core/validation/
error.rs

1use std::{convert::Infallible, fmt};
2
3use crate::validate::{
4    EdgeValidationError, FaceValidationError, ShellValidationError,
5    SketchValidationError, SolidValidationError,
6};
7
8use super::checks::{AdjacentHalfEdgesNotConnected, FaceHasNoBoundary};
9
10/// An error that can occur during a validation
11#[derive(Clone, Debug, thiserror::Error)]
12pub enum ValidationError {
13    /// Adjacent half-edges are not connected
14    #[error(transparent)]
15    AdjacentHalfEdgesNotConnected(#[from] AdjacentHalfEdgesNotConnected),
16
17    /// Face has no boundary
18    #[error(transparent)]
19    FaceHasNoBoundary(#[from] FaceHasNoBoundary),
20
21    /// `Edge` validation error
22    #[error("`Edge` validation error")]
23    Edge(#[from] EdgeValidationError),
24
25    /// `Face` validation error
26    #[error("`Face` validation error")]
27    Face(#[from] FaceValidationError),
28
29    /// `Shell` validation error
30    #[error("`Shell` validation error")]
31    Shell(#[from] ShellValidationError),
32
33    /// `Solid` validation error
34    #[error("`Solid` validation error")]
35    Solid(#[from] SolidValidationError),
36
37    /// `Sketch` validation error
38    #[error("`Sketch` validation error")]
39    Sketch(#[from] SketchValidationError),
40}
41
42impl From<Infallible> for ValidationError {
43    fn from(infallible: Infallible) -> Self {
44        match infallible {}
45    }
46}
47
48/// A collection of validation errors
49#[derive(Debug, thiserror::Error)]
50pub struct ValidationErrors(pub Vec<ValidationError>);
51
52impl fmt::Display for ValidationErrors {
53    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
54        let num_errors = self.0.len();
55
56        writeln!(f, "{num_errors} unhandled validation errors:")?;
57
58        for err in &self.0 {
59            writeln!(f, "{err}")?;
60        }
61
62        Ok(())
63    }
64}