Move error variants to ValidationError

This makes it possible to further simplify `ObjectNotExclusivelyOwned`
in a next step.
This commit is contained in:
Hanno Braun 2024-05-24 22:22:15 +02:00
parent 11857d16d8
commit 4ea6aec162
4 changed files with 33 additions and 74 deletions

View File

@ -1,9 +1,6 @@
use std::{any::type_name_of_val, collections::HashMap, fmt}; use std::{any::type_name_of_val, collections::HashMap, fmt};
use crate::{ use crate::storage::Handle;
storage::Handle,
topology::{Cycle, Face, HalfEdge, Region, Shell},
};
#[derive(Default)] #[derive(Default)]
pub struct ReferenceCounter<T, U>(HashMap<Handle<T>, Vec<Handle<U>>>); pub struct ReferenceCounter<T, U>(HashMap<Handle<T>, Vec<Handle<U>>>);
@ -35,7 +32,7 @@ macro_rules! validate_references {
($errors:ident, $error_ty:ty;$($counter:ident, $err:ident;)*) => { ($errors:ident, $error_ty:ty;$($counter:ident, $err:ident;)*) => {
$( $(
$counter.find_multiples().iter().for_each(|multiple| { $counter.find_multiples().iter().for_each(|multiple| {
let reference_error = ObjectNotExclusivelyOwned::$err { references: multiple.clone() }; let reference_error = ValidationError::$err(ObjectNotExclusivelyOwned{ references: multiple.clone() });
$errors.push(reference_error.into()); $errors.push(reference_error.into());
}); });
)* )*
@ -48,34 +45,10 @@ macro_rules! validate_references {
/// that only one reference to these objects must exist within the topological /// that only one reference to these objects must exist within the topological
/// object graph. /// object graph.
#[derive(Clone, Debug, thiserror::Error)] #[derive(Clone, Debug, thiserror::Error)]
pub enum ObjectNotExclusivelyOwned { #[error(transparent)]
/// Multiple references to [`Region`] pub struct ObjectNotExclusivelyOwned<T, U> {
#[error(transparent)] /// The invalid references
MultipleReferencesToRegion { pub references: MultipleReferences<T, U>,
/// The invalid references
references: MultipleReferences<Region, Face>,
},
/// Multiple references to [`Face`]
#[error(transparent)]
MultipleReferencesToFace {
/// The invalid references
references: MultipleReferences<Face, Shell>,
},
/// Multiple references to [`HalfEdge`]
#[error(transparent)]
MultipleReferencesToHalfEdge {
/// The invalid references
references: MultipleReferences<HalfEdge, Cycle>,
},
/// Multiple references to [`Cycle`]
#[error(transparent)]
MultipleReferencesToCycle {
/// The invalid references
references: MultipleReferences<Cycle, Region>,
},
} }
#[derive(Clone, Debug, thiserror::Error)] #[derive(Clone, Debug, thiserror::Error)]

View File

@ -131,10 +131,7 @@ mod tests {
build::BuildHalfEdge, build::BuildRegion, insert::Insert, build::BuildHalfEdge, build::BuildRegion, insert::Insert,
}, },
topology::{Cycle, HalfEdge, Region, Sketch, Vertex}, topology::{Cycle, HalfEdge, Region, Sketch, Vertex},
validate::{ validate::{SketchValidationError, Validate, ValidationError},
references::ObjectNotExclusivelyOwned, SketchValidationError,
Validate, ValidationError,
},
Core, Core,
}; };
@ -166,11 +163,7 @@ mod tests {
assert_contains_err!( assert_contains_err!(
core, core,
invalid_sketch, invalid_sketch,
ValidationError::ObjectNotExclusivelyOwned( ValidationError::MultipleReferencesToCycle(_)
ObjectNotExclusivelyOwned::MultipleReferencesToCycle {
references: _
}
)
); );
Ok(()) Ok(())
@ -206,11 +199,7 @@ mod tests {
assert_contains_err!( assert_contains_err!(
core, core,
invalid_sketch, invalid_sketch,
ValidationError::ObjectNotExclusivelyOwned( ValidationError::MultipleReferencesToHalfEdge(_)
ObjectNotExclusivelyOwned::MultipleReferencesToHalfEdge {
references: _
}
)
); );
Ok(()) Ok(())

View File

@ -183,9 +183,7 @@ mod tests {
insert::Insert, insert::Insert,
}, },
topology::{Cycle, Face, HalfEdge, Region, Shell, Solid, Surface}, topology::{Cycle, Face, HalfEdge, Region, Shell, Solid, Surface},
validate::{ validate::{Validate, ValidationError},
references::ObjectNotExclusivelyOwned, Validate, ValidationError,
},
Core, Core,
}; };
@ -233,11 +231,7 @@ mod tests {
assert_contains_err!( assert_contains_err!(
core, core,
invalid_solid, invalid_solid,
ValidationError::ObjectNotExclusivelyOwned( ValidationError::MultipleReferencesToFace(_)
ObjectNotExclusivelyOwned::MultipleReferencesToFace {
references: _
}
)
); );
let valid_solid = Solid::new(vec![]).insert(&mut core); let valid_solid = Solid::new(vec![]).insert(&mut core);
@ -281,11 +275,7 @@ mod tests {
assert_contains_err!( assert_contains_err!(
core, core,
invalid_solid, invalid_solid,
ValidationError::ObjectNotExclusivelyOwned( ValidationError::MultipleReferencesToRegion(_)
ObjectNotExclusivelyOwned::MultipleReferencesToRegion {
references: _
}
)
); );
let valid_solid = Solid::new(vec![]).insert(&mut core); let valid_solid = Solid::new(vec![]).insert(&mut core);
@ -333,11 +323,7 @@ mod tests {
assert_contains_err!( assert_contains_err!(
core, core,
invalid_solid, invalid_solid,
ValidationError::ObjectNotExclusivelyOwned( ValidationError::MultipleReferencesToCycle(_)
ObjectNotExclusivelyOwned::MultipleReferencesToCycle {
references: _
}
)
); );
let valid_solid = Solid::new(vec![]).insert(&mut core); let valid_solid = Solid::new(vec![]).insert(&mut core);
@ -377,11 +363,7 @@ mod tests {
assert_contains_err!( assert_contains_err!(
core, core,
invalid_solid, invalid_solid,
ValidationError::ObjectNotExclusivelyOwned( ValidationError::MultipleReferencesToHalfEdge(_)
ObjectNotExclusivelyOwned::MultipleReferencesToHalfEdge {
references: _
}
)
); );
let valid_solid = Solid::new(vec![]).insert(&mut core); let valid_solid = Solid::new(vec![]).insert(&mut core);

View File

@ -1,7 +1,10 @@
use std::{convert::Infallible, fmt}; use std::{convert::Infallible, fmt};
use crate::validate::{ use crate::{
ObjectNotExclusivelyOwned, SketchValidationError, SolidValidationError, topology::{Cycle, Face, HalfEdge, Region, Shell},
validate::{
ObjectNotExclusivelyOwned, SketchValidationError, SolidValidationError,
},
}; };
use super::checks::{ use super::checks::{
@ -39,9 +42,21 @@ pub enum ValidationError {
#[error(transparent)] #[error(transparent)]
InteriorCycleHasInvalidWinding(#[from] InteriorCycleHasInvalidWinding), InteriorCycleHasInvalidWinding(#[from] InteriorCycleHasInvalidWinding),
/// An object that should be exclusively owned by another, is not /// Multiple references to [`Cycle`]
#[error(transparent)] #[error(transparent)]
ObjectNotExclusivelyOwned(#[from] ObjectNotExclusivelyOwned), MultipleReferencesToCycle(ObjectNotExclusivelyOwned<Cycle, Region>),
/// Multiple references to [`Face`]
#[error(transparent)]
MultipleReferencesToFace(ObjectNotExclusivelyOwned<Face, Shell>),
/// Multiple references to [`HalfEdge`]
#[error(transparent)]
MultipleReferencesToHalfEdge(ObjectNotExclusivelyOwned<HalfEdge, Cycle>),
/// Multiple references to [`Region`]
#[error(transparent)]
MultipleReferencesToRegion(ObjectNotExclusivelyOwned<Region, Face>),
/// `Solid` validation error /// `Solid` validation error
#[error("`Solid` validation error")] #[error("`Solid` validation error")]