use std::error::Error;
use std::fmt;
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq)]
pub enum TraceError {
InvalidFrequency(f64),
InvalidElevation(f64),
InvalidStepSize(f64),
InvalidMaxSteps(usize),
NoGroundReturn,
SolverDidNotConverge {
best_error_km: f64,
},
}
impl fmt::Display for TraceError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
TraceError::InvalidFrequency(v) => {
write!(f, "Invalid frequency: {} MHz. Must be > 0.", v)
}
TraceError::InvalidElevation(v) => write!(
f,
"Invalid elevation: {} deg. Must be between -90 and 90.",
v
),
TraceError::InvalidStepSize(v) => write!(f, "Invalid step size: {}. Must be > 0.", v),
TraceError::InvalidMaxSteps(v) => write!(f, "Invalid max steps: {}. Must be > 0.", v),
TraceError::NoGroundReturn => {
write!(f, "No ray returned to ground in the search range.")
}
TraceError::SolverDidNotConverge { best_error_km } => write!(
f,
"Solver did not converge. Best error: {:.2} km.",
best_error_km
),
}
}
}
impl Error for TraceError {}