kraken_client/api/
get_order_book.rs1use crate::{Client, Result};
2use serde::{de::DeserializeOwned, Deserialize};
3use std::collections::HashMap;
4
5#[must_use = "Does nothing until you send or execute it"]
8pub struct GetOrderBookRequest {
9 client: Client,
10 pair: String,
11 count: Option<i32>,
12}
13
14impl GetOrderBookRequest {
15 pub fn count(self, count: i32) -> Self {
17 Self {
18 count: Some(count),
19 ..self
20 }
21 }
22
23 pub async fn execute<T: DeserializeOwned>(self) -> Result<T> {
24 let mut url = format!("/0/public/Depth?pair={}", &self.pair);
25
26 if let Some(count) = &self.count {
27 url.push_str(&format!("&count={}", count));
28 }
29
30 self.client.send_public(&url).await
31 }
32
33 pub async fn send(self) -> Result<GetOrderBookResponse> {
34 self.execute().await
35 }
36}
37#[derive(Debug, Deserialize)]
38pub struct OrderBookTier(String, String, i32);
39
40#[derive(Debug, Deserialize)]
41pub struct OrderBook {
42 pub asks: Vec<OrderBookTier>,
44 pub bids: Vec<OrderBookTier>,
46}
47
48pub type GetOrderBookResponse = HashMap<String, OrderBook>;
49
50impl Client {
51 pub fn get_order_book(&self, pair: &str) -> GetOrderBookRequest {
52 GetOrderBookRequest {
53 client: self.clone(),
54 pair: String::from(pair),
55 count: None,
56 }
57 }
58}
59
60#[cfg(test)]
61mod tests {
62 use crate::Client;
63
64 #[test]
65 fn get_order_book() {
66 let rt = tokio::runtime::Runtime::new().unwrap();
67
68 rt.block_on(async {
69 let client = Client::default();
70
71 let resp = client.get_order_book("XXBTZUSD").count(5).send().await;
72
73 match resp {
74 Ok(resp) => println!("{:?}", resp),
75 Err(error) => eprintln!("{:?}", error),
76 }
77 });
78 }
79}