Skip to main content

tempoch_py/
lib.rs

1//! Python bindings for tempoch astronomical time primitives.
2//!
3//! This crate provides Python bindings for the tempoch Rust library, enabling
4//! astronomical time operations in Python with typed time-scale support,
5//! Julian Date / Modified Julian Date handling, UTC conversion, and period
6//! (interval) operations — all backed by the Rust implementation.
7
8use pyo3::prelude::*;
9
10mod errors;
11pub mod interop;
12mod jd;
13mod mjd;
14mod period;
15mod scales;
16
17use jd::PyJulianDate;
18use mjd::PyModifiedJulianDate;
19use period::{intersect_periods_py, PyTimePeriod};
20use scales::{convert_timescale, tai_minus_utc_py, PyTimeScale};
21
22/// tempoch: Astronomical Time Primitives for Python
23///
24/// This module provides typed astronomical time primitives with typed time
25/// scales, Julian Date / Modified Julian Date handling, UTC conversion, and
26/// period (interval) operations — all backed by Rust for high performance.
27///
28/// Example:
29/// >>> from tempoch import JulianDate, ModifiedJulianDate
30/// >>> j2000 = JulianDate.j2000()
31/// >>> mjd = j2000.to_mjd()
32/// >>> print(mjd)
33/// ModifiedJulianDate(51544.5)
34#[pymodule]
35fn _tempoch(_py: Python, m: &Bound<'_, PyModule>) -> PyResult<()> {
36    // Time classes
37    m.add_class::<PyJulianDate>()?;
38    m.add_class::<PyModifiedJulianDate>()?;
39    m.add_class::<PyTimePeriod>()?;
40    m.add_class::<PyTimeScale>()?;
41
42    // Exception types
43    m.add(
44        "NonFiniteTimeError",
45        _py.get_type::<errors::NonFiniteTimeError>(),
46    )?;
47    m.add(
48        "InvalidIntervalError",
49        _py.get_type::<errors::InvalidIntervalError>(),
50    )?;
51    m.add("ConversionError", _py.get_type::<errors::ConversionError>())?;
52
53    // Free functions
54    m.add_function(wrap_pyfunction!(convert_timescale, m)?)?;
55    m.add_function(wrap_pyfunction!(tai_minus_utc_py, m)?)?;
56    m.add_function(wrap_pyfunction!(intersect_periods_py, m)?)?;
57
58    // Version
59    m.add("__version__", env!("CARGO_PKG_VERSION"))?;
60
61    Ok(())
62}