#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum DatasetId {
De440,
De441,
Vsop87a,
Vsop87e,
Elp2000,
IersEop,
}
impl DatasetId {
pub const fn as_str(&self) -> &'static str {
match self {
DatasetId::De440 => "de440",
DatasetId::De441 => "de441",
DatasetId::Vsop87a => "vsop87a",
DatasetId::Vsop87e => "vsop87e",
DatasetId::Elp2000 => "elp2000",
DatasetId::IersEop => "iers_eop",
}
}
}
impl std::fmt::Display for DatasetId {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.as_str())
}
}
#[derive(Debug, Clone)]
pub struct DatasetMeta {
pub id: DatasetId,
pub name: &'static str,
pub url: &'static str,
pub filename: &'static str,
pub sha256: &'static str,
pub min_size: u64,
pub size_hint: &'static str,
}
pub static DATASETS: &[DatasetMeta] = &[
DatasetMeta {
id: DatasetId::De440,
name: "JPL DE440",
url: "https://naif.jpl.nasa.gov/pub/naif/generic_kernels/spk/planets/de440.bsp",
filename: "de440.bsp",
sha256: "", min_size: 100_000_000,
size_hint: "~120 MB",
},
DatasetMeta {
id: DatasetId::De441,
name: "JPL DE441 (part 2)",
url: "https://naif.jpl.nasa.gov/pub/naif/generic_kernels/spk/planets/de441_part-2.bsp",
filename: "de441_part-2.bsp",
sha256: "", min_size: 1_500_000_000,
size_hint: "~1.65 GB",
},
DatasetMeta {
id: DatasetId::IersEop,
name: "IERS EOP finals2000A",
url: "https://datacenter.iers.org/products/eop/rapid/standard/finals2000A.all",
filename: "finals2000A.all",
sha256: "",
min_size: 1_000_000,
size_hint: "~4 MB",
},
];
#[cfg(feature = "runtime-data")]
pub fn lookup(id: DatasetId) -> Option<&'static DatasetMeta> {
DATASETS.iter().find(|d| d.id == id)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn dataset_id_as_str() {
assert_eq!(DatasetId::De440.as_str(), "de440");
assert_eq!(DatasetId::De441.as_str(), "de441");
assert_eq!(DatasetId::Vsop87a.as_str(), "vsop87a");
assert_eq!(DatasetId::Vsop87e.as_str(), "vsop87e");
assert_eq!(DatasetId::Elp2000.as_str(), "elp2000");
assert_eq!(DatasetId::IersEop.as_str(), "iers_eop");
}
#[test]
fn dataset_id_display() {
assert_eq!(format!("{}", DatasetId::De440), "de440");
assert_eq!(format!("{}", DatasetId::De441), "de441");
assert_eq!(format!("{}", DatasetId::IersEop), "iers_eop");
}
#[test]
fn dataset_id_eq_and_clone() {
let id = DatasetId::De440;
let id2 = id;
assert_eq!(id, id2);
assert_ne!(id, DatasetId::De441);
assert_ne!(DatasetId::Vsop87a, DatasetId::Vsop87e);
}
#[test]
fn datasets_slice_is_non_empty() {
assert!(!DATASETS.is_empty());
assert!(DATASETS.iter().any(|d| d.id == DatasetId::De440));
assert!(DATASETS.iter().any(|d| d.id == DatasetId::IersEop));
}
#[test]
fn dataset_meta_fields_non_empty() {
let de440 = DATASETS.iter().find(|d| d.id == DatasetId::De440).unwrap();
assert!(!de440.name.is_empty());
assert!(!de440.url.is_empty());
assert!(!de440.filename.is_empty());
assert!(de440.min_size > 0);
}
#[test]
#[cfg(feature = "runtime-data")]
fn lookup_de440_found() {
let meta = lookup(DatasetId::De440);
assert!(meta.is_some());
assert_eq!(meta.unwrap().id, DatasetId::De440);
}
#[test]
#[cfg(feature = "runtime-data")]
fn lookup_elp2000_not_in_catalog_returns_none() {
let _result = lookup(DatasetId::Elp2000);
}
}