nautilus_core/python/
mod.rs1pub mod casing;
25pub mod datetime;
26pub mod enums;
27pub mod parsing;
28pub mod serialization;
29pub mod uuid;
30pub mod version;
31
32use pyo3::{
33 conversion::IntoPyObjectExt,
34 exceptions::{PyRuntimeError, PyTypeError, PyValueError},
35 prelude::*,
36 types::PyString,
37 wrap_pyfunction,
38};
39
40use crate::{
41 UUID4,
42 consts::{NAUTILUS_USER_AGENT, NAUTILUS_VERSION},
43 datetime::{
44 MILLISECONDS_IN_SECOND, NANOSECONDS_IN_MICROSECOND, NANOSECONDS_IN_MILLISECOND,
45 NANOSECONDS_IN_SECOND,
46 },
47};
48
49pub trait IntoPyObjectNautilusExt<'py>: IntoPyObjectExt<'py> {
51 #[inline]
58 fn into_py_any_unwrap(self, py: Python<'py>) -> PyObject {
59 self.into_py_any(py)
60 .expect("Failed to convert type to PyObject")
61 }
62}
63
64impl<'py, T> IntoPyObjectNautilusExt<'py> for T where T: IntoPyObjectExt<'py> {}
65
66pub fn get_pytype_name<'py>(obj: &Bound<'py, PyAny>) -> PyResult<Bound<'py, PyString>> {
72 obj.get_type().name()
73}
74
75pub fn to_pyvalue_err(e: impl std::fmt::Display) -> PyErr {
81 PyValueError::new_err(e.to_string())
82}
83
84pub fn to_pytype_err(e: impl std::fmt::Display) -> PyErr {
90 PyTypeError::new_err(e.to_string())
91}
92
93pub fn to_pyruntime_err(e: impl std::fmt::Display) -> PyErr {
99 PyRuntimeError::new_err(e.to_string())
100}
101
102#[pyfunction]
103#[allow(clippy::needless_pass_by_value)]
104#[allow(unsafe_code)]
105fn is_pycapsule(obj: PyObject) -> bool {
106 unsafe {
107 pyo3::ffi::PyCapsule_CheckExact(obj.as_ptr()) != 0
109 }
110}
111
112#[pymodule]
118#[rustfmt::skip]
119pub fn core(_: Python<'_>, m: &Bound<'_, PyModule>) -> PyResult<()> {
120 m.add(stringify!(NAUTILUS_VERSION), NAUTILUS_VERSION)?;
121 m.add(stringify!(NAUTILUS_USER_AGENT), NAUTILUS_USER_AGENT)?;
122 m.add(stringify!(MILLISECONDS_IN_SECOND), MILLISECONDS_IN_SECOND)?;
123 m.add(stringify!(NANOSECONDS_IN_SECOND), NANOSECONDS_IN_SECOND)?;
124 m.add(stringify!(NANOSECONDS_IN_MILLISECOND), NANOSECONDS_IN_MILLISECOND)?;
125 m.add(stringify!(NANOSECONDS_IN_MICROSECOND), NANOSECONDS_IN_MICROSECOND)?;
126 m.add_class::<UUID4>()?;
127 m.add_function(wrap_pyfunction!(is_pycapsule, m)?)?;
128 m.add_function(wrap_pyfunction!(casing::py_convert_to_snake_case, m)?)?;
129 m.add_function(wrap_pyfunction!(datetime::py_secs_to_nanos, m)?)?;
130 m.add_function(wrap_pyfunction!(datetime::py_secs_to_millis, m)?)?;
131 m.add_function(wrap_pyfunction!(datetime::py_millis_to_nanos, m)?)?;
132 m.add_function(wrap_pyfunction!(datetime::py_micros_to_nanos, m)?)?;
133 m.add_function(wrap_pyfunction!(datetime::py_nanos_to_secs, m)?)?;
134 m.add_function(wrap_pyfunction!(datetime::py_nanos_to_millis, m)?)?;
135 m.add_function(wrap_pyfunction!(datetime::py_nanos_to_micros, m)?)?;
136 m.add_function(wrap_pyfunction!(datetime::py_unix_nanos_to_iso8601, m)?)?;
137 m.add_function(wrap_pyfunction!(datetime::py_last_weekday_nanos, m)?)?;
138 m.add_function(wrap_pyfunction!(datetime::py_is_within_last_24_hours, m)?)?;
139 Ok(())
140}