nautilus_model/python/orderbook/
level.rs1use std::{
17 collections::hash_map::DefaultHasher,
18 hash::{Hash, Hasher},
19};
20
21use nautilus_core::python::IntoPyObjectNautilusExt;
22use pyo3::{prelude::*, pyclass::CompareOp};
23
24use crate::{
25 data::order::BookOrder,
26 enums::OrderSide,
27 orderbook::BookLevel,
28 types::{price::Price, quantity::QuantityRaw},
29};
30
31#[pymethods]
32#[pyo3_stub_gen::derive::gen_stub_pymethods]
33impl BookLevel {
34 fn __repr__(&self) -> String {
35 format!("{self:?}")
36 }
37
38 fn __str__(&self) -> String {
39 format!("{self:?}")
41 }
42
43 fn __richcmp__(&self, other: &Self, op: CompareOp, py: Python<'_>) -> Py<PyAny> {
44 match op {
45 CompareOp::Eq => self.eq(other).into_py_any_unwrap(py),
46 CompareOp::Ne => self.ne(other).into_py_any_unwrap(py),
47 CompareOp::Ge if self.side() == other.side() => self.ge(other).into_py_any_unwrap(py),
48 CompareOp::Gt if self.side() == other.side() => self.gt(other).into_py_any_unwrap(py),
49 CompareOp::Le if self.side() == other.side() => self.le(other).into_py_any_unwrap(py),
50 CompareOp::Lt if self.side() == other.side() => self.lt(other).into_py_any_unwrap(py),
51 CompareOp::Ge | CompareOp::Gt | CompareOp::Le | CompareOp::Lt => py.NotImplemented(),
52 }
53 }
54
55 fn __hash__(&self) -> isize {
56 let mut hasher = DefaultHasher::new();
57 self.side().hash(&mut hasher);
58 self.price.value.hash(&mut hasher);
59 hasher.finish() as isize
60 }
61
62 #[getter]
63 #[pyo3(name = "price")]
64 fn py_price(&self) -> Price {
65 self.price.value
66 }
67
68 #[getter]
69 #[pyo3(name = "side")]
70 fn py_side(&self) -> OrderSide {
71 self.side()
72 }
73
74 #[pyo3(name = "len")]
76 fn py_len(&self) -> usize {
77 self.len()
78 }
79
80 #[pyo3(name = "is_empty")]
82 fn py_is_empty(&self) -> bool {
83 self.is_empty()
84 }
85
86 #[pyo3(name = "size")]
88 fn py_size(&self) -> f64 {
89 self.size()
90 }
91
92 #[pyo3(name = "size_raw")]
94 fn py_size_raw(&self) -> QuantityRaw {
95 self.size_raw()
96 }
97
98 #[pyo3(name = "exposure")]
100 fn py_exposure(&self) -> f64 {
101 self.exposure()
102 }
103
104 #[pyo3(name = "exposure_raw")]
112 fn py_exposure_raw(&self) -> QuantityRaw {
113 self.exposure_raw()
114 }
115
116 #[pyo3(name = "first")]
117 fn py_fist(&self) -> Option<BookOrder> {
118 self.first().copied()
119 }
120
121 #[pyo3(name = "get_orders")]
123 fn py_get_orders(&self) -> Vec<BookOrder> {
124 self.get_orders()
125 }
126}