nautilus_network/python/
mod.rs1#![allow(unexpected_cfgs)]
23
24pub mod http;
25pub mod socket;
26pub mod websocket;
27
28use std::num::NonZeroU32;
29
30use nautilus_core::python::to_pyexception;
31use pyo3::prelude::*;
32
33use crate::{
34 python::{
35 http::{HttpClientBuildError, HttpError, HttpInvalidProxyError, HttpTimeoutError},
36 websocket::WebSocketClientError,
37 },
38 ratelimiter::quota::Quota,
39};
40
41#[pymethods]
42impl Quota {
43 #[staticmethod]
49 pub fn rate_per_second(max_burst: u32) -> PyResult<Self> {
50 let max_burst = NonZeroU32::new(max_burst)
51 .ok_or_else(|| to_pyexception("Max burst capacity should be a non-zero integer"))?;
52 Self::per_second(max_burst).ok_or_else(|| {
53 to_pyexception(
54 "Max burst too large: replenish interval rounds to zero (max 1_000_000_000)",
55 )
56 })
57 }
58
59 #[staticmethod]
65 pub fn rate_per_minute(max_burst: u32) -> PyResult<Self> {
66 match NonZeroU32::new(max_burst) {
67 Some(max_burst) => Ok(Self::per_minute(max_burst)),
68 None => Err(to_pyexception(
69 "Max burst capacity should be a non-zero integer",
70 )),
71 }
72 }
73
74 #[staticmethod]
80 pub fn rate_per_hour(max_burst: u32) -> PyResult<Self> {
81 match NonZeroU32::new(max_burst) {
82 Some(max_burst) => Ok(Self::per_hour(max_burst)),
83 None => Err(to_pyexception(
84 "Max burst capacity should be a non-zero integer",
85 )),
86 }
87 }
88}
89
90#[pymodule]
96pub fn network(_py: Python<'_>, m: &Bound<'_, PyModule>) -> PyResult<()> {
97 m.add_class::<crate::http::HttpClient>()?;
98 m.add_class::<crate::http::HttpMethod>()?;
99 m.add_class::<crate::http::HttpResponse>()?;
100 m.add_class::<crate::ratelimiter::quota::Quota>()?;
101 m.add_class::<crate::websocket::WebSocketClient>()?;
102 m.add_class::<crate::websocket::WebSocketConfig>()?;
103 m.add_class::<crate::socket::SocketClient>()?;
104 m.add_class::<crate::socket::SocketConfig>()?;
105
106 m.add(
107 "WebSocketClientError",
108 m.py().get_type::<WebSocketClientError>(),
109 )?;
110 m.add("HttpError", m.py().get_type::<HttpError>())?;
111 m.add("HttpTimeoutError", m.py().get_type::<HttpTimeoutError>())?;
112 m.add(
113 "HttpInvalidProxyError",
114 m.py().get_type::<HttpInvalidProxyError>(),
115 )?;
116 m.add(
117 "HttpClientBuildError",
118 m.py().get_type::<HttpClientBuildError>(),
119 )?;
120
121 m.add_function(wrap_pyfunction!(http::http_get, m)?)?;
122 m.add_function(wrap_pyfunction!(http::http_post, m)?)?;
123 m.add_function(wrap_pyfunction!(http::http_patch, m)?)?;
124 m.add_function(wrap_pyfunction!(http::http_delete, m)?)?;
125 m.add_function(wrap_pyfunction!(http::http_download, m)?)?;
126
127 Ok(())
128}