rusty_feeder/exchange/coinbase/data/
subscription_converter.rs

1//! CoinbaseSubscriptionConverter - Conversion between standardized options and Coinbase-specific formats
2//!
3//! This module provides functions to convert from the standardized SubscriptionOptions
4//! structure to Coinbase-specific subscription formats.
5
6use smallvec::SmallVec;
7use smartstring::alias::String;
8
9use super::subscription::{SubscriptionChannel, SubscriptionMessage};
10use crate::provider::prelude::*;
11
12/// Convert from standardized SubscriptionOptions to Coinbase subscription format
13#[inline]
14pub fn options_to_coinbase_subscription(options: &SubscriptionOptions) -> SubscriptionMessage {
15    match options.subscription_type {
16        SubscriptionType::Trade => create_trade_subscription(options.symbols.clone()),
17        SubscriptionType::OrderBook => create_orderbook_subscription(options.symbols.clone()),
18        SubscriptionType::Ticker => create_ticker_subscription(options.symbols.clone()),
19        // Use the UserData type to handle heartbeat subscriptions
20        SubscriptionType::UserData => create_heartbeat_subscription(options.symbols.clone()),
21        _ => {
22            // Create empty subscription for unsupported types
23            SubscriptionMessage::new(vec![])
24        }
25    }
26}
27
28/// Create a trade subscription message for Coinbase WebSocket
29#[inline]
30pub fn create_trade_subscription(symbols: SmallVec<[String; 8]>) -> SubscriptionMessage {
31    let channel = SubscriptionChannel {
32        name: "matches".into(),
33        product_ids: symbols.to_vec(),
34    };
35
36    SubscriptionMessage::new(vec![channel])
37}
38
39/// Create an orderbook subscription message for Coinbase WebSocket
40#[inline]
41pub fn create_orderbook_subscription(symbols: SmallVec<[String; 8]>) -> SubscriptionMessage {
42    let channel = SubscriptionChannel {
43        name: "level2".into(),
44        product_ids: symbols.to_vec(),
45    };
46
47    SubscriptionMessage::new(vec![channel])
48}
49
50/// Create a ticker subscription message for Coinbase WebSocket
51#[inline]
52pub fn create_ticker_subscription(symbols: SmallVec<[String; 8]>) -> SubscriptionMessage {
53    let channel = SubscriptionChannel {
54        name: "ticker".into(),
55        product_ids: symbols.to_vec(),
56    };
57
58    SubscriptionMessage::new(vec![channel])
59}
60
61/// Create a heartbeat subscription message for Coinbase WebSocket
62#[inline]
63pub fn create_heartbeat_subscription(symbols: SmallVec<[String; 8]>) -> SubscriptionMessage {
64    let channel = SubscriptionChannel {
65        name: "heartbeat".into(),
66        product_ids: symbols.to_vec(),
67    };
68
69    SubscriptionMessage::new(vec![channel])
70}
71
72/// Create a status subscription message for Coinbase WebSocket
73#[inline]
74pub fn create_status_subscription() -> SubscriptionMessage {
75    let channel = SubscriptionChannel {
76        name: "status".into(),
77        product_ids: vec![],
78    };
79
80    SubscriptionMessage::new(vec![channel])
81}