Skip to main content

bat_markets_core/
capability.rs

1use serde::{Deserialize, Serialize};
2
3/// Market-data capabilities for a venue adapter.
4#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
5pub struct MarketCapabilities {
6    pub ticker: bool,
7    pub recent_trades: bool,
8    pub book_top: bool,
9    pub order_book: bool,
10    pub klines: bool,
11    pub mark_price: bool,
12    pub funding_rate: bool,
13    pub open_interest: bool,
14    pub liquidations: bool,
15    pub public_streams: bool,
16    pub multi_symbol_streams: bool,
17}
18
19/// Trade capabilities for a venue adapter.
20#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
21pub struct TradeCapabilities {
22    pub create: bool,
23    pub batch_create: bool,
24    pub amend: bool,
25    pub cancel: bool,
26    pub batch_cancel: bool,
27    pub cancel_all: bool,
28    pub get: bool,
29    pub list_open: bool,
30    pub history: bool,
31    pub validate: bool,
32}
33
34/// Position capabilities for a venue adapter.
35#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
36pub struct PositionCapabilities {
37    pub read: bool,
38    pub leverage_set: bool,
39    pub margin_mode_set: bool,
40    pub position_mode_set: bool,
41    pub hedge_mode: bool,
42}
43
44/// Account capabilities for a venue adapter.
45#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
46pub struct AccountCapabilities {
47    pub read_balances: bool,
48    pub read_summary: bool,
49    pub private_streams: bool,
50}
51
52/// Asset capabilities remain intentionally narrow in `0.1.x`.
53#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
54pub struct AssetCapabilities {
55    pub read: bool,
56    pub transfer: bool,
57    pub withdraw: bool,
58    pub convert: bool,
59}
60
61/// Native-only capabilities.
62#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
63pub struct NativeCapabilities {
64    pub fast_stream: bool,
65    pub special_orders: bool,
66    pub ws_order_entry: bool,
67}
68
69/// Complete capability set exposed by a single venue/product adapter.
70#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
71pub struct CapabilitySet {
72    pub market: MarketCapabilities,
73    pub trade: TradeCapabilities,
74    pub position: PositionCapabilities,
75    pub account: AccountCapabilities,
76    pub asset: AssetCapabilities,
77    pub native: NativeCapabilities,
78}
79
80impl CapabilitySet {
81    /// Standard capability profile shared by current linear futures adapters.
82    #[must_use]
83    pub const fn linear_futures_defaults() -> Self {
84        Self {
85            market: MarketCapabilities {
86                ticker: true,
87                recent_trades: true,
88                book_top: true,
89                order_book: true,
90                klines: true,
91                mark_price: true,
92                funding_rate: true,
93                open_interest: true,
94                liquidations: false,
95                public_streams: true,
96                multi_symbol_streams: true,
97            },
98            trade: TradeCapabilities {
99                create: true,
100                batch_create: true,
101                amend: true,
102                cancel: true,
103                batch_cancel: true,
104                cancel_all: true,
105                get: true,
106                list_open: true,
107                history: true,
108                validate: true,
109            },
110            position: PositionCapabilities {
111                read: true,
112                leverage_set: true,
113                margin_mode_set: true,
114                position_mode_set: true,
115                hedge_mode: true,
116            },
117            account: AccountCapabilities {
118                read_balances: true,
119                read_summary: true,
120                private_streams: true,
121            },
122            asset: AssetCapabilities {
123                read: false,
124                transfer: false,
125                withdraw: false,
126                convert: false,
127            },
128            native: NativeCapabilities {
129                fast_stream: true,
130                special_orders: true,
131                ws_order_entry: true,
132            },
133        }
134    }
135
136    #[must_use]
137    pub fn supports_private_trading(self) -> bool {
138        self.trade.create && self.account.private_streams
139    }
140}
141
142#[cfg(test)]
143mod tests {
144    use super::*;
145
146    #[test]
147    fn linear_futures_defaults_cover_current_adapter_contract() {
148        let capabilities = CapabilitySet::linear_futures_defaults();
149
150        assert!(capabilities.supports_private_trading());
151        assert!(capabilities.market.ticker);
152        assert!(capabilities.market.multi_symbol_streams);
153        assert!(!capabilities.market.liquidations);
154        assert!(capabilities.trade.batch_create);
155        assert!(capabilities.position.hedge_mode);
156        assert!(capabilities.account.private_streams);
157        assert_eq!(capabilities.asset, AssetCapabilities::default());
158        assert!(capabilities.native.ws_order_entry);
159    }
160}