Skip to main content

thrust_py/
airac.rs

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}