1use chrono::NaiveDate;
2use pyo3::exceptions::PyValueError;
3use pyo3::prelude::*;
4
5use thrust::data::airac::{
6 airac_code_from_date as rs_airac_code_from_date, airac_interval as rs_airac_interval,
7 effective_date_from_airac_code as rs_effective_date_from_airac_code,
8};
9
10fn parse_date(date: &str) -> Result<NaiveDate, PyErr> {
11 NaiveDate::parse_from_str(date, "%Y-%m-%d")
12 .map_err(|e| PyValueError::new_err(format!("invalid date '{date}': {e}")))
13}
14
15#[pyfunction]
16fn airac_code_from_date(date: String) -> PyResult<String> {
17 let parsed = parse_date(&date)?;
18 Ok(rs_airac_code_from_date(parsed))
19}
20
21#[pyfunction]
22fn effective_date_from_airac_code(airac_code: String) -> PyResult<String> {
23 let date = rs_effective_date_from_airac_code(&airac_code).map_err(|e| PyValueError::new_err(e.to_string()))?;
24 Ok(date.format("%Y-%m-%d").to_string())
25}
26
27#[pyfunction]
28fn airac_interval(airac_code: String) -> PyResult<(String, String)> {
29 let (begin, end) = rs_airac_interval(&airac_code).map_err(|e| PyValueError::new_err(e.to_string()))?;
30 Ok((begin.format("%Y-%m-%d").to_string(), end.format("%Y-%m-%d").to_string()))
31}
32
33pub fn init(py: Python<'_>) -> PyResult<Bound<'_, PyModule>> {
34 let m = PyModule::new(py, "airac")?;
35 m.add_function(wrap_pyfunction!(airac_code_from_date, &m)?)?;
36 m.add_function(wrap_pyfunction!(effective_date_from_airac_code, &m)?)?;
37 m.add_function(wrap_pyfunction!(airac_interval, &m)?)?;
38 Ok(m)
39}