use sgp4::Elements;
use crate::satellite::sgp4_wrapper::Sgp4Error;
use serde_json;
pub fn parse_omm(json_string: &str) -> Result<Elements, Sgp4Error> {
serde_json::from_str(json_string)
.map_err(|e| Sgp4Error::OmmParsingFailed(e.to_string()))
}
pub fn parse_omm_batch(json_array: &str) -> Result<Vec<Elements>, Sgp4Error> {
use serde_json::Value;
let array: Vec<Value> = serde_json::from_str(json_array)
.map_err(|e| Sgp4Error::OmmParsingFailed(format!("Invalid JSON array: {e}")))?;
array
.iter()
.enumerate()
.map(|(i, obj)| {
let obj_str = serde_json::to_string(obj)
.map_err(|e| Sgp4Error::OmmParsingFailed(format!("Object {i} serialize error: {e}")))?;
parse_omm(&obj_str)
})
.collect()
}
#[cfg(test)]
mod tests {
use super::*;
const ISS_OMM: &str = r#"{
"OBJECT_NAME": "ISS (ZARYA)",
"OBJECT_ID": "1998-067A",
"EPOCH": "2008-09-20T12:25:40.104",
"MEAN_MOTION": 15.72125391,
"ECCENTRICITY": 0.0006703,
"INCLINATION": 51.6416,
"RA_OF_ASC_NODE": 247.4627,
"ARG_OF_PERICENTER": 130.5360,
"MEAN_ANOMALY": 325.0288,
"EPHEMERIS_TYPE": 0,
"CLASSIFICATION_TYPE": "U",
"NORAD_CAT_ID": 25544,
"ELEMENT_SET_NO": 292,
"REV_AT_EPOCH": 56353,
"BSTAR": -0.000011606,
"MEAN_MOTION_DOT": -0.00002182,
"MEAN_MOTION_DDOT": 0.0
}"#;
#[test]
fn test_parse_omm() {
let elements = parse_omm(ISS_OMM).unwrap();
assert_eq!(elements.norad_id, 25544);
assert_eq!(elements.object_name, Some("ISS (ZARYA)".to_string()));
assert_eq!(elements.international_designator, Some("1998-067A".to_string()));
assert!((elements.inclination - 51.6416).abs() < 0.001);
assert!((elements.eccentricity - 0.0006703).abs() < 0.0000001);
assert!((elements.mean_motion - 15.72125391).abs() < 0.00001);
assert_eq!(elements.element_set_number, 292);
assert_eq!(elements.revolution_number, 56353);
}
#[test]
fn test_parse_omm_batch() {
let omm_array = format!("[{}, {}]", ISS_OMM, ISS_OMM);
let elements_vec = parse_omm_batch(&omm_array).unwrap();
assert_eq!(elements_vec.len(), 2);
assert_eq!(elements_vec[0].norad_id, 25544);
assert_eq!(elements_vec[1].norad_id, 25544);
}
#[test]
fn test_invalid_json() {
let result = parse_omm("{invalid json");
assert!(result.is_err());
assert!(matches!(result.unwrap_err(), Sgp4Error::OmmParsingFailed(_)));
}
#[test]
fn test_missing_required_field() {
let incomplete_omm = r#"{
"OBJECT_NAME": "TEST",
"EPOCH": "2008-09-20T12:25:40.104",
"NORAD_CAT_ID": 12345
}"#;
let result = parse_omm(incomplete_omm);
assert!(result.is_err());
}
#[test]
fn test_required_fields_only() {
let required_fields_omm = r#"{
"EPOCH": "2008-09-20T12:25:40.104",
"MEAN_MOTION": 15.72125391,
"ECCENTRICITY": 0.0006703,
"INCLINATION": 51.6416,
"RA_OF_ASC_NODE": 247.4627,
"ARG_OF_PERICENTER": 130.5360,
"MEAN_ANOMALY": 325.0288,
"NORAD_CAT_ID": 25544,
"CLASSIFICATION_TYPE": "U",
"MEAN_MOTION_DOT": 0.0,
"MEAN_MOTION_DDOT": 0.0,
"BSTAR": 0.0,
"ELEMENT_SET_NO": 1,
"REV_AT_EPOCH": 1000,
"EPHEMERIS_TYPE": 0
}"#;
let elements = parse_omm(required_fields_omm).unwrap();
assert_eq!(elements.norad_id, 25544);
}
}