nautilus_core/python/
mod.rs1pub mod casing;
19pub mod datetime;
20pub mod enums;
21pub mod serialization;
22pub mod uuid;
23pub mod version;
24
25use pyo3::{
26 conversion::IntoPyObjectExt,
27 exceptions::{PyRuntimeError, PyTypeError, PyValueError},
28 prelude::*,
29 types::PyString,
30 wrap_pyfunction,
31};
32
33use crate::{
34 UUID4,
35 consts::{NAUTILUS_USER_AGENT, NAUTILUS_VERSION},
36 datetime::{
37 MILLISECONDS_IN_SECOND, NANOSECONDS_IN_MICROSECOND, NANOSECONDS_IN_MILLISECOND,
38 NANOSECONDS_IN_SECOND,
39 },
40};
41
42pub trait IntoPyObjectPoseiExt<'py>: IntoPyObjectExt<'py> {
44 #[inline]
45 fn into_py_any_unwrap(self, py: Python<'py>) -> PyObject {
46 self.into_py_any(py)
47 .expect("Failed to convert type to PyObject")
48 }
49}
50
51impl<'py, T> IntoPyObjectPoseiExt<'py> for T where T: IntoPyObjectExt<'py> {}
52
53pub fn get_pytype_name<'py>(obj: &Bound<'py, PyAny>) -> PyResult<Bound<'py, PyString>> {
59 obj.get_type().name()
60}
61
62pub fn to_pyvalue_err(e: impl std::fmt::Display) -> PyErr {
68 PyValueError::new_err(e.to_string())
69}
70
71pub fn to_pytype_err(e: impl std::fmt::Display) -> PyErr {
77 PyTypeError::new_err(e.to_string())
78}
79
80pub fn to_pyruntime_err(e: impl std::fmt::Display) -> PyErr {
86 PyRuntimeError::new_err(e.to_string())
87}
88
89#[pyfunction]
90#[allow(clippy::needless_pass_by_value)]
91#[allow(unsafe_code)]
92fn is_pycapsule(obj: PyObject) -> bool {
93 unsafe {
94 pyo3::ffi::PyCapsule_CheckExact(obj.as_ptr()) != 0
96 }
97}
98
99#[pymodule]
105#[rustfmt::skip]
106pub fn core(_: Python<'_>, m: &Bound<'_, PyModule>) -> PyResult<()> {
107 m.add(stringify!(NAUTILUS_VERSION), NAUTILUS_VERSION)?;
108 m.add(stringify!(NAUTILUS_USER_AGENT), NAUTILUS_USER_AGENT)?;
109 m.add(stringify!(MILLISECONDS_IN_SECOND), MILLISECONDS_IN_SECOND)?;
110 m.add(stringify!(NANOSECONDS_IN_SECOND), NANOSECONDS_IN_SECOND)?;
111 m.add(stringify!(NANOSECONDS_IN_MILLISECOND), NANOSECONDS_IN_MILLISECOND)?;
112 m.add(stringify!(NANOSECONDS_IN_MICROSECOND), NANOSECONDS_IN_MICROSECOND)?;
113 m.add_class::<UUID4>()?;
114 m.add_function(wrap_pyfunction!(is_pycapsule, m)?)?;
115 m.add_function(wrap_pyfunction!(casing::py_convert_to_snake_case, m)?)?;
116 m.add_function(wrap_pyfunction!(datetime::py_secs_to_nanos, m)?)?;
117 m.add_function(wrap_pyfunction!(datetime::py_secs_to_millis, m)?)?;
118 m.add_function(wrap_pyfunction!(datetime::py_millis_to_nanos, m)?)?;
119 m.add_function(wrap_pyfunction!(datetime::py_micros_to_nanos, m)?)?;
120 m.add_function(wrap_pyfunction!(datetime::py_nanos_to_secs, m)?)?;
121 m.add_function(wrap_pyfunction!(datetime::py_nanos_to_millis, m)?)?;
122 m.add_function(wrap_pyfunction!(datetime::py_nanos_to_micros, m)?)?;
123 m.add_function(wrap_pyfunction!(datetime::py_unix_nanos_to_iso8601, m)?)?;
124 m.add_function(wrap_pyfunction!(datetime::py_last_weekday_nanos, m)?)?;
125 m.add_function(wrap_pyfunction!(datetime::py_is_within_last_24_hours, m)?)?;
126 Ok(())
127}