nautilus_binance/futures/http/
query.rs1use derive_builder::Builder;
19use serde::{Deserialize, Serialize};
20
21use crate::common::enums::BinanceIncomeType;
22
23#[derive(Clone, Debug, Default, Deserialize, Serialize, Builder)]
25#[builder(setter(into, strip_option), default)]
26pub struct BinanceDepthParams {
27 pub symbol: String,
29 #[serde(skip_serializing_if = "Option::is_none")]
31 pub limit: Option<u32>,
32}
33
34#[derive(Clone, Debug, Deserialize, Serialize, Default, Builder)]
36#[builder(default)]
37#[builder(setter(into, strip_option))]
38pub struct BinanceTicker24hrParams {
39 #[serde(skip_serializing_if = "Option::is_none")]
41 pub symbol: Option<String>,
42}
43
44#[derive(Clone, Debug, Deserialize, Serialize, Default, Builder)]
46#[builder(default)]
47#[builder(setter(into, strip_option))]
48pub struct BinanceBookTickerParams {
49 #[serde(skip_serializing_if = "Option::is_none")]
51 pub symbol: Option<String>,
52}
53
54#[derive(Clone, Debug, Deserialize, Serialize, Default, Builder)]
56#[builder(default)]
57#[builder(setter(into, strip_option))]
58pub struct BinanceMarkPriceParams {
59 #[serde(skip_serializing_if = "Option::is_none")]
61 pub symbol: Option<String>,
62}
63
64#[derive(Clone, Debug, Deserialize, Serialize, Default, Builder)]
66#[builder(default)]
67#[builder(setter(into, strip_option))]
68pub struct BinanceFundingRateParams {
69 #[serde(skip_serializing_if = "Option::is_none")]
71 pub symbol: Option<String>,
72 #[serde(rename = "startTime", skip_serializing_if = "Option::is_none")]
74 pub start_time: Option<i64>,
75 #[serde(rename = "endTime", skip_serializing_if = "Option::is_none")]
77 pub end_time: Option<i64>,
78 #[serde(skip_serializing_if = "Option::is_none")]
80 pub limit: Option<u32>,
81}
82
83#[derive(Clone, Debug, Deserialize, Serialize, Builder)]
85#[builder(setter(into))]
86pub struct BinanceOpenInterestParams {
87 pub symbol: String,
89}
90
91#[derive(Clone, Debug, Deserialize, Serialize, Default, Builder)]
93#[builder(default)]
94#[builder(setter(into, strip_option))]
95pub struct BinanceFuturesBalanceParams {
96 #[serde(skip_serializing_if = "Option::is_none")]
98 pub asset: Option<String>,
99 #[serde(rename = "recvWindow", skip_serializing_if = "Option::is_none")]
101 pub recv_window: Option<u64>,
102}
103
104#[derive(Clone, Debug, Deserialize, Serialize, Default, Builder)]
106#[builder(default)]
107#[builder(setter(into, strip_option))]
108pub struct BinancePositionRiskParams {
109 #[serde(skip_serializing_if = "Option::is_none")]
111 pub symbol: Option<String>,
112 #[serde(rename = "recvWindow", skip_serializing_if = "Option::is_none")]
114 pub recv_window: Option<u64>,
115}
116
117#[derive(Clone, Debug, Deserialize, Serialize, Default, Builder)]
119#[builder(default)]
120#[builder(setter(into, strip_option))]
121pub struct BinanceIncomeHistoryParams {
122 #[serde(skip_serializing_if = "Option::is_none")]
124 pub symbol: Option<String>,
125 #[serde(rename = "incomeType", skip_serializing_if = "Option::is_none")]
127 pub income_type: Option<BinanceIncomeType>,
128 #[serde(rename = "startTime", skip_serializing_if = "Option::is_none")]
130 pub start_time: Option<i64>,
131 #[serde(rename = "endTime", skip_serializing_if = "Option::is_none")]
133 pub end_time: Option<i64>,
134 #[serde(skip_serializing_if = "Option::is_none")]
136 pub limit: Option<u32>,
137 #[serde(rename = "recvWindow", skip_serializing_if = "Option::is_none")]
139 pub recv_window: Option<u64>,
140}
141
142#[derive(Clone, Debug, Default, Deserialize, Serialize, Builder)]
144#[builder(setter(into, strip_option), default)]
145pub struct BinanceUserTradesParams {
146 pub symbol: String,
148 #[serde(rename = "startTime", skip_serializing_if = "Option::is_none")]
150 pub start_time: Option<i64>,
151 #[serde(rename = "endTime", skip_serializing_if = "Option::is_none")]
153 pub end_time: Option<i64>,
154 #[serde(rename = "fromId", skip_serializing_if = "Option::is_none")]
156 pub from_id: Option<i64>,
157 #[serde(skip_serializing_if = "Option::is_none")]
159 pub limit: Option<u32>,
160 #[serde(rename = "recvWindow", skip_serializing_if = "Option::is_none")]
162 pub recv_window: Option<u64>,
163}
164
165#[derive(Clone, Debug, Deserialize, Serialize, Default, Builder)]
167#[builder(default)]
168#[builder(setter(into, strip_option))]
169pub struct BinanceOpenOrdersParams {
170 #[serde(skip_serializing_if = "Option::is_none")]
172 pub symbol: Option<String>,
173 #[serde(rename = "recvWindow", skip_serializing_if = "Option::is_none")]
175 pub recv_window: Option<u64>,
176}
177
178#[derive(Clone, Debug, Default, Deserialize, Serialize, Builder)]
180#[builder(setter(into, strip_option), default)]
181pub struct BinanceOrderQueryParams {
182 pub symbol: String,
184 #[serde(rename = "orderId", skip_serializing_if = "Option::is_none")]
186 pub order_id: Option<i64>,
187 #[serde(rename = "origClientOrderId", skip_serializing_if = "Option::is_none")]
189 pub orig_client_order_id: Option<String>,
190 #[serde(rename = "recvWindow", skip_serializing_if = "Option::is_none")]
192 pub recv_window: Option<u64>,
193}
194
195#[cfg(test)]
196mod tests {
197 use rstest::rstest;
198
199 use super::*;
200
201 #[rstest]
202 fn test_depth_params_builder() {
203 let params = BinanceDepthParamsBuilder::default()
204 .symbol("BTCUSDT")
205 .limit(100u32)
206 .build()
207 .unwrap();
208
209 assert_eq!(params.symbol, "BTCUSDT");
210 assert_eq!(params.limit, Some(100));
211 }
212
213 #[rstest]
214 fn test_ticker_params_serialization() {
215 let params = BinanceTicker24hrParams {
216 symbol: Some("BTCUSDT".to_string()),
217 };
218
219 let serialized = serde_urlencoded::to_string(¶ms).unwrap();
220 assert_eq!(serialized, "symbol=BTCUSDT");
221 }
222
223 #[rstest]
224 fn test_order_query_params_builder() {
225 let params = BinanceOrderQueryParamsBuilder::default()
226 .symbol("BTCUSDT")
227 .order_id(12345_i64)
228 .recv_window(5_000_u64)
229 .build()
230 .unwrap();
231
232 assert_eq!(params.symbol, "BTCUSDT");
233 assert_eq!(params.order_id, Some(12345));
234 assert_eq!(params.recv_window, Some(5_000));
235 }
236
237 #[rstest]
238 fn test_income_history_params_serialization() {
239 let params = BinanceIncomeHistoryParamsBuilder::default()
240 .symbol("ETHUSDT")
241 .income_type(BinanceIncomeType::FundingFee)
242 .limit(50_u32)
243 .build()
244 .unwrap();
245
246 let serialized = serde_urlencoded::to_string(¶ms).unwrap();
247 assert_eq!(serialized, "symbol=ETHUSDT&incomeType=FUNDING_FEE&limit=50");
248 }
249
250 #[rstest]
251 fn test_open_orders_params_builder() {
252 let params = BinanceOpenOrdersParamsBuilder::default()
253 .symbol("BNBUSDT")
254 .build()
255 .unwrap();
256
257 assert_eq!(params.symbol.as_deref(), Some("BNBUSDT"));
258 assert!(params.recv_window.is_none());
259 }
260}