Skip to main content

nash_protocol/protocol/subscriptions/
mod.rs

1pub 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/// Wrapper for all subscription request types supported on Nash. Required only for current version
15/// of openlimits subscription logic
16#[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/// Wrapper for incoming subscription data supported on Nash. Required only for current version
27/// of openlimits subscription logic
28#[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}