maxt_bindings_common/contract.rs
1use maxt::{
2 AccountStream, AssetNetwork, Balance, BoxFuture, CancelOrdersRequest, CancelOrdersResult,
3 Candle, CandleRequest, Deposit, DepositAddress, DepositAddressEntry, DepositAddressRequest,
4 FundingPayment, FundingRate, HistoryRequest, MarginRequest, MarginSummary, Market, MarketInfo,
5 MarketKind, MarketStream, Order, OrderBook, OrderHistoryRequest, OrderLookupRequest,
6 OrderRequest, OrderRules, Page, Position, Result, StreamConfig, Subscription, Ticker, Trade,
7 TransferHistoryRequest, TransferLookupRequest, WithdrawRequest, Withdrawal, WithdrawalQuote,
8};
9
10/// An owned call across a language binding boundary.
11#[derive(Debug, Clone, PartialEq, Eq)]
12#[non_exhaustive]
13pub enum AdapterCall {
14 /// Lists markets of one kind.
15 Markets {
16 /// The requested instrument kind.
17 kind: MarketKind,
18 },
19 /// Reads recent trades.
20 Trades {
21 /// The market to read.
22 market: Market,
23 /// The maximum requested row count.
24 limit: Option<u32>,
25 },
26 /// Reads an order book snapshot.
27 OrderBook {
28 /// The market to read.
29 market: Market,
30 /// The requested levels per side.
31 depth: Option<u32>,
32 },
33 /// Reads a ticker.
34 Ticker {
35 /// The market to read.
36 market: Market,
37 },
38 /// Reads historical candles.
39 Candles {
40 /// The complete candle request.
41 request: CandleRequest,
42 },
43 /// Opens a market-data stream.
44 Subscribe {
45 /// The requested markets and feeds.
46 subscription: Subscription,
47 /// Connection and buffering settings.
48 config: StreamConfig,
49 },
50 /// Reads account balances.
51 Balances,
52 /// Reads dynamic order rules for one market.
53 OrderRules {
54 /// The market to inspect.
55 market: Market,
56 },
57 /// Reads live asset-network rules.
58 AssetNetworks {
59 /// Asset symbol.
60 asset: String,
61 },
62 /// Lists all deposit addresses.
63 DepositAddresses,
64 /// Reads one deposit address.
65 DepositAddress {
66 /// Complete address request.
67 request: DepositAddressRequest,
68 },
69 /// Requests creation of one deposit address.
70 CreateDepositAddress {
71 /// Complete address request.
72 request: DepositAddressRequest,
73 },
74 /// Checks one withdrawal without submitting it.
75 PrepareWithdrawal {
76 /// Complete withdrawal request.
77 request: WithdrawRequest,
78 },
79 /// Submits one withdrawal.
80 Withdraw {
81 /// Complete withdrawal request.
82 request: WithdrawRequest,
83 },
84 /// Looks up one deposit.
85 Deposit {
86 /// Complete transfer lookup request.
87 request: TransferLookupRequest,
88 },
89 /// Looks up one withdrawal.
90 Withdrawal {
91 /// Complete transfer lookup request.
92 request: TransferLookupRequest,
93 },
94 /// Cancels one pending withdrawal.
95 CancelWithdrawal {
96 /// Exchange-issued withdrawal identifier.
97 withdrawal_id: String,
98 },
99 /// Reads deposit history.
100 Deposits {
101 /// Complete history request.
102 request: TransferHistoryRequest,
103 },
104 /// Reads withdrawal history.
105 Withdrawals {
106 /// Complete history request.
107 request: TransferHistoryRequest,
108 },
109 /// Reads open orders, optionally for one market.
110 OpenOrders {
111 /// The optional market filter.
112 market: Option<Market>,
113 },
114 /// Reads one order by exchange identifier.
115 Order {
116 /// The order's market.
117 market: Market,
118 /// The exchange's identifier.
119 order_id: String,
120 },
121 /// Reads one order by caller-assigned identifier.
122 OrderByClientId {
123 /// The order's market.
124 market: Market,
125 /// The caller-assigned identifier.
126 client_id: String,
127 },
128 /// Looks up multiple orders by one identifier namespace.
129 OrdersByIds {
130 /// Complete lookup request.
131 request: OrderLookupRequest,
132 },
133 /// Reads final-order history.
134 OrderHistory {
135 /// Complete history request.
136 request: OrderHistoryRequest,
137 },
138 /// Opens an account stream.
139 SubscribeAccount {
140 /// Connection and buffering settings.
141 config: StreamConfig,
142 },
143 /// Places an order.
144 PlaceOrder {
145 /// The complete order request.
146 request: OrderRequest,
147 },
148 /// Cancels an order.
149 CancelOrder {
150 /// The order's market.
151 market: Market,
152 /// The exchange's order identifier.
153 order_id: String,
154 },
155 /// Cancels an order by its caller-assigned identifier.
156 CancelOrderByClientId {
157 /// The order's market.
158 market: Market,
159 /// The caller-assigned identifier.
160 client_id: String,
161 },
162 /// Cancels multiple orders by one identifier namespace.
163 CancelOrders {
164 /// Complete batch-cancellation request.
165 request: CancelOrdersRequest,
166 },
167 /// Reads open positions, optionally for one market.
168 Positions {
169 /// The optional market filter.
170 market: Option<Market>,
171 },
172 /// Reads account-wide margin state.
173 MarginSummary,
174 /// Reads funding-rate history.
175 FundingRates {
176 /// The complete history request.
177 request: HistoryRequest,
178 },
179 /// Reads funding-payment history.
180 FundingPayments {
181 /// The complete history request.
182 request: HistoryRequest,
183 },
184 /// Changes leverage or margin mode.
185 SetMargin {
186 /// The complete margin request.
187 request: MarginRequest,
188 },
189}
190
191/// An owned reply returned by a foreign dispatcher.
192#[derive(Debug)]
193#[non_exhaustive]
194pub enum AdapterReply {
195 /// Result of [`AdapterCall::Markets`].
196 Markets(Vec<MarketInfo>),
197 /// Result of [`AdapterCall::Trades`].
198 Trades(Vec<Trade>),
199 /// Result of [`AdapterCall::OrderBook`].
200 OrderBook(OrderBook),
201 /// Result of [`AdapterCall::Ticker`].
202 Ticker(Ticker),
203 /// Result of [`AdapterCall::Candles`].
204 Candles(Vec<Candle>),
205 /// Result of [`AdapterCall::Subscribe`].
206 MarketStream(MarketStream),
207 /// Result of [`AdapterCall::Balances`].
208 Balances(Vec<Balance>),
209 /// Result of [`AdapterCall::OrderRules`].
210 OrderRules(Box<OrderRules>),
211 /// Result of [`AdapterCall::AssetNetworks`].
212 AssetNetworks(Vec<AssetNetwork>),
213 /// Result of [`AdapterCall::DepositAddresses`].
214 DepositAddresses(Vec<DepositAddressEntry>),
215 /// Result of [`AdapterCall::DepositAddress`].
216 DepositAddress(DepositAddress),
217 /// Result of [`AdapterCall::CreateDepositAddress`].
218 CreateDepositAddress(DepositAddress),
219 /// Result of [`AdapterCall::PrepareWithdrawal`].
220 WithdrawalQuote(WithdrawalQuote),
221 /// Result of [`AdapterCall::Withdraw`].
222 Withdrawal(Withdrawal),
223 /// Result of [`AdapterCall::Deposit`].
224 Deposit(Deposit),
225 /// Result of [`AdapterCall::Withdrawal`].
226 LookupWithdrawal(Withdrawal),
227 /// Result of [`AdapterCall::Deposits`].
228 Deposits(Page<Deposit>),
229 /// Result of [`AdapterCall::Withdrawals`].
230 Withdrawals(Page<Withdrawal>),
231 /// Result of [`AdapterCall::OpenOrders`].
232 OpenOrders(Vec<Order>),
233 /// Result of [`AdapterCall::Order`] or [`AdapterCall::OrderByClientId`].
234 Order(Order),
235 /// Result of [`AdapterCall::OrdersByIds`].
236 OrdersByIds(Vec<Order>),
237 /// Result of [`AdapterCall::OrderHistory`].
238 OrderHistory(Page<Order>),
239 /// Result of [`AdapterCall::SubscribeAccount`].
240 AccountStream(AccountStream),
241 /// Result of [`AdapterCall::PlaceOrder`].
242 PlaceOrder(Order),
243 /// Result of [`AdapterCall::CancelOrders`].
244 CancelOrdersResult(CancelOrdersResult),
245 /// Result of [`AdapterCall::Positions`].
246 Positions(Vec<Position>),
247 /// Result of [`AdapterCall::MarginSummary`].
248 MarginSummary(MarginSummary),
249 /// Result of [`AdapterCall::FundingRates`].
250 FundingRates(Page<FundingRate>),
251 /// Result of [`AdapterCall::FundingPayments`].
252 FundingPayments(Page<FundingPayment>),
253 /// Result of [`AdapterCall::SetMargin`].
254 Unit,
255}
256
257/// Executes owned adapter calls in a foreign runtime.
258pub trait ForeignDispatcher: Send + Sync + 'static {
259 /// Dispatches one call and returns its typed reply.
260 fn dispatch(&self, call: AdapterCall) -> BoxFuture<'_, Result<AdapterReply>>;
261}
262
263impl AdapterReply {
264 pub(crate) const fn kind(&self) -> &'static str {
265 match self {
266 Self::Markets(_) => "Markets",
267 Self::Trades(_) => "Trades",
268 Self::OrderBook(_) => "OrderBook",
269 Self::Ticker(_) => "Ticker",
270 Self::Candles(_) => "Candles",
271 Self::MarketStream(_) => "MarketStream",
272 Self::Balances(_) => "Balances",
273 Self::OrderRules(_) => "OrderRules",
274 Self::AssetNetworks(_) => "AssetNetworks",
275 Self::DepositAddresses(_) => "DepositAddresses",
276 Self::DepositAddress(_) => "DepositAddress",
277 Self::CreateDepositAddress(_) => "CreateDepositAddress",
278 Self::WithdrawalQuote(_) => "WithdrawalQuote",
279 Self::Withdrawal(_) => "Withdrawal",
280 Self::Deposit(_) => "Deposit",
281 Self::LookupWithdrawal(_) => "LookupWithdrawal",
282 Self::Deposits(_) => "Deposits",
283 Self::Withdrawals(_) => "Withdrawals",
284 Self::OpenOrders(_) => "OpenOrders",
285 Self::Order(_) => "Order",
286 Self::OrdersByIds(_) => "OrdersByIds",
287 Self::OrderHistory(_) => "OrderHistory",
288 Self::AccountStream(_) => "AccountStream",
289 Self::PlaceOrder(_) => "PlaceOrder",
290 Self::CancelOrdersResult(_) => "CancelOrdersResult",
291 Self::Positions(_) => "Positions",
292 Self::MarginSummary(_) => "MarginSummary",
293 Self::FundingRates(_) => "FundingRates",
294 Self::FundingPayments(_) => "FundingPayments",
295 Self::Unit => "Unit",
296 }
297 }
298}