use core::fmt;
use pleiades_types::CustomDefinitionValidationError;
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
#[non_exhaustive]
pub enum EphemerisErrorKind {
UnsupportedBody,
UnsupportedCoordinateFrame,
UnsupportedTimeScale,
InvalidObserver,
UnsupportedObserver,
OutOfRangeInstant,
MissingDataset,
NumericalFailure,
UnsupportedApparentness,
UnsupportedZodiacMode,
InvalidRequest,
}
impl fmt::Display for EphemerisErrorKind {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let label = match self {
EphemerisErrorKind::UnsupportedBody => "UnsupportedBody",
EphemerisErrorKind::UnsupportedCoordinateFrame => "UnsupportedCoordinateFrame",
EphemerisErrorKind::UnsupportedTimeScale => "UnsupportedTimeScale",
EphemerisErrorKind::InvalidObserver => "InvalidObserver",
EphemerisErrorKind::UnsupportedObserver => "UnsupportedObserver",
EphemerisErrorKind::OutOfRangeInstant => "OutOfRangeInstant",
EphemerisErrorKind::MissingDataset => "MissingDataset",
EphemerisErrorKind::NumericalFailure => "NumericalFailure",
EphemerisErrorKind::UnsupportedApparentness => "UnsupportedApparentness",
EphemerisErrorKind::UnsupportedZodiacMode => "UnsupportedZodiacMode",
EphemerisErrorKind::InvalidRequest => "InvalidRequest",
};
f.write_str(label)
}
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct EphemerisError {
pub kind: EphemerisErrorKind,
pub message: String,
}
impl EphemerisError {
pub fn new(kind: EphemerisErrorKind, message: impl Into<String>) -> Self {
Self {
kind,
message: message.into(),
}
}
pub fn summary_line(&self) -> String {
format!("{}: {}", self.kind, self.message)
}
}
impl fmt::Display for EphemerisError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(&self.summary_line())
}
}
impl std::error::Error for EphemerisError {}
pub(crate) fn format_display_list<T: fmt::Display>(values: &[T]) -> String {
values
.iter()
.map(ToString::to_string)
.collect::<Vec<_>>()
.join(", ")
}
pub(crate) fn map_custom_definition_error(
subject: &'static str,
error: CustomDefinitionValidationError,
) -> EphemerisError {
EphemerisError::new(
EphemerisErrorKind::InvalidRequest,
format!("{subject} is invalid: {error}"),
)
}