kraken_client/api/
get_order_book.rs

1use crate::{Client, Result};
2use serde::{de::DeserializeOwned, Deserialize};
3use std::collections::HashMap;
4
5/// - https://www.kraken.com/features/api#get-order-book
6/// - https://api.kraken.com/0/public/Depth
7#[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    /// Maximum number of asks/bids
16    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    /// ask side array of array entries(<price>, <volume>, <timestamp>)
43    pub asks: Vec<OrderBookTier>,
44    /// bid side array of array entries(<price>, <volume>, <timestamp>)
45    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}