nautilus_kraken/http/
mod.rs1use jiff::Timestamp;
24
25pub mod error;
26pub mod futures;
27pub mod models;
28pub mod spot;
29
30pub(crate) mod coverage;
31
32pub(crate) fn apply_count_limit<T>(
40 items: &mut Vec<T>,
41 start: Option<Timestamp>,
42 limit: Option<u64>,
43) {
44 if let Some(limit) = limit {
45 let limit = limit as usize;
46 if items.len() > limit {
47 if start.is_some() {
48 items.truncate(limit);
49 } else {
50 items.drain(..items.len() - limit);
51 }
52 }
53 }
54}
55
56pub use error::KrakenHttpError;
58pub use futures::{
59 client::{
60 KRAKEN_FUTURES_DEFAULT_RATE_LIMIT_PER_SECOND, KrakenFuturesHttpClient,
61 KrakenFuturesRawHttpClient,
62 },
63 query::*,
64};
65pub use spot::{
66 client::{
67 KRAKEN_SPOT_DEFAULT_RATE_LIMIT_PER_SECOND, KrakenSpotHttpClient, KrakenSpotRawHttpClient,
68 },
69 query::*,
70};
71
72#[cfg(test)]
73mod tests {
74 use nautilus_core::UnixNanos;
75 use nautilus_model::{
76 data::{Bar, BarType},
77 types::{Price, Quantity},
78 };
79 use rstest::rstest;
80
81 use super::*;
82
83 fn ascending_bars(n: u64) -> Vec<Bar> {
86 let bar_type = BarType::from("ETH/USD.KRAKEN-1-MINUTE-LAST-EXTERNAL");
87 let price = Price::from("100.0");
88 let volume = Quantity::from("1");
89 (1..=n)
90 .map(|i| {
91 Bar::new(
92 bar_type,
93 price,
94 price,
95 price,
96 price,
97 volume,
98 UnixNanos::from(i),
99 UnixNanos::default(),
100 )
101 })
102 .collect()
103 }
104
105 #[rstest]
106 fn test_apply_count_limit_no_limit_keeps_all() {
107 let mut bars = ascending_bars(5);
108 apply_count_limit(&mut bars, None, None);
109 assert_eq!(bars.len(), 5);
110 }
111
112 #[rstest]
113 fn test_apply_count_limit_count_only_keeps_most_recent() {
114 let mut bars = ascending_bars(10);
115 apply_count_limit(&mut bars, None, Some(3));
116 let ts: Vec<u64> = bars.iter().map(|b| b.ts_event.as_u64()).collect();
117 assert_eq!(ts, vec![8, 9, 10]);
118 }
119
120 #[rstest]
121 fn test_apply_count_limit_with_start_keeps_oldest() {
122 let mut bars = ascending_bars(10);
123 let start = Some(Timestamp::UNIX_EPOCH);
124 apply_count_limit(&mut bars, start, Some(3));
125 let ts: Vec<u64> = bars.iter().map(|b| b.ts_event.as_u64()).collect();
126 assert_eq!(ts, vec![1, 2, 3]);
127 }
128
129 #[rstest]
130 fn test_apply_count_limit_fewer_bars_than_limit() {
131 let mut bars = ascending_bars(2);
132 apply_count_limit(&mut bars, None, Some(5));
133 assert_eq!(bars.len(), 2);
134 }
135}