use thiserror::Error;
#[derive(Debug, Error)]
pub enum SpiceError {
#[error("SPICE kernel I/O error: {0}")]
Io(#[from] std::io::Error),
#[error("SPICE kernel parse error: {message}")]
Parse {
message: String,
},
#[error(
"SPICE kernel: state for target={target} center={center} is out of coverage \
at et={epoch_tdb_seconds} TDB-s; available segment range is \
[{start_tdb_seconds}, {end_tdb_seconds}] TDB-s"
)]
OutOfCoverage {
target: i32,
center: i32,
epoch_tdb_seconds: f64,
start_tdb_seconds: f64,
end_tdb_seconds: f64,
},
#[error(
"SPICE kernel: no chain from target={target} to center={center} \
(kernel has no segment with this body pair, even via transitive \
centers)"
)]
NoChain {
target: i32,
center: i32,
},
#[error("SPICE kernel: SPK Type {data_type} is not implemented")]
UnsupportedDataType {
data_type: i32,
},
#[error("SPICE kernel: segment record corrupted: {message}")]
Corrupted {
message: String,
},
#[error("SPICE kernel: unsupported kernel query: {message}")]
UnsupportedKernelQuery {
message: String,
},
#[error("SPICE context: unknown frame: {description}")]
UnknownFrame {
description: String,
},
#[error("SPICE context: time conversion error: {message}")]
TimeConversion {
message: String,
},
#[error("SPICE format parse error: {0}")]
FormatParse(String),
}
impl From<crate::archive::ArchiveError> for SpiceError {
fn from(err: crate::archive::ArchiveError) -> Self {
match err {
crate::archive::ArchiveError::Io(e) => SpiceError::Io(e),
other => SpiceError::FormatParse(format!("{other}")),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::archive::ArchiveError;
#[test]
fn archive_io_error_converts_to_spice_io() {
let err = SpiceError::from(ArchiveError::Io(std::io::Error::new(
std::io::ErrorKind::NotFound,
"missing kernel",
)));
assert!(matches!(err, SpiceError::Io(_)));
}
#[test]
fn archive_integrity_error_converts_to_format_parse() {
let err = SpiceError::from(ArchiveError::Integrity("checksum mismatch".into()));
assert!(matches!(err, SpiceError::FormatParse(message) if message.contains("checksum")));
}
}