nautilus_dydx/python/
mod.rs1#![expect(
19 clippy::missing_errors_doc,
20 reason = "errors documented on underlying Rust methods"
21)]
22
23pub mod config;
24pub mod encoder;
25pub mod enums;
26pub mod factories;
27pub mod grpc;
28pub mod http;
29pub mod submitter;
30pub mod types;
31pub mod urls;
32pub mod wallet;
33pub mod websocket;
34
35use nautilus_common::factories::{ClientConfig, DataClientFactory, ExecutionClientFactory};
36use nautilus_core::python::{to_pyruntime_err, to_pyvalue_err};
37use nautilus_system::get_global_pyo3_registry;
38use pyo3::prelude::*;
39
40use crate::{
41 common::consts::DYDX,
42 config::{DydxDataClientConfig, DydxExecClientConfig},
43 factories::{DydxDataClientFactory, DydxExecutionClientFactory},
44};
45
46#[expect(clippy::needless_pass_by_value)]
47fn extract_dydx_data_factory(
48 py: Python<'_>,
49 factory: Py<PyAny>,
50) -> PyResult<Box<dyn DataClientFactory>> {
51 match factory.extract::<DydxDataClientFactory>(py) {
52 Ok(f) => Ok(Box::new(f)),
53 Err(e) => Err(to_pyvalue_err(format!(
54 "Failed to extract DydxDataClientFactory: {e}"
55 ))),
56 }
57}
58
59#[expect(clippy::needless_pass_by_value)]
60fn extract_dydx_exec_factory(
61 py: Python<'_>,
62 factory: Py<PyAny>,
63) -> PyResult<Box<dyn ExecutionClientFactory>> {
64 match factory.extract::<DydxExecutionClientFactory>(py) {
65 Ok(f) => Ok(Box::new(f)),
66 Err(e) => Err(to_pyvalue_err(format!(
67 "Failed to extract DydxExecutionClientFactory: {e}"
68 ))),
69 }
70}
71
72#[expect(clippy::needless_pass_by_value)]
73fn extract_dydx_data_config(py: Python<'_>, config: Py<PyAny>) -> PyResult<Box<dyn ClientConfig>> {
74 match config.extract::<DydxDataClientConfig>(py) {
75 Ok(c) => Ok(Box::new(c)),
76 Err(e) => Err(to_pyvalue_err(format!(
77 "Failed to extract DydxDataClientConfig: {e}"
78 ))),
79 }
80}
81
82#[expect(clippy::needless_pass_by_value)]
83fn extract_dydx_exec_config(py: Python<'_>, config: Py<PyAny>) -> PyResult<Box<dyn ClientConfig>> {
84 match config.extract::<DydxExecClientConfig>(py) {
85 Ok(c) => Ok(Box::new(c)),
86 Err(e) => Err(to_pyvalue_err(format!(
87 "Failed to extract DydxExecClientConfig: {e}"
88 ))),
89 }
90}
91
92#[pymodule]
93pub fn dydx(_: Python<'_>, m: &Bound<'_, PyModule>) -> PyResult<()> {
94 m.add_class::<crate::http::client::DydxHttpClient>()?;
95 m.add_class::<crate::websocket::client::DydxWebSocketClient>()?;
96 m.add_class::<crate::common::enums::DydxNetwork>()?;
97 m.add_class::<crate::common::enums::DydxOrderSide>()?;
98 m.add_class::<crate::common::enums::DydxOrderType>()?;
99 m.add_class::<crate::types::DydxOraclePrice>()?;
100 m.add_class::<wallet::PyDydxWallet>()?;
101 m.add_class::<grpc::PyDydxGrpcClient>()?;
102 m.add_class::<submitter::PyDydxOrderSubmitter>()?;
103 m.add_class::<encoder::PyDydxClientOrderIdEncoder>()?;
104 m.add_class::<DydxDataClientConfig>()?;
105 m.add_class::<DydxExecClientConfig>()?;
106 m.add_class::<DydxDataClientFactory>()?;
107 m.add_class::<DydxExecutionClientFactory>()?;
108 m.add_function(wrap_pyfunction!(urls::py_get_dydx_grpc_urls, m)?)?;
109 m.add_function(wrap_pyfunction!(urls::py_get_dydx_grpc_url, m)?)?;
110 m.add_function(wrap_pyfunction!(urls::py_get_dydx_http_url, m)?)?;
111 m.add_function(wrap_pyfunction!(urls::py_get_dydx_ws_url, m)?)?;
112
113 let registry = get_global_pyo3_registry();
114
115 if let Err(e) = registry.register_factory_extractor(DYDX.to_string(), extract_dydx_data_factory)
116 {
117 return Err(to_pyruntime_err(format!(
118 "Failed to register dYdX data factory extractor: {e}"
119 )));
120 }
121
122 if let Err(e) =
123 registry.register_exec_factory_extractor(DYDX.to_string(), extract_dydx_exec_factory)
124 {
125 return Err(to_pyruntime_err(format!(
126 "Failed to register dYdX exec factory extractor: {e}"
127 )));
128 }
129
130 if let Err(e) = registry
131 .register_config_extractor("DydxDataClientConfig".to_string(), extract_dydx_data_config)
132 {
133 return Err(to_pyruntime_err(format!(
134 "Failed to register dYdX data config extractor: {e}"
135 )));
136 }
137
138 if let Err(e) = registry
139 .register_config_extractor("DydxExecClientConfig".to_string(), extract_dydx_exec_config)
140 {
141 return Err(to_pyruntime_err(format!(
142 "Failed to register dYdX exec config extractor: {e}"
143 )));
144 }
145
146 Ok(())
147}