nautilus_model/python/
macros.rs1#[macro_export]
19macro_rules! identifier_for_python {
20 ($ty:ty) => {
21 #[pymethods]
22 #[pyo3_stub_gen::derive::gen_stub_pymethods]
23 impl $ty {
24 #[new]
25 fn py_new(value: &str) -> PyResult<Self> {
26 <$ty>::new_checked(value).map_err(to_pyvalue_err)
27 }
28
29 fn __setstate__(&mut self, state: &Bound<'_, PyAny>) -> PyResult<()> {
30 let py_tuple: &Bound<'_, PyTuple> = state.cast::<PyTuple>()?;
31 let bindings = py_tuple.get_item(0)?;
32 let value = bindings.cast::<PyString>()?.extract::<&str>()?;
33 let validated = <$ty>::new_checked(value).map_err(to_pyvalue_err)?;
34 self.set_inner(validated.as_str());
35 Ok(())
36 }
37
38 fn __getstate__(&self, py: Python) -> PyResult<Py<PyAny>> {
39 use pyo3::IntoPyObjectExt;
40 (self.to_string(),).into_py_any(py)
41 }
42
43 fn __reduce__(&self, py: Python) -> PyResult<Py<PyAny>> {
44 use pyo3::IntoPyObjectExt;
45 let safe_constructor = py.get_type::<Self>().getattr("_safe_constructor")?;
46 let state = self.__getstate__(py)?;
47 (safe_constructor, PyTuple::empty(py), state).into_py_any(py)
48 }
49
50 #[staticmethod]
51 fn _safe_constructor() -> PyResult<Self> {
52 <$ty>::new_checked("NULL-NULL").map_err(to_pyvalue_err)
53 }
54
55 fn __richcmp__(&self, other: &Self, op: CompareOp, py: Python<'_>) -> Py<PyAny> {
59 use nautilus_core::python::IntoPyObjectNautilusExt;
60
61 match op {
62 CompareOp::Eq => self.eq(other).into_py_any_unwrap(py),
63 CompareOp::Ne => self.ne(other).into_py_any_unwrap(py),
64 CompareOp::Ge => self.ge(other).into_py_any_unwrap(py),
65 CompareOp::Gt => self.gt(other).into_py_any_unwrap(py),
66 CompareOp::Le => self.le(other).into_py_any_unwrap(py),
67 CompareOp::Lt => self.lt(other).into_py_any_unwrap(py),
68 }
69 }
70
71 fn __hash__(&self) -> isize {
72 self.inner().precomputed_hash() as isize
73 }
74
75 fn __repr__(&self) -> String {
76 format!(
77 "{}('{}')",
78 stringify!($ty).split("::").last().unwrap_or(""),
79 self.as_str()
80 )
81 }
82
83 fn __str__(&self) -> &'static str {
84 self.inner().as_str()
85 }
86
87 #[getter]
88 #[pyo3(name = "value")]
89 fn py_value(&self) -> String {
90 self.to_string()
91 }
92
93 #[staticmethod]
94 #[pyo3(name = "from_str")]
95 fn py_from_str(value: &str) -> PyResult<Self> {
96 <$ty>::new_checked(value).map_err(to_pyvalue_err)
97 }
98 }
99 };
100}