cbat 0.0.19

The unofficial Rust crate for the Coinbase Advanced Trade API
Documentation
use crate::client::Client;
use crate::websocket::{WebSocketClient, Channel};
use std::sync::Arc;

pub struct ApiWebSocket;

impl ApiWebSocket {
    pub async fn subscribe_heartbeats<'a>(
        client: &Arc<Client<'a>>,
    ) -> Result<WebSocketClient<'a>, Box<dyn std::error::Error>> {
        let mut ws_client = WebSocketClient::new(client.clone());
        ws_client.connect_market_data().await?;
        ws_client
            .subscribe(Channel::Heartbeats, None, false)
            .await?;
        Ok(ws_client)
    }

    pub async fn subscribe_candles<'a>(
        client: &Arc<Client<'a>>,
        product_ids: Vec<String>,
    ) -> Result<WebSocketClient<'a>, Box<dyn std::error::Error>> {
        let mut ws_client = WebSocketClient::new(client.clone());
        ws_client.connect_market_data().await?;
        ws_client
            .subscribe(Channel::Candles, Some(product_ids), false)
            .await?;
        Ok(ws_client)
    }

    pub async fn subscribe_status<'a>(
        client: &Arc<Client<'a>>,
        product_ids: Vec<String>,
    ) -> Result<WebSocketClient<'a>, Box<dyn std::error::Error>> {
        let mut ws_client = WebSocketClient::new(client.clone());
        ws_client.connect_market_data().await?;
        ws_client
            .subscribe(Channel::Status, Some(product_ids), false)
            .await?;
        Ok(ws_client)
    }

    pub async fn subscribe_ticker<'a>(
        client: &Arc<Client<'a>>,
        product_ids: Vec<String>,
    ) -> Result<WebSocketClient<'a>, Box<dyn std::error::Error>> {
        let mut ws_client = WebSocketClient::new(client.clone());
        ws_client.connect_market_data().await?;
        ws_client
            .subscribe(Channel::Ticker, Some(product_ids), false)
            .await?;
        Ok(ws_client)
    }

    pub async fn subscribe_ticker_batch<'a>(
        client: &Arc<Client<'a>>,
        product_ids: Vec<String>,
    ) -> Result<WebSocketClient<'a>, Box<dyn std::error::Error>> {
        let mut ws_client = WebSocketClient::new(client.clone());
        ws_client.connect_market_data().await?;
        ws_client
            .subscribe(Channel::TickerBatch, Some(product_ids), false)
            .await?;
        Ok(ws_client)
    }

    pub async fn subscribe_level2<'a>(
        client: &Arc<Client<'a>>,
        product_ids: Vec<String>,
    ) -> Result<WebSocketClient<'a>, Box<dyn std::error::Error>> {
        let mut ws_client = WebSocketClient::new(client.clone());
        ws_client.connect_market_data().await?;
        ws_client
            .subscribe(Channel::Level2, Some(product_ids), false)
            .await?;
        Ok(ws_client)
    }

    pub async fn subscribe_market_trades<'a>(
        client: &Arc<Client<'a>>,
        product_ids: Vec<String>,
    ) -> Result<WebSocketClient<'a>, Box<dyn std::error::Error>> {
        let mut ws_client = WebSocketClient::new(client.clone());
        ws_client.connect_market_data().await?;
        ws_client
            .subscribe(Channel::MarketTrades, Some(product_ids), false)
            .await?;
        Ok(ws_client)
    }

    pub async fn subscribe_user<'a>(
        client: &Arc<Client<'a>>,
        product_ids: Option<Vec<String>>,
    ) -> Result<WebSocketClient<'a>, Box<dyn std::error::Error>> {
        let mut ws_client = WebSocketClient::new(client.clone());
        ws_client.connect_user_data().await?;
        ws_client.subscribe(Channel::User, product_ids, true).await?;
        Ok(ws_client)
    }

    pub async fn subscribe_futures_balance_summary<'a>(
        client: &Arc<Client<'a>>,
    ) -> Result<WebSocketClient<'a>, Box<dyn std::error::Error>> {
        let mut ws_client = WebSocketClient::new(client.clone());
        ws_client.connect_user_data().await?;
        ws_client
            .subscribe(Channel::FuturesBalanceSummary, None, true)
            .await?;
        Ok(ws_client)
    }
}