use nautilus_core::{DurationNanos, python::to_pytype_err};
use pyo3::{IntoPyObjectExt, prelude::*};
use crate::models::latency::{LatencyModelAny, StaticLatencyModel};
#[pymethods]
#[pyo3_stub_gen::derive::gen_stub_pymethods]
impl StaticLatencyModel {
#[new]
#[pyo3(signature = (
base_latency_nanos = 0,
insert_latency_nanos = 0,
update_latency_nanos = 0,
cancel_latency_nanos = 0,
))]
fn py_new(
base_latency_nanos: u64,
insert_latency_nanos: u64,
update_latency_nanos: u64,
cancel_latency_nanos: u64,
) -> Self {
Self::new(
DurationNanos::new(base_latency_nanos),
DurationNanos::new(insert_latency_nanos),
DurationNanos::new(update_latency_nanos),
DurationNanos::new(cancel_latency_nanos),
)
}
fn __repr__(&self) -> String {
format!("{self:?}")
}
}
pub fn pyobject_to_latency_model_any(obj: &Bound<'_, PyAny>) -> PyResult<LatencyModelAny> {
if let Ok(m) = obj.extract::<StaticLatencyModel>() {
return Ok(LatencyModelAny::Static(m));
}
let type_name = obj.get_type().name()?;
Err(to_pytype_err(format!(
"Cannot convert {type_name} to LatencyModel"
)))
}
pub fn latency_model_any_to_pyobject(
py: Python<'_>,
model: &LatencyModelAny,
) -> PyResult<Py<PyAny>> {
match model {
LatencyModelAny::Static(model) => model.clone().into_py_any(py),
}
}