#![allow(
clippy::missing_errors_doc,
reason = "errors documented on underlying Rust methods"
)]
pub mod canceller;
pub mod config;
pub mod enums;
pub mod factories;
pub mod http;
pub mod submitter;
pub mod urls;
pub mod websocket;
use nautilus_core::python::{to_pyruntime_err, to_pyvalue_err};
use nautilus_system::{
factories::{ClientConfig, DataClientFactory, ExecutionClientFactory},
get_global_pyo3_registry,
};
use pyo3::prelude::*;
use crate::{
config::{BitmexDataClientConfig, BitmexExecClientConfig},
factories::{BitmexDataClientFactory, BitmexExecFactoryConfig, BitmexExecutionClientFactory},
};
#[allow(clippy::needless_pass_by_value)]
fn extract_bitmex_data_factory(
py: Python<'_>,
factory: Py<PyAny>,
) -> PyResult<Box<dyn DataClientFactory>> {
match factory.extract::<BitmexDataClientFactory>(py) {
Ok(f) => Ok(Box::new(f)),
Err(e) => Err(to_pyvalue_err(format!(
"Failed to extract BitmexDataClientFactory: {e}"
))),
}
}
#[allow(clippy::needless_pass_by_value)]
fn extract_bitmex_exec_factory(
py: Python<'_>,
factory: Py<PyAny>,
) -> PyResult<Box<dyn ExecutionClientFactory>> {
match factory.extract::<BitmexExecutionClientFactory>(py) {
Ok(f) => Ok(Box::new(f)),
Err(e) => Err(to_pyvalue_err(format!(
"Failed to extract BitmexExecutionClientFactory: {e}"
))),
}
}
#[allow(clippy::needless_pass_by_value)]
fn extract_bitmex_data_config(
py: Python<'_>,
config: Py<PyAny>,
) -> PyResult<Box<dyn ClientConfig>> {
match config.extract::<BitmexDataClientConfig>(py) {
Ok(c) => Ok(Box::new(c)),
Err(e) => Err(to_pyvalue_err(format!(
"Failed to extract BitmexDataClientConfig: {e}"
))),
}
}
#[allow(clippy::needless_pass_by_value)]
fn extract_bitmex_exec_config(
py: Python<'_>,
config: Py<PyAny>,
) -> PyResult<Box<dyn ClientConfig>> {
match config.extract::<BitmexExecFactoryConfig>(py) {
Ok(c) => Ok(Box::new(c)),
Err(e) => Err(to_pyvalue_err(format!(
"Failed to extract BitmexExecFactoryConfig: {e}"
))),
}
}
#[pymodule]
pub fn bitmex(_: Python<'_>, m: &Bound<'_, PyModule>) -> PyResult<()> {
m.add("BITMEX_HTTP_URL", crate::common::consts::BITMEX_HTTP_URL)?;
m.add("BITMEX_WS_URL", crate::common::consts::BITMEX_WS_URL)?;
m.add_class::<crate::http::client::BitmexHttpClient>()?;
m.add_class::<crate::broadcast::canceller::CancelBroadcaster>()?;
m.add_class::<crate::broadcast::submitter::SubmitBroadcaster>()?;
m.add_class::<websocket::PyBitmexWebSocketClient>()?;
m.add_class::<BitmexDataClientConfig>()?;
m.add_class::<BitmexExecClientConfig>()?;
m.add_class::<BitmexExecFactoryConfig>()?;
m.add_class::<BitmexDataClientFactory>()?;
m.add_class::<BitmexExecutionClientFactory>()?;
m.add_function(wrap_pyfunction!(urls::get_bitmex_http_base_url, m)?)?;
m.add_function(wrap_pyfunction!(urls::get_bitmex_ws_url, m)?)?;
let registry = get_global_pyo3_registry();
if let Err(e) =
registry.register_factory_extractor("BITMEX".to_string(), extract_bitmex_data_factory)
{
return Err(to_pyruntime_err(format!(
"Failed to register BitMEX data factory extractor: {e}"
)));
}
if let Err(e) =
registry.register_exec_factory_extractor("BITMEX".to_string(), extract_bitmex_exec_factory)
{
return Err(to_pyruntime_err(format!(
"Failed to register BitMEX exec factory extractor: {e}"
)));
}
if let Err(e) = registry.register_config_extractor(
"BitmexDataClientConfig".to_string(),
extract_bitmex_data_config,
) {
return Err(to_pyruntime_err(format!(
"Failed to register BitMEX data config extractor: {e}"
)));
}
if let Err(e) = registry.register_config_extractor(
"BitmexExecFactoryConfig".to_string(),
extract_bitmex_exec_config,
) {
return Err(to_pyruntime_err(format!(
"Failed to register BitMEX exec config extractor: {e}"
)));
}
Ok(())
}