use core::fmt;
#[derive(Debug)]
#[non_exhaustive]
pub enum PrincipiaError {
DegenerateGeometry {
reason: &'static str,
},
InvalidStepRequest {
reason: &'static str,
},
StepControlFailed {
reason: &'static str,
},
StepBelowMinimum {
reason: &'static str,
},
GravityCoefficientUnavailable {
degree: u16,
order: u16,
},
GeopotentialDegreeOutOfRange {
requested: usize,
max: usize,
},
PartialsUnavailable {
model: &'static str,
},
PropagationFailed {
reason: &'static str,
},
ContextDataUnavailable {
what: &'static str,
},
}
impl fmt::Display for PrincipiaError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::DegenerateGeometry { reason } => {
write!(f, "degenerate geometry: {reason}")
}
Self::InvalidStepRequest { reason } => {
write!(f, "invalid step request: {reason}")
}
Self::StepControlFailed { reason } => {
write!(f, "step controller failed: {reason}")
}
Self::StepBelowMinimum { reason } => {
write!(f, "step below minimum: {reason}")
}
Self::GravityCoefficientUnavailable { degree, order } => {
write!(
f,
"gravity coefficient C_{degree},{order} not available in current model"
)
}
Self::GeopotentialDegreeOutOfRange { requested, max } => {
write!(
f,
"requested geopotential degree {requested} exceeds provider maximum {max}"
)
}
Self::PartialsUnavailable { model } => {
write!(f, "analytic partials not available for model '{model}'")
}
Self::PropagationFailed { reason } => {
write!(f, "propagation failed: {reason}")
}
Self::ContextDataUnavailable { what } => {
write!(f, "context data unavailable: {what}")
}
}
}
}
impl core::error::Error for PrincipiaError {}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn display_examples() {
assert!(PrincipiaError::DegenerateGeometry { reason: "r=0" }
.to_string()
.contains("r=0"));
assert!(PrincipiaError::InvalidStepRequest { reason: "h<=0" }
.to_string()
.contains("h<=0"));
assert!(PrincipiaError::GravityCoefficientUnavailable {
degree: 8,
order: 3
}
.to_string()
.contains("C_8,3"));
assert!(PrincipiaError::GeopotentialDegreeOutOfRange {
requested: 70,
max: 21
}
.to_string()
.contains("70"));
assert!(PrincipiaError::PartialsUnavailable { model: "drag" }
.to_string()
.contains("drag"));
assert!(PrincipiaError::PropagationFailed { reason: "NaN" }
.to_string()
.contains("NaN"));
assert!(PrincipiaError::ContextDataUnavailable { what: "ephemeris" }
.to_string()
.contains("ephemeris"));
}
#[test]
fn step_control_failed_display() {
assert!(PrincipiaError::StepControlFailed {
reason: "too many iters"
}
.to_string()
.contains("too many iters"));
}
#[test]
fn step_below_minimum_display() {
assert!(PrincipiaError::StepBelowMinimum {
reason: "h_min breached"
}
.to_string()
.contains("h_min breached"));
}
}