pleiades_eclipse/
error.rs1use core::fmt;
4
5pub const WINDOW_START_JD: f64 = 2_415_020.5;
7pub const WINDOW_END_JD: f64 = 2_488_069.5;
11
12#[derive(Clone, Debug, PartialEq)]
14pub enum EclipseError {
15 OutOfWindow {
17 julian_day: f64,
19 },
20 Backend(String),
22 MissingCoordinates {
24 body_label: &'static str,
26 julian_day: f64,
28 },
29 InvalidObserver {
31 detail: String,
33 },
34 InvalidAtmosphere {
36 detail: String,
38 },
39}
40
41impl fmt::Display for EclipseError {
42 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
43 match self {
44 EclipseError::OutOfWindow { julian_day } => write!(
45 f,
46 "instant JD {julian_day} is outside the supported 1900–2100 CE window \
47 (JD {WINDOW_START_JD}..={WINDOW_END_JD})"
48 ),
49 EclipseError::Backend(message) => write!(f, "backend error: {message}"),
50 EclipseError::MissingCoordinates {
51 body_label,
52 julian_day,
53 } => write!(
54 f,
55 "backend returned no ecliptic coordinates for {body_label} at JD {julian_day}"
56 ),
57 EclipseError::InvalidObserver { detail } => write!(f, "invalid observer: {detail}"),
58 EclipseError::InvalidAtmosphere { detail } => write!(f, "invalid atmosphere: {detail}"),
59 }
60 }
61}
62
63impl std::error::Error for EclipseError {}
64
65#[cfg(test)]
66mod tests {
67 use super::*;
68
69 #[test]
70 fn out_of_window_message_names_the_julian_day() {
71 let err = EclipseError::OutOfWindow {
72 julian_day: 2_400_000.5,
73 };
74 assert!(err.to_string().contains("2400000.5"));
75 assert!(err.to_string().contains("1900"));
76 }
77
78 #[test]
79 fn window_constants_match_1900_2100() {
80 assert_eq!(WINDOW_START_JD, 2_415_020.5);
81 assert_eq!(WINDOW_END_JD, 2_488_069.5);
82 }
83}