use std::fmt;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[allow(clippy::upper_case_acronyms)]
pub enum CelestrakQueryType {
GP,
SupGP,
SATCAT,
}
impl CelestrakQueryType {
pub fn as_str(&self) -> &'static str {
match self {
CelestrakQueryType::GP => "gp",
CelestrakQueryType::SupGP => "sup_gp",
CelestrakQueryType::SATCAT => "satcat",
}
}
pub fn endpoint_path(&self) -> &'static str {
match self {
CelestrakQueryType::GP => "/NORAD/elements/gp.php",
CelestrakQueryType::SupGP => "/NORAD/elements/supplemental/sup-gp.php",
CelestrakQueryType::SATCAT => "/satcat/records.php",
}
}
}
impl fmt::Display for CelestrakQueryType {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.as_str())
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CelestrakOutputFormat {
Tle,
TwoLe,
ThreeLe,
Xml,
Kvn,
Json,
JsonPretty,
Csv,
}
impl CelestrakOutputFormat {
pub fn as_str(&self) -> &'static str {
match self {
CelestrakOutputFormat::Tle => "TLE",
CelestrakOutputFormat::TwoLe => "2LE",
CelestrakOutputFormat::ThreeLe => "3LE",
CelestrakOutputFormat::Xml => "XML",
CelestrakOutputFormat::Kvn => "KVN",
CelestrakOutputFormat::Json => "JSON",
CelestrakOutputFormat::JsonPretty => "JSON-PRETTY",
CelestrakOutputFormat::Csv => "CSV",
}
}
pub fn is_json(&self) -> bool {
matches!(
self,
CelestrakOutputFormat::Json | CelestrakOutputFormat::JsonPretty
)
}
}
impl fmt::Display for CelestrakOutputFormat {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.as_str())
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SupGPSource {
SpaceX,
SpaceXSup,
Planet,
OneWeb,
Starlink,
StarlinkSup,
Geo,
Gps,
Glonass,
Meteosat,
Intelsat,
Ses,
Iridium,
IridiumNext,
Orbcomm,
Globalstar,
SwarmTechnologies,
Amateur,
CelesTrak,
Kuiper,
}
impl SupGPSource {
pub fn as_str(&self) -> &'static str {
match self {
SupGPSource::SpaceX => "spacex",
SupGPSource::SpaceXSup => "spacex-sup",
SupGPSource::Planet => "planet",
SupGPSource::OneWeb => "oneweb",
SupGPSource::Starlink => "starlink",
SupGPSource::StarlinkSup => "starlink-sup",
SupGPSource::Geo => "geo",
SupGPSource::Gps => "gps",
SupGPSource::Glonass => "glonass",
SupGPSource::Meteosat => "meteosat",
SupGPSource::Intelsat => "intelsat",
SupGPSource::Ses => "ses",
SupGPSource::Iridium => "iridium",
SupGPSource::IridiumNext => "iridium-next",
SupGPSource::Orbcomm => "orbcomm",
SupGPSource::Globalstar => "globalstar",
SupGPSource::SwarmTechnologies => "swarm",
SupGPSource::Amateur => "amateur",
SupGPSource::CelesTrak => "celestrak",
SupGPSource::Kuiper => "kuiper",
}
}
}
impl fmt::Display for SupGPSource {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.as_str())
}
}
#[cfg(test)]
#[cfg_attr(coverage_nightly, coverage(off))]
mod tests {
use super::*;
#[test]
fn test_query_type_as_str() {
assert_eq!(CelestrakQueryType::GP.as_str(), "gp");
assert_eq!(CelestrakQueryType::SupGP.as_str(), "sup_gp");
assert_eq!(CelestrakQueryType::SATCAT.as_str(), "satcat");
}
#[test]
fn test_query_type_endpoint_path() {
assert_eq!(
CelestrakQueryType::GP.endpoint_path(),
"/NORAD/elements/gp.php"
);
assert_eq!(
CelestrakQueryType::SupGP.endpoint_path(),
"/NORAD/elements/supplemental/sup-gp.php"
);
assert_eq!(
CelestrakQueryType::SATCAT.endpoint_path(),
"/satcat/records.php"
);
}
#[test]
fn test_query_type_display() {
assert_eq!(format!("{}", CelestrakQueryType::GP), "gp");
assert_eq!(format!("{}", CelestrakQueryType::SupGP), "sup_gp");
assert_eq!(format!("{}", CelestrakQueryType::SATCAT), "satcat");
}
#[test]
fn test_output_format_as_str() {
assert_eq!(CelestrakOutputFormat::Tle.as_str(), "TLE");
assert_eq!(CelestrakOutputFormat::TwoLe.as_str(), "2LE");
assert_eq!(CelestrakOutputFormat::ThreeLe.as_str(), "3LE");
assert_eq!(CelestrakOutputFormat::Xml.as_str(), "XML");
assert_eq!(CelestrakOutputFormat::Kvn.as_str(), "KVN");
assert_eq!(CelestrakOutputFormat::Json.as_str(), "JSON");
assert_eq!(CelestrakOutputFormat::JsonPretty.as_str(), "JSON-PRETTY");
assert_eq!(CelestrakOutputFormat::Csv.as_str(), "CSV");
}
#[test]
fn test_output_format_display() {
assert_eq!(format!("{}", CelestrakOutputFormat::Tle), "TLE");
assert_eq!(format!("{}", CelestrakOutputFormat::TwoLe), "2LE");
assert_eq!(format!("{}", CelestrakOutputFormat::ThreeLe), "3LE");
assert_eq!(format!("{}", CelestrakOutputFormat::Xml), "XML");
assert_eq!(format!("{}", CelestrakOutputFormat::Kvn), "KVN");
assert_eq!(format!("{}", CelestrakOutputFormat::Json), "JSON");
assert_eq!(
format!("{}", CelestrakOutputFormat::JsonPretty),
"JSON-PRETTY"
);
assert_eq!(format!("{}", CelestrakOutputFormat::Csv), "CSV");
}
#[test]
fn test_output_format_is_json() {
assert!(CelestrakOutputFormat::Json.is_json());
assert!(CelestrakOutputFormat::JsonPretty.is_json());
assert!(!CelestrakOutputFormat::Tle.is_json());
assert!(!CelestrakOutputFormat::TwoLe.is_json());
assert!(!CelestrakOutputFormat::ThreeLe.is_json());
assert!(!CelestrakOutputFormat::Xml.is_json());
assert!(!CelestrakOutputFormat::Kvn.is_json());
assert!(!CelestrakOutputFormat::Csv.is_json());
}
#[test]
fn test_sup_gp_source_as_str() {
assert_eq!(SupGPSource::SpaceX.as_str(), "spacex");
assert_eq!(SupGPSource::SpaceXSup.as_str(), "spacex-sup");
assert_eq!(SupGPSource::Planet.as_str(), "planet");
assert_eq!(SupGPSource::OneWeb.as_str(), "oneweb");
assert_eq!(SupGPSource::Starlink.as_str(), "starlink");
assert_eq!(SupGPSource::StarlinkSup.as_str(), "starlink-sup");
assert_eq!(SupGPSource::Geo.as_str(), "geo");
assert_eq!(SupGPSource::Gps.as_str(), "gps");
assert_eq!(SupGPSource::Glonass.as_str(), "glonass");
assert_eq!(SupGPSource::Meteosat.as_str(), "meteosat");
assert_eq!(SupGPSource::Intelsat.as_str(), "intelsat");
assert_eq!(SupGPSource::Ses.as_str(), "ses");
assert_eq!(SupGPSource::Iridium.as_str(), "iridium");
assert_eq!(SupGPSource::IridiumNext.as_str(), "iridium-next");
assert_eq!(SupGPSource::Orbcomm.as_str(), "orbcomm");
assert_eq!(SupGPSource::Globalstar.as_str(), "globalstar");
assert_eq!(SupGPSource::SwarmTechnologies.as_str(), "swarm");
assert_eq!(SupGPSource::Amateur.as_str(), "amateur");
assert_eq!(SupGPSource::CelesTrak.as_str(), "celestrak");
assert_eq!(SupGPSource::Kuiper.as_str(), "kuiper");
}
#[test]
fn test_sup_gp_source_display() {
assert_eq!(format!("{}", SupGPSource::SpaceX), "spacex");
assert_eq!(format!("{}", SupGPSource::Planet), "planet");
assert_eq!(format!("{}", SupGPSource::Starlink), "starlink");
assert_eq!(format!("{}", SupGPSource::Iridium), "iridium");
assert_eq!(format!("{}", SupGPSource::CelesTrak), "celestrak");
}
#[test]
fn test_enum_equality() {
assert_eq!(CelestrakQueryType::GP, CelestrakQueryType::GP);
assert_ne!(CelestrakQueryType::GP, CelestrakQueryType::SATCAT);
assert_eq!(CelestrakOutputFormat::Json, CelestrakOutputFormat::Json);
assert_ne!(CelestrakOutputFormat::Json, CelestrakOutputFormat::Csv);
assert_eq!(SupGPSource::SpaceX, SupGPSource::SpaceX);
assert_ne!(SupGPSource::SpaceX, SupGPSource::Planet);
}
#[test]
fn test_enum_clone() {
let qt = CelestrakQueryType::GP;
let cloned = qt;
assert_eq!(qt, cloned);
let fmt = CelestrakOutputFormat::Json;
let cloned = fmt;
assert_eq!(fmt, cloned);
let src = SupGPSource::SpaceX;
let cloned = src;
assert_eq!(src, cloned);
}
#[test]
fn test_enum_debug() {
assert_eq!(format!("{:?}", CelestrakQueryType::GP), "GP");
assert_eq!(format!("{:?}", CelestrakQueryType::SupGP), "SupGP");
assert_eq!(format!("{:?}", CelestrakQueryType::SATCAT), "SATCAT");
assert_eq!(format!("{:?}", CelestrakOutputFormat::Json), "Json");
assert_eq!(format!("{:?}", CelestrakOutputFormat::ThreeLe), "ThreeLe");
assert_eq!(format!("{:?}", SupGPSource::SpaceX), "SpaceX");
assert_eq!(format!("{:?}", SupGPSource::IridiumNext), "IridiumNext");
}
}