use std::fmt;
use crate::ephemeris::SpkError;
#[derive(Debug, Clone, PartialEq)]
#[non_exhaustive]
pub enum EngineError {
OutOfRange {
jd: f64,
coverage: Option<(f64, f64)>,
},
Ephemeris(SpkError),
InvalidInput(String),
}
impl EngineError {
pub fn code(&self) -> &'static str {
match self {
EngineError::OutOfRange { .. } => "ephemeris_out_of_range",
EngineError::Ephemeris(_) => "ephemeris_error",
EngineError::InvalidInput(_) => "invalid_input",
}
}
}
impl fmt::Display for EngineError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
EngineError::OutOfRange {
jd,
coverage: Some((start, end)),
} => write!(
f,
"JD {jd:.1} is outside the loaded ephemeris coverage (JD {start:.1} to {end:.1})"
),
EngineError::OutOfRange { jd, coverage: None } => {
write!(f, "JD {jd:.1} cannot be computed: no ephemeris loaded")
}
EngineError::Ephemeris(err) => write!(f, "{err}"),
EngineError::InvalidInput(msg) => write!(f, "invalid input: {msg}"),
}
}
}
impl std::error::Error for EngineError {}
impl From<SpkError> for EngineError {
fn from(err: SpkError) -> Self {
EngineError::Ephemeris(err)
}
}