use serde::{Deserialize, Serialize};
use tracing::{instrument, trace};
use crate::error::Result;
use super::Client;
use super::pricing::Side;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PriceLevel {
pub price: String,
pub size: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OrderBookSummary {
pub market: String,
pub asset_id: String,
pub timestamp: String,
pub hash: String,
pub bids: Vec<PriceLevel>,
pub asks: Vec<PriceLevel>,
pub min_order_size: String,
pub tick_size: String,
pub neg_risk: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GetOrderBooksRequestItem {
pub token_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub side: Option<Side>,
}
impl Client {
#[instrument(skip(self), fields(token_id = %token_id), level = "trace")]
pub async fn get_order_book(&self, token_id: &str) -> Result<OrderBookSummary> {
let mut url = self.build_url("book");
url.query_pairs_mut().append_pair("token_id", token_id);
trace!(url = %url, method = "GET", "sending HTTP request");
let response = self.http_client.get(url).send().await?;
let response = self.check_response(response).await?;
let order_book: OrderBookSummary = response.json().await?;
trace!(
market = %order_book.market,
bids_count = order_book.bids.len(),
asks_count = order_book.asks.len(),
"received order book"
);
Ok(order_book)
}
#[instrument(skip(self, request), level = "trace")]
pub async fn get_order_books(
&self,
request: &[GetOrderBooksRequestItem],
) -> Result<Vec<OrderBookSummary>> {
let url = self.build_url("books");
trace!(url = %url, method = "POST", count = request.len(), "sending HTTP request");
let response = self.http_client.post(url).json(request).send().await?;
let response = self.check_response(response).await?;
let order_books: Vec<OrderBookSummary> = response.json().await?;
trace!(count = order_books.len(), "received order books");
Ok(order_books)
}
}