nash_protocol/protocol/subscriptions/updated_orderbook/
response.rs1use super::super::super::{DataResponse, ResponseOrError};
2use super::request::SubscribeOrderbook;
3use crate::errors::Result;
4use crate::graphql::updated_orderbook;
5use crate::types::OrderbookOrder;
6use crate::protocol::state::State;
7use std::sync::Arc;
8use tokio::sync::RwLock;
9use bigdecimal::BigDecimal;
10use std::str::FromStr;
11
12#[derive(Clone, Debug)]
15pub struct SubscribeOrderbookResponse {
16 pub last_update_id: i64,
17 pub update_id: i64,
18 pub bids: Vec<OrderbookOrder>,
19 pub asks: Vec<OrderbookOrder>,
20}
21
22impl SubscribeOrderbook {
24 pub async fn response_from_graphql(
25 &self,
26 response: ResponseOrError<updated_orderbook::ResponseData>,
27 _state: Arc<RwLock<State>>
28 ) -> Result<ResponseOrError<SubscribeOrderbookResponse>> {
29 match response {
30 ResponseOrError::Response(data) => {
31 let response = data.data;
32 let book = response.updated_order_book;
33 let mut asks = Vec::new();
34 let mut bids = Vec::new();
35 for ask in book.asks {
36 asks.push(OrderbookOrder {
37 price: ask.price.amount.to_string(),
38 amount: BigDecimal::from_str(&ask.amount.amount)?,
39 });
40 }
41 for bid in book.bids {
42 bids.push(OrderbookOrder {
43 price: bid.price.amount.to_string(),
44 amount: BigDecimal::from_str(&bid.amount.amount)?,
45 });
46 }
47 Ok(ResponseOrError::Response(DataResponse {
48 data: SubscribeOrderbookResponse {
49 update_id: book.update_id,
50 last_update_id: book.last_update_id,
51 asks,
52 bids,
53 },
54 }))
55 }
56 ResponseOrError::Error(error) => Ok(ResponseOrError::Error(error)),
57 }
58 }
59}