Skip to main content

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}