use std::{
collections::hash_map::DefaultHasher,
hash::{Hash, Hasher},
};
use nautilus_core::python::IntoPyObjectNautilusExt;
use pyo3::{prelude::*, pyclass::CompareOp};
use crate::{
data::order::BookOrder,
enums::OrderSide,
orderbook::BookLevel,
types::{price::Price, quantity::QuantityRaw},
};
#[pymethods]
#[pyo3_stub_gen::derive::gen_stub_pymethods]
impl BookLevel {
fn __repr__(&self) -> String {
format!("{self:?}")
}
fn __str__(&self) -> String {
format!("{self:?}")
}
fn __richcmp__(&self, other: &Self, op: CompareOp, py: Python<'_>) -> Py<PyAny> {
match op {
CompareOp::Eq => self.eq(other).into_py_any_unwrap(py),
CompareOp::Ne => self.ne(other).into_py_any_unwrap(py),
CompareOp::Ge if self.side() == other.side() => self.ge(other).into_py_any_unwrap(py),
CompareOp::Gt if self.side() == other.side() => self.gt(other).into_py_any_unwrap(py),
CompareOp::Le if self.side() == other.side() => self.le(other).into_py_any_unwrap(py),
CompareOp::Lt if self.side() == other.side() => self.lt(other).into_py_any_unwrap(py),
CompareOp::Ge | CompareOp::Gt | CompareOp::Le | CompareOp::Lt => py.NotImplemented(),
}
}
fn __hash__(&self) -> isize {
let mut hasher = DefaultHasher::new();
self.side().hash(&mut hasher);
self.price.value.hash(&mut hasher);
hasher.finish() as isize
}
#[getter]
#[pyo3(name = "price")]
fn py_price(&self) -> Price {
self.price.value
}
#[getter]
#[pyo3(name = "side")]
fn py_side(&self) -> OrderSide {
self.side()
}
#[pyo3(name = "len")]
fn py_len(&self) -> usize {
self.len()
}
#[pyo3(name = "is_empty")]
fn py_is_empty(&self) -> bool {
self.is_empty()
}
#[pyo3(name = "size")]
fn py_size(&self) -> f64 {
self.size()
}
#[pyo3(name = "size_raw")]
fn py_size_raw(&self) -> QuantityRaw {
self.size_raw()
}
#[pyo3(name = "exposure")]
fn py_exposure(&self) -> f64 {
self.exposure()
}
#[pyo3(name = "exposure_raw")]
fn py_exposure_raw(&self) -> QuantityRaw {
self.exposure_raw()
}
#[pyo3(name = "first")]
fn py_fist(&self) -> Option<BookOrder> {
self.first().copied()
}
#[pyo3(name = "get_orders")]
fn py_get_orders(&self) -> Vec<BookOrder> {
self.get_orders()
}
}