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