mirror of
https://github.com/hannobraun/Fornjot
synced 2025-05-06 02:48:27 +00:00
Move error variants to ValidationError
This makes it possible to further simplify `ObjectNotExclusivelyOwned` in a next step.
This commit is contained in:
parent
11857d16d8
commit
4ea6aec162
@ -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)]
|
||||||
|
@ -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(())
|
||||||
|
@ -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);
|
||||||
|
@ -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")]
|
||||||
|
Loading…
Reference in New Issue
Block a user