nash_protocol/protocol/subscriptions/
mod.rs1pub mod trades;
2pub mod new_account_trades;
3pub mod updated_account_orders;
4pub mod updated_account_balances;
5pub mod updated_orderbook;
6pub mod updated_ticker;
7use super::graphql::ResponseOrError;
8use super::{NashProtocolSubscription, State};
9use crate::errors::Result;
10use async_trait::async_trait;
11use tokio::sync::RwLock;
12use std::sync::Arc;
13
14#[derive(Clone, Debug)]
17pub enum SubscriptionRequest {
18 Trades(trades::SubscribeTrades),
19 Ticker(updated_ticker::SubscribeTicker),
20 Orderbook(updated_orderbook::SubscribeOrderbook),
21 AccountTrades(new_account_trades::SubscribeAccountTrades),
22 AccountOrders(updated_account_orders::SubscribeAccountOrders),
23 AccountBalances(updated_account_balances::SubscribeAccountBalances),
24}
25
26#[derive(Clone, Debug)]
29pub enum SubscriptionResponse {
30 Orderbook(updated_orderbook::SubscribeOrderbookResponse),
31 Ticker(updated_ticker::SubscribeTickerResponse),
32 Trades(trades::TradesResponse),
33 AccountTrades(new_account_trades::AccountTradesResponse),
34 AccountOrders(updated_account_orders::AccountOrdersResponse),
35 AccountBalances(updated_account_balances::AccountBalancesResponse),
36}
37
38#[async_trait]
39impl NashProtocolSubscription for SubscriptionRequest {
40 type SubscriptionResponse = SubscriptionResponse;
41 async fn graphql(&self, state: Arc<RwLock<State>>) -> Result<serde_json::Value> {
42 match self {
43 Self::Trades(trades_req) => trades_req.graphql(state).await,
44 Self::Ticker(ticker_req) => ticker_req.graphql(state).await,
45 Self::Orderbook(orderbook_req) => orderbook_req.graphql(state).await,
46 Self::AccountTrades(account_trades_req) => account_trades_req.graphql(state).await,
47 Self::AccountOrders(account_orders_req) => account_orders_req.graphql(state).await,
48 Self::AccountBalances(account_balance_req) => account_balance_req.graphql(state).await
49 }
50 }
51 async fn subscription_response_from_json(
52 &self,
53 response: serde_json::Value,
54 state: Arc<RwLock<State>>,
55 ) -> Result<ResponseOrError<Self::SubscriptionResponse>> {
56 match self {
57 Self::Trades(trades_req) => Ok(trades_req
58 .subscription_response_from_json(response, state)
59 .await?
60 .map(Box::new(|res| SubscriptionResponse::Trades(res)))),
61 Self::AccountTrades(account_trades_req) => Ok(account_trades_req
62 .subscription_response_from_json(response, state)
63 .await?
64 .map(Box::new(|res| SubscriptionResponse::AccountTrades(res)))),
65 Self::AccountOrders(account_orders_req) => Ok(account_orders_req
66 .subscription_response_from_json(response, state)
67 .await?
68 .map(Box::new(|res| SubscriptionResponse::AccountOrders(res)))),
69 Self::AccountBalances(account_balances_req) => Ok(account_balances_req
70 .subscription_response_from_json(response, state)
71 .await?
72 .map(Box::new(|res| SubscriptionResponse::AccountBalances(res)))),
73 Self::Ticker(ticker_req) => Ok(ticker_req
74 .subscription_response_from_json(response, state)
75 .await?
76 .map(Box::new(|res| SubscriptionResponse::Ticker(res)))),
77 Self::Orderbook(orderbook_req) => Ok(orderbook_req
78 .subscription_response_from_json(response, state)
79 .await?
80 .map(Box::new(|res| SubscriptionResponse::Orderbook(res)))),
81 }
82 }
83 async fn wrap_response_as_any_subscription(
84 &self,
85 response: serde_json::Value,
86 state: Arc<RwLock<State>>,
87 ) -> Result<ResponseOrError<SubscriptionResponse>> {
88 let response = self
89 .subscription_response_from_json(response, state)
90 .await?;
91 Ok(response)
92 }
93}