1use serde::{Deserialize, Serialize};
2
3#[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#[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#[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#[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#[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#[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#[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 #[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}