nash_protocol/protocol/list_trades/
response.rs

1use std::str::FromStr;
2use chrono::{DateTime, Utc};
3use crate::errors::{ProtocolError, Result};
4use crate::graphql::list_trades;
5use crate::types::{AccountTradeSide, BuyOrSell, Trade};
6use super::types::ListTradesResponse;
7use bigdecimal::BigDecimal;
8use crate::protocol::traits::TryFromState;
9use crate::protocol::state::State;
10use std::sync::Arc;
11use tokio::sync::RwLock;
12use async_trait::async_trait;
13
14#[async_trait]
15impl TryFromState<list_trades::ResponseData> for ListTradesResponse {
16
17    async fn from(response: list_trades::ResponseData, _state: Arc<RwLock<State>>) -> Result<ListTradesResponse> {
18        let mut trades = Vec::new();
19
20        for trade_data in response.list_trades.trades {
21            let market = trade_data.market.name.clone();
22            let taker_fee = BigDecimal::from_str(&trade_data.taker_fee.amount)?;
23            let maker_fee = BigDecimal::from_str(&trade_data.maker_fee.amount)?;
24            let amount = BigDecimal::from_str(&trade_data.amount.amount)?;
25            let maker_recieved = BigDecimal::from_str(&trade_data.maker_received.amount)?;
26            let taker_recieved = BigDecimal::from_str(&trade_data.taker_received.amount)?;
27            let limit_price = BigDecimal::from_str(&trade_data.limit_price.amount)?;
28
29            trades.push(Trade {
30                id: trade_data.id,
31                taker_order_id: trade_data.taker_order_id.clone(),
32                maker_order_id: trade_data.maker_order_id.clone(),
33                amount,
34                executed_at: DateTime::<Utc>::from_str(&trade_data.executed_at)
35                    .map_err(|_| ProtocolError("Could not convert value to DateTime"))?,
36                account_side: trade_data.account_side.into(),
37                taker_fee,
38                maker_fee,
39                maker_recieved,
40                taker_recieved,
41                market,
42                direction: trade_data.direction.into(),
43                limit_price,
44            })
45        }
46
47        Ok(ListTradesResponse {
48            trades,
49            next_page: response.list_trades.next.clone(),
50        })
51    }
52}
53
54impl From<list_trades::Direction> for BuyOrSell {
55    fn from(response: list_trades::Direction) -> Self {
56        match response {
57            list_trades::Direction::BUY => Self::Buy,
58            list_trades::Direction::SELL => Self::Sell,
59            _ => panic!("Unexpected value in BuyOrSell enum"),
60        }
61    }
62}
63
64impl From<list_trades::AccountTradeSide> for AccountTradeSide {
65    fn from(trade_side: list_trades::AccountTradeSide) -> Self {
66        match trade_side {
67            list_trades::AccountTradeSide::MAKER => AccountTradeSide::Maker,
68            list_trades::AccountTradeSide::TAKER => AccountTradeSide::Taker,
69            list_trades::AccountTradeSide::NONE => AccountTradeSide::None,
70            _ => panic!("Unsupported value in AccountTradeSide"),
71        }
72    }
73}