crypto_ws_client/clients/bitget/
bitget_spot.rs

1use async_trait::async_trait;
2
3use crate::{
4    clients::common_traits::{
5        Candlestick, Level3OrderBook, OrderBook, OrderBookTopK, Ticker, Trade, BBO,
6    },
7    common::{command_translator::CommandTranslator, ws_client_internal::WSClientInternal},
8    WSClient,
9};
10
11use super::{
12    utils::{BitgetCommandTranslator, BitgetMessageHandler, UPLINK_LIMIT},
13    EXCHANGE_NAME,
14};
15
16const WEBSOCKET_URL: &str = "wss://ws.bitget.com/spot/v1/stream";
17
18/// The WebSocket client for Bitget Spot market.
19///
20/// * WebSocket API doc: <https://bitgetlimited.github.io/apidoc/en/spot/#websocketapi>
21/// * Trading at: <https://www.bitget.com/en/spot/>
22pub struct BitgetSpotWSClient {
23    client: WSClientInternal<BitgetMessageHandler>,
24    translator: BitgetCommandTranslator<'S'>,
25}
26
27impl BitgetSpotWSClient {
28    pub async fn new(tx: std::sync::mpsc::Sender<String>, url: Option<&str>) -> Self {
29        let real_url = match url {
30            Some(endpoint) => endpoint,
31            None => WEBSOCKET_URL,
32        };
33        BitgetSpotWSClient {
34            client: WSClientInternal::connect(
35                EXCHANGE_NAME,
36                real_url,
37                BitgetMessageHandler {},
38                Some(UPLINK_LIMIT),
39                tx,
40            )
41            .await,
42            translator: BitgetCommandTranslator::<'S'> {},
43        }
44    }
45}
46
47impl_trait!(Trade, BitgetSpotWSClient, subscribe_trade, "trade");
48#[rustfmt::skip]
49impl_trait!(OrderBookTopK, BitgetSpotWSClient, subscribe_orderbook_topk, "books15");
50impl_trait!(OrderBook, BitgetSpotWSClient, subscribe_orderbook, "books");
51impl_trait!(Ticker, BitgetSpotWSClient, subscribe_ticker, "ticker");
52impl_candlestick!(BitgetSpotWSClient);
53
54panic_bbo!(BitgetSpotWSClient);
55panic_l3_orderbook!(BitgetSpotWSClient);
56
57impl_ws_client_trait!(BitgetSpotWSClient);