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