nautilus_architect_ax/http/
query.rs1use serde::{Deserialize, Serialize};
26use ustr::Ustr;
27
28use crate::common::enums::{AxCandleWidth, AxOrderStatus};
29
30#[derive(Clone, Debug, Deserialize, Serialize)]
35pub struct GetTickerParams {
36 pub symbol: Ustr,
38}
39
40impl GetTickerParams {
41 #[must_use]
43 pub fn new(symbol: Ustr) -> Self {
44 Self { symbol }
45 }
46}
47
48#[derive(Clone, Debug, Deserialize, Serialize)]
53pub struct GetInstrumentParams {
54 pub symbol: Ustr,
56}
57
58impl GetInstrumentParams {
59 #[must_use]
61 pub fn new(symbol: Ustr) -> Self {
62 Self { symbol }
63 }
64}
65
66#[derive(Clone, Debug, Deserialize, Serialize)]
71pub struct GetCandlesParams {
72 pub symbol: Ustr,
74 pub start_timestamp_ns: i64,
76 pub end_timestamp_ns: i64,
78 pub candle_width: AxCandleWidth,
80}
81
82impl GetCandlesParams {
83 #[must_use]
85 pub fn new(
86 symbol: Ustr,
87 start_timestamp_ns: i64,
88 end_timestamp_ns: i64,
89 candle_width: AxCandleWidth,
90 ) -> Self {
91 Self {
92 symbol,
93 start_timestamp_ns,
94 end_timestamp_ns,
95 candle_width,
96 }
97 }
98}
99
100#[derive(Clone, Debug, Deserialize, Serialize)]
106pub struct GetCandleParams {
107 pub symbol: Ustr,
109 pub candle_width: AxCandleWidth,
111}
112
113impl GetCandleParams {
114 #[must_use]
116 pub fn new(symbol: Ustr, candle_width: AxCandleWidth) -> Self {
117 Self {
118 symbol,
119 candle_width,
120 }
121 }
122}
123
124#[derive(Clone, Debug, Deserialize, Serialize)]
129pub struct GetFundingRatesParams {
130 pub symbol: Ustr,
132 pub start_timestamp_ns: i64,
134 pub end_timestamp_ns: i64,
136}
137
138impl GetFundingRatesParams {
139 #[must_use]
141 pub fn new(symbol: Ustr, start_timestamp_ns: i64, end_timestamp_ns: i64) -> Self {
142 Self {
143 symbol,
144 start_timestamp_ns,
145 end_timestamp_ns,
146 }
147 }
148}
149
150#[derive(Clone, Debug, Deserialize, Serialize)]
155pub struct GetTransactionsParams {
156 pub transaction_types: Vec<String>,
158}
159
160impl GetTransactionsParams {
161 #[must_use]
163 pub fn new(transaction_types: Vec<String>) -> Self {
164 Self { transaction_types }
165 }
166}
167
168#[derive(Clone, Debug, Deserialize, Serialize)]
173pub struct GetTradesParams {
174 pub symbol: Ustr,
176 #[serde(skip_serializing_if = "Option::is_none")]
178 pub limit: Option<i32>,
179}
180
181impl GetTradesParams {
182 #[must_use]
184 pub fn new(symbol: Ustr, limit: Option<i32>) -> Self {
185 Self { symbol, limit }
186 }
187}
188
189#[derive(Clone, Debug, Deserialize, Serialize)]
194pub struct GetBookParams {
195 pub symbol: Ustr,
197 #[serde(skip_serializing_if = "Option::is_none")]
199 pub level: Option<i32>,
200}
201
202impl GetBookParams {
203 #[must_use]
205 pub fn new(symbol: Ustr, level: Option<i32>) -> Self {
206 Self { symbol, level }
207 }
208}
209
210#[derive(Clone, Debug, Deserialize, Serialize)]
217pub struct GetOrderStatusParams {
218 #[serde(skip_serializing_if = "Option::is_none")]
220 pub order_id: Option<String>,
221 #[serde(skip_serializing_if = "Option::is_none")]
223 pub client_order_id: Option<u64>,
224}
225
226impl GetOrderStatusParams {
227 #[must_use]
229 pub fn by_order_id(order_id: impl Into<String>) -> Self {
230 Self {
231 order_id: Some(order_id.into()),
232 client_order_id: None,
233 }
234 }
235
236 #[must_use]
238 pub fn by_client_order_id(cid: u64) -> Self {
239 Self {
240 order_id: None,
241 client_order_id: Some(cid),
242 }
243 }
244}
245
246#[derive(Clone, Debug, Default, Deserialize, Serialize)]
251pub struct GetOrdersParams {
252 #[serde(skip_serializing_if = "Option::is_none")]
254 pub symbol: Option<Ustr>,
255 #[serde(skip_serializing_if = "Option::is_none")]
257 pub start_time: Option<String>,
258 #[serde(skip_serializing_if = "Option::is_none")]
260 pub end_time: Option<String>,
261 #[serde(skip_serializing_if = "Option::is_none")]
263 pub limit: Option<i32>,
264 #[serde(skip_serializing_if = "Option::is_none")]
266 pub offset: Option<i32>,
267 #[serde(skip_serializing_if = "Option::is_none")]
269 pub order_state: Option<AxOrderStatus>,
270}
271
272impl GetOrdersParams {
273 #[must_use]
275 pub fn new() -> Self {
276 Self::default()
277 }
278}
279
280#[cfg(test)]
281mod tests {
282 use rstest::rstest;
283 use ustr::Ustr;
284
285 use super::*;
286
287 #[rstest]
288 fn test_get_ticker_params_serialization() {
289 let params = GetTickerParams::new(Ustr::from("GBPUSD-PERP"));
290 let qs = serde_urlencoded::to_string(¶ms).unwrap();
291 assert_eq!(qs, "symbol=GBPUSD-PERP");
292 }
293
294 #[rstest]
295 fn test_get_instrument_params_serialization() {
296 let params = GetInstrumentParams::new(Ustr::from("EURUSD-PERP"));
297 let qs = serde_urlencoded::to_string(¶ms).unwrap();
298 assert_eq!(qs, "symbol=EURUSD-PERP");
299 }
300
301 #[rstest]
302 fn test_get_candles_params_serialization() {
303 let params = GetCandlesParams::new(
304 Ustr::from("GBPUSD-PERP"),
305 1000000000,
306 2000000000,
307 AxCandleWidth::Minutes1,
308 );
309 let qs = serde_urlencoded::to_string(¶ms).unwrap();
310 assert!(qs.contains("symbol=GBPUSD-PERP"));
311 assert!(qs.contains("start_timestamp_ns=1000000000"));
312 assert!(qs.contains("end_timestamp_ns=2000000000"));
313 assert!(qs.contains("candle_width=1m"));
314 }
315
316 #[rstest]
317 fn test_get_candle_params_serialization() {
318 let params = GetCandleParams::new(Ustr::from("GBPUSD-PERP"), AxCandleWidth::Hours1);
319 let qs = serde_urlencoded::to_string(¶ms).unwrap();
320 assert!(qs.contains("symbol=GBPUSD-PERP"));
321 assert!(qs.contains("candle_width=1h"));
322 }
323
324 #[rstest]
325 fn test_get_funding_rates_params_serialization() {
326 let params = GetFundingRatesParams::new(Ustr::from("GBPUSD-PERP"), 1000000000, 2000000000);
327 let qs = serde_urlencoded::to_string(¶ms).unwrap();
328 assert!(qs.contains("symbol=GBPUSD-PERP"));
329 assert!(qs.contains("start_timestamp_ns=1000000000"));
330 assert!(qs.contains("end_timestamp_ns=2000000000"));
331 }
332
333 #[rstest]
334 fn test_get_trades_params_serialization() {
335 let params = GetTradesParams::new(Ustr::from("BTC-PERP"), Some(50));
336 let qs = serde_urlencoded::to_string(¶ms).unwrap();
337 assert!(qs.contains("symbol=BTC-PERP"));
338 assert!(qs.contains("limit=50"));
339 }
340
341 #[rstest]
342 fn test_get_trades_params_serialization_no_limit() {
343 let params = GetTradesParams::new(Ustr::from("BTC-PERP"), None);
344 let qs = serde_urlencoded::to_string(¶ms).unwrap();
345 assert_eq!(qs, "symbol=BTC-PERP");
346 }
347
348 #[rstest]
349 fn test_get_book_params_serialization() {
350 let params = GetBookParams::new(Ustr::from("EURUSD-PERP"), Some(3));
351 let qs = serde_urlencoded::to_string(¶ms).unwrap();
352 assert!(qs.contains("symbol=EURUSD-PERP"));
353 assert!(qs.contains("level=3"));
354 }
355
356 #[rstest]
357 fn test_get_order_status_by_order_id_serialization() {
358 let params = GetOrderStatusParams::by_order_id("O-01ARZ3NDEKTSV4RRFFQ69G5FAV");
359 let qs = serde_urlencoded::to_string(¶ms).unwrap();
360 assert!(qs.contains("order_id=O-01ARZ3NDEKTSV4RRFFQ69G5FAV"));
361 assert!(!qs.contains("client_order_id"));
362 }
363
364 #[rstest]
365 fn test_get_order_status_by_client_order_id_serialization() {
366 let params = GetOrderStatusParams::by_client_order_id(12345);
367 let qs = serde_urlencoded::to_string(¶ms).unwrap();
368 assert_eq!(qs, "client_order_id=12345");
369 }
370}