use std::path::PathBuf;
use lox_earth::eop::{self, EopParser, EopProvider};
use pyo3::exceptions::PyException;
use pyo3::types::{PyAnyMethods, PyTuple};
use pyo3::{Bound, PyErr, PyResult, create_exception, pyclass, pymethods};
create_exception!(
lox_space,
EopParserError,
PyException,
"Python exception raised when an EOP data file cannot be parsed."
);
pub struct PyEopParserError(pub eop::EopParserError);
impl From<PyEopParserError> for PyErr {
fn from(err: PyEopParserError) -> Self {
EopParserError::new_err(err.0.to_string())
}
}
create_exception!(
lox_space,
EopProviderError,
PyException,
"Python exception raised when EOP data cannot be retrieved for a given time."
);
pub struct PyEopProviderError(pub lox_earth::eop::EopProviderError);
impl From<PyEopProviderError> for PyErr {
fn from(err: PyEopProviderError) -> Self {
EopProviderError::new_err(err.0.to_string())
}
}
#[pyclass(name = "EOPProvider", module = "lox_space", frozen)]
#[derive(Debug)]
pub struct PyEopProvider(pub EopProvider);
#[pymethods]
impl PyEopProvider {
#[pyo3(signature = (*args))]
#[new]
pub fn new(args: &Bound<'_, PyTuple>) -> PyResult<PyEopProvider> {
let (path1, path2) = if let Ok((path1, path2)) = args.extract::<(PathBuf, PathBuf)>() {
(path1, path2)
} else if let Ok((path,)) = args.extract::<(PathBuf,)>() {
(path.clone(), path)
} else {
return Err(PyEopParserError(eop::EopParserError::NoFiles).into());
};
Ok(PyEopProvider(
EopParser::new()
.from_paths(path1, path2)
.parse()
.map_err(PyEopParserError)?,
))
}
}