use std::fmt;
pub type CurveResult<T> = Result<T, CurveError>;
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum CurveError {
ZeroLengthLine,
ZeroRadiusArc,
ZeroRationalBezierWeight,
RadiusMismatch,
AmbiguousBulge,
InsufficientVertices,
EmptyCurveString,
DisconnectedCurveString,
AmbiguousCurveStringConnection,
InvalidReconstructionOptions,
InvalidFlatteningOptions,
InvalidFiniteProjectionOptions,
InvalidSimilarityTransform,
InvalidBezierParameter,
InvalidBezierRange,
InvalidBezierArcLengthTarget,
NonFiniteReconstructionPoint,
NonFiniteProjectionPoint,
Topology(String),
Real(String),
}
impl fmt::Display for CurveError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::ZeroLengthLine => write!(f, "line segment has zero length"),
Self::ZeroRadiusArc => write!(f, "circular arc has zero radius"),
Self::ZeroRationalBezierWeight => {
write!(f, "rational Bezier weight is structurally zero")
}
Self::RadiusMismatch => write!(f, "arc endpoints do not share the supplied radius"),
Self::AmbiguousBulge => write!(f, "bulge sign or zero status is ambiguous"),
Self::InsufficientVertices => write!(f, "curve string has insufficient vertices"),
Self::EmptyCurveString => write!(f, "curve string has no segments"),
Self::DisconnectedCurveString => write!(f, "curve string segments are disconnected"),
Self::AmbiguousCurveStringConnection => {
write!(f, "curve string segment connectivity is ambiguous")
}
Self::InvalidReconstructionOptions => {
write!(f, "polyline reconstruction options are invalid")
}
Self::InvalidFlatteningOptions => write!(f, "Bezier flattening options are invalid"),
Self::InvalidFiniteProjectionOptions => {
write!(f, "finite projection options are invalid")
}
Self::InvalidSimilarityTransform => {
write!(f, "affine transform is not a planar similarity")
}
Self::InvalidBezierParameter => {
write!(f, "Bezier parameter is outside the closed unit interval")
}
Self::InvalidBezierRange => write!(f, "Bezier segment range is invalid"),
Self::InvalidBezierArcLengthTarget => {
write!(
f,
"Bezier arc-length target is outside the certified length range"
)
}
Self::NonFiniteReconstructionPoint => {
write!(f, "polyline reconstruction point is not finite")
}
Self::NonFiniteProjectionPoint => write!(f, "finite projection point is not finite"),
Self::Topology(message) => write!(f, "topology operation failed: {message}"),
Self::Real(message) => write!(f, "Real operation failed: {message}"),
}
}
}
impl std::error::Error for CurveError {}
impl From<hyperreal::Problem> for CurveError {
fn from(value: hyperreal::Problem) -> Self {
Self::Real(value.to_string())
}
}