#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Position {
R1,
R2,
}
impl core::fmt::Display for Position {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.write_str(match self {
Self::R1 => "r1",
Self::R2 => "r2",
})
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum NonFiniteParameter {
R1X,
R1Y,
R1Z,
R2X,
R2Y,
R2Z,
Tof,
Mu,
}
impl NonFiniteParameter {
#[must_use]
pub fn as_str(self) -> &'static str {
match self {
Self::R1X => "r1.x",
Self::R1Y => "r1.y",
Self::R1Z => "r1.z",
Self::R2X => "r2.x",
Self::R2Y => "r2.y",
Self::R2Z => "r2.z",
Self::Tof => "tof",
Self::Mu => "mu",
}
}
}
impl core::fmt::Display for NonFiniteParameter {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.write_str(self.as_str())
}
}
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, thiserror::Error)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum LambertError {
#[error("non-finite input: {parameter} = {value}")]
NonFiniteInput {
parameter: NonFiniteParameter,
value: f64,
},
#[error("non-positive time of flight: tof = {tof}")]
NonPositiveTimeOfFlight {
tof: f64,
},
#[error("non-positive gravitational parameter: mu = {mu}")]
NonPositiveMu {
mu: f64,
},
#[error("degenerate position vector {position}: norm = {norm}")]
DegeneratePositionVector {
position: Position,
norm: f64,
},
#[error("colinear position vectors: |r1 × r2| / (|r1| |r2|) = {sin_angle:.3e}")]
CollinearGeometry {
sin_angle: f64,
},
#[error(
"Householder did not converge after {iterations} iters \
(last |Δx| = {last_step:.3e}, branch M = {n_revs})"
)]
NoConvergence {
iterations: u32,
last_step: f64,
n_revs: u32,
},
#[error("Householder denominator vanished on branch M = {n_revs}")]
SingularDenominator {
n_revs: u32,
},
}