xtp/
trader_spi.rs

1use crate::sys::{
2    XTPFundTransferNotice, XTPOrderCancelInfo, XTPOrderInfo, XTPQueryAssetRsp, XTPQueryETFBaseRsp,
3    XTPQueryETFComponentRsp, XTPQueryIPOQuotaRsp, XTPQueryIPOTickerRsp,
4    XTPQueryOptionAuctionInfoRsp, XTPQueryOrderRsp, XTPQueryStkPositionRsp, XTPQueryTradeRsp,
5    XTPStructuredFundInfo, XTPTradeReport, XTPRI,
6};
7use crate::types;
8use crate::types::FromRaw;
9use libc::{c_int, c_void};
10
11type RXTPRI<'a> = types::XTPRspInfoStruct;
12
13#[allow(unused_variables)]
14pub trait TraderSpi {
15    fn on_disconnected(&self, session_id: u64, reason: i32) {}
16    fn on_error(&self, error_info: RXTPRI) {}
17    fn on_order_event(&self, order_info: types::XTPOrderInfo, error_info: RXTPRI, session_id: u64) {
18    }
19    fn on_trade_event(&self, x_trade_info: types::XTPTradeReport, session_id: u64) {}
20    fn on_cancel_order_error(
21        &self,
22        cancel_info: types::XTPOrderCancelInfo,
23        error_info: RXTPRI,
24        session_id: u64,
25    ) {
26    }
27    fn on_query_order(
28        &self,
29        order_info: types::XTPOrderInfo,
30        error_info: RXTPRI,
31        request_id: i32,
32        is_last: bool,
33        session_id: u64,
34    ) {
35    }
36    #[allow(clippy::too_many_arguments)]
37    fn on_query_order_by_page(
38        &self,
39        order_info: types::XTPOrderInfo,
40        req_count: i64,
41        order_sequence: i64,
42        query_reference: i64,
43        request_id: i32,
44        is_last: bool,
45        session_id: u64,
46    ) {
47    }
48    fn on_query_trade(
49        &self,
50        trade_info: types::XTPTradeReport,
51        error_info: RXTPRI,
52        request_id: i32,
53        is_last: bool,
54        session_id: u64,
55    ) {
56    }
57    #[allow(clippy::too_many_arguments)]
58    fn on_query_trade_by_page(
59        &self,
60        trade_info: types::XTPTradeReport,
61        req_count: i64,
62        trade_sequence: i64,
63        query_reference: i64,
64        request_id: i32,
65        is_last: bool,
66        session_id: u64,
67    ) {
68    }
69    fn on_query_position(
70        &self,
71        position: types::XTPQueryStkPositionRsp,
72        error_info: RXTPRI,
73        request_id: i32,
74        is_last: bool,
75        session_id: u64,
76    ) {
77    }
78    fn on_query_asset(
79        &self,
80        asset: types::XTPQueryAssetRsp,
81        error_info: RXTPRI,
82        request_id: i32,
83        is_last: bool,
84        session_id: u64,
85    ) {
86    }
87    fn on_query_structured_fund(
88        &self,
89        fund_info: types::XTPStructuredFundInfo,
90        error_info: RXTPRI,
91        request_id: i32,
92        is_last: bool,
93        session_id: u64,
94    ) {
95    }
96    fn on_query_fund_transfer(
97        &self,
98        fund_transfer_info: types::XTPFundTransferNotice,
99        error_info: RXTPRI,
100        request_id: i32,
101        is_last: bool,
102        session_id: u64,
103    ) {
104    }
105    fn on_fund_transfer(
106        &self,
107        fund_transfer_info: types::XTPFundTransferNotice,
108        error_info: RXTPRI,
109        session_id: u64,
110    ) {
111    }
112    fn on_query_etf(
113        &self,
114        etf_info: types::XTPQueryETFBaseRsp,
115        error_info: RXTPRI,
116        request_id: i32,
117        is_last: bool,
118        session_id: u64,
119    ) {
120    }
121    fn on_query_etf_basket(
122        &self,
123        etf_component_info: types::XTPQueryETFComponentRsp,
124        error_info: RXTPRI,
125        request_id: i32,
126        is_last: bool,
127        session_id: u64,
128    ) {
129    }
130    fn on_query_ipo_info_list(
131        &self,
132        ipo_info: types::XTPQueryIPOTickerRsp,
133        error_info: RXTPRI,
134        request_id: i32,
135        is_last: bool,
136        session_id: u64,
137    ) {
138    }
139    fn on_query_ipo_quota_info(
140        &self,
141        quota_info: types::XTPQueryIPOQuotaRsp,
142        error_info: RXTPRI,
143        request_id: i32,
144        is_last: bool,
145        session_id: u64,
146    ) {
147    }
148    fn on_query_option_auction_info(
149        &self,
150        option_info: types::XTPQueryOptionAuctionInfoRsp,
151        error_info: RXTPRI,
152        request_id: i32,
153        is_last: bool,
154        session_id: u64,
155    ) {
156    }
157}
158
159unsafe fn unwrap_trader_spi<'a>(spi: *mut c_void) -> &'a mut dyn TraderSpi {
160    &mut **(spi as *mut *mut dyn TraderSpi)
161}
162
163// ***************** Rust Implementations for C++ Use **********************
164
165#[no_mangle]
166pub unsafe extern "C" fn TraderSpiStub_Rust_OnDisconnected(
167    spi: *mut c_void,
168    session_id: u64,
169    reason: c_int,
170) {
171    let spi = unwrap_trader_spi(spi);
172    spi.on_disconnected(session_id, reason as i32);
173}
174
175#[no_mangle]
176pub unsafe extern "C" fn TraderSpiStub_Rust_OnError(spi: *mut c_void, error_info: *const XTPRI) {
177    let spi = unwrap_trader_spi(spi);
178    let error_info = RXTPRI::from_raw(&*error_info);
179    spi.on_error(error_info);
180}
181
182#[no_mangle]
183pub unsafe extern "C" fn TraderSpiStub_Rust_OnOrderEvent(
184    spi: *mut c_void,
185    order_info: *const XTPOrderInfo,
186    error_info: *const XTPRI,
187    session_id: u64,
188) {
189    let spi = unwrap_trader_spi(spi);
190    let order_info = types::XTPOrderInfo::from_raw(&*order_info);
191    let error_info = RXTPRI::from_raw(&*error_info);
192    spi.on_order_event(order_info, error_info, session_id)
193}
194
195#[no_mangle]
196pub unsafe extern "C" fn TraderSpiStub_Rust_OnTradeEvent(
197    spi: *mut c_void,
198    x_trade_info: *const XTPTradeReport,
199    session_id: u64,
200) {
201    let spi = unwrap_trader_spi(spi);
202    let x_trade_info = types::XTPTradeReport::from_raw(&*x_trade_info);
203    spi.on_trade_event(x_trade_info, session_id)
204}
205
206#[no_mangle]
207pub unsafe extern "C" fn TraderSpiStub_Rust_OnCancelOrderError(
208    spi: *mut c_void,
209    cancel_info: *const XTPOrderCancelInfo,
210    error_info: *const XTPRI,
211    session_id: u64,
212) {
213    let spi = unwrap_trader_spi(spi);
214    let cancel_info = types::XTPOrderCancelInfo::from_raw(&*cancel_info);
215    let error_info = RXTPRI::from_raw(&*error_info);
216    spi.on_cancel_order_error(cancel_info, error_info, session_id)
217}
218
219#[no_mangle]
220pub unsafe extern "C" fn TraderSpiStub_Rust_OnQueryOrder(
221    spi: *mut c_void,
222    order_info: *const XTPQueryOrderRsp,
223    error_info: *const XTPRI,
224    request_id: c_int,
225    is_last: bool,
226    session_id: u64,
227) {
228    let spi = unwrap_trader_spi(spi);
229    let order_info = types::XTPOrderInfo::from_raw(&*order_info);
230    let error_info = RXTPRI::from_raw(&*error_info);
231    spi.on_query_order(order_info, error_info, request_id, is_last, session_id)
232}
233
234#[no_mangle]
235pub unsafe extern "C" fn TraderSpiStub_Rust_OnQueryOrderByPage(
236    spi: *mut c_void,
237    order_info: *const XTPQueryOrderRsp,
238    req_count: i64,
239    order_sequence: i64,
240    query_reference: i64,
241    request_id: c_int,
242    is_last: bool,
243    session_id: u64,
244) {
245    let spi = unwrap_trader_spi(spi);
246    let order_info = types::XTPOrderInfo::from_raw(&*order_info);
247    spi.on_query_order_by_page(
248        order_info,
249        req_count,
250        order_sequence,
251        query_reference,
252        request_id,
253        is_last,
254        session_id,
255    )
256}
257
258#[no_mangle]
259pub unsafe extern "C" fn TraderSpiStub_Rust_OnQueryTrade(
260    spi: *mut c_void,
261    trade_info: *const XTPQueryTradeRsp,
262    error_info: *const XTPRI,
263    request_id: c_int,
264    is_last: bool,
265    session_id: u64,
266) {
267    let spi = unwrap_trader_spi(spi);
268    let trade_info = types::XTPTradeReport::from_raw(&*trade_info);
269    let error_info = RXTPRI::from_raw(&*error_info);
270    spi.on_query_trade(trade_info, error_info, request_id, is_last, session_id)
271}
272
273#[no_mangle]
274pub unsafe extern "C" fn TraderSpiStub_Rust_OnQueryTradeByPage(
275    spi: *mut c_void,
276    trade_info: *const XTPQueryTradeRsp,
277    req_count: i64,
278    trade_sequence: i64,
279    query_reference: i64,
280    request_id: c_int,
281    is_last: bool,
282    session_id: u64,
283) {
284    let spi = unwrap_trader_spi(spi);
285    let trade_info = types::XTPTradeReport::from_raw(&*trade_info);
286    spi.on_query_trade_by_page(
287        trade_info,
288        req_count,
289        trade_sequence,
290        query_reference,
291        request_id,
292        is_last,
293        session_id,
294    )
295}
296
297#[no_mangle]
298pub unsafe extern "C" fn TraderSpiStub_Rust_OnQueryPosition(
299    spi: *mut c_void,
300    position: *const XTPQueryStkPositionRsp,
301    error_info: *const XTPRI,
302    request_id: c_int,
303    is_last: bool,
304    session_id: u64,
305) {
306    let spi = unwrap_trader_spi(spi);
307    let position = types::XTPQueryStkPositionRsp::from_raw(&*position);
308    let error_info = RXTPRI::from_raw(&*error_info);
309    spi.on_query_position(position, error_info, request_id, is_last, session_id)
310}
311
312#[no_mangle]
313pub unsafe extern "C" fn TraderSpiStub_Rust_OnQueryAsset(
314    spi: *mut c_void,
315    asset: *const XTPQueryAssetRsp,
316    error_info: *const XTPRI,
317    request_id: c_int,
318    is_last: bool,
319    session_id: u64,
320) {
321    let spi = unwrap_trader_spi(spi);
322    let asset = types::XTPQueryAssetRsp::from_raw(&*asset);
323    let error_info = RXTPRI::from_raw(&*error_info);
324    spi.on_query_asset(asset, error_info, request_id, is_last, session_id)
325}
326
327#[no_mangle]
328pub unsafe extern "C" fn TraderSpiStub_Rust_OnQueryStructuredFund(
329    spi: *mut c_void,
330    fund_info: *const XTPStructuredFundInfo,
331    error_info: *const XTPRI,
332    request_id: c_int,
333    is_last: bool,
334    session_id: u64,
335) {
336    let spi = unwrap_trader_spi(spi);
337    let fund_info = types::XTPStructuredFundInfo::from_raw(&*fund_info);
338    let error_info = RXTPRI::from_raw(&*error_info);
339    spi.on_query_structured_fund(fund_info, error_info, request_id, is_last, session_id)
340}
341
342#[no_mangle]
343pub unsafe extern "C" fn TraderSpiStub_Rust_OnQueryFundTransfer(
344    spi: *mut c_void,
345    fund_transfer_info: *const XTPFundTransferNotice,
346    error_info: *const XTPRI,
347    request_id: c_int,
348    is_last: bool,
349    session_id: u64,
350) {
351    let spi = unwrap_trader_spi(spi);
352    let fund_transfer_info = types::XTPFundTransferNotice::from_raw(&*fund_transfer_info);
353    let error_info = RXTPRI::from_raw(&*error_info);
354    spi.on_query_fund_transfer(
355        fund_transfer_info,
356        error_info,
357        request_id,
358        is_last,
359        session_id,
360    )
361}
362
363#[no_mangle]
364pub unsafe extern "C" fn TraderSpiStub_Rust_OnFundTransfer(
365    spi: *mut c_void,
366    fund_transfer_info: *const XTPFundTransferNotice,
367    error_info: *const XTPRI,
368    session_id: u64,
369) {
370    let spi = unwrap_trader_spi(spi);
371    let fund_transfer_info = types::XTPFundTransferNotice::from_raw(&*fund_transfer_info);
372    let error_info = RXTPRI::from_raw(&*error_info);
373    spi.on_fund_transfer(fund_transfer_info, error_info, session_id)
374}
375
376#[no_mangle]
377pub unsafe extern "C" fn TraderSpiStub_Rust_OnQueryETF(
378    spi: *mut c_void,
379    etf_info: *const XTPQueryETFBaseRsp,
380    error_info: *const XTPRI,
381    request_id: c_int,
382    is_last: bool,
383    session_id: u64,
384) {
385    let spi = unwrap_trader_spi(spi);
386    let etf_info = types::XTPQueryETFBaseRsp::from_raw(&*etf_info);
387    let error_info = RXTPRI::from_raw(&*error_info);
388    spi.on_query_etf(etf_info, error_info, request_id, is_last, session_id)
389}
390
391#[no_mangle]
392pub unsafe extern "C" fn TraderSpiStub_Rust_OnQueryETFBasket(
393    spi: *mut c_void,
394    etf_component_info: *const XTPQueryETFComponentRsp,
395    error_info: *const XTPRI,
396    request_id: c_int,
397    is_last: bool,
398    session_id: u64,
399) {
400    let spi = unwrap_trader_spi(spi);
401    let etf_component_info = types::XTPQueryETFComponentRsp::from_raw(&*etf_component_info);
402    let error_info = RXTPRI::from_raw(&*error_info);
403    spi.on_query_etf_basket(
404        etf_component_info,
405        error_info,
406        request_id,
407        is_last,
408        session_id,
409    )
410}
411
412#[no_mangle]
413pub unsafe extern "C" fn TraderSpiStub_Rust_OnQueryIPOInfoList(
414    spi: *mut c_void,
415    ipo_info: *const XTPQueryIPOTickerRsp,
416    error_info: *const XTPRI,
417    request_id: c_int,
418    is_last: bool,
419    session_id: u64,
420) {
421    let spi = unwrap_trader_spi(spi);
422    let ipo_info = types::XTPQueryIPOTickerRsp::from_raw(&*ipo_info);
423    let error_info = RXTPRI::from_raw(&*error_info);
424    spi.on_query_ipo_info_list(ipo_info, error_info, request_id, is_last, session_id)
425}
426#[no_mangle]
427pub unsafe extern "C" fn TraderSpiStub_Rust_OnQueryIPOQuotaInfo(
428    spi: *mut c_void,
429    quota_info: *const XTPQueryIPOQuotaRsp,
430    error_info: *const XTPRI,
431    request_id: c_int,
432    is_last: bool,
433    session_id: u64,
434) {
435    let spi = unwrap_trader_spi(spi);
436    let quota_info = types::XTPQueryIPOQuotaRsp::from_raw(&*quota_info);
437    let error_info = RXTPRI::from_raw(&*error_info);
438    spi.on_query_ipo_quota_info(quota_info, error_info, request_id, is_last, session_id)
439}
440#[no_mangle]
441pub unsafe extern "C" fn TraderSpiStub_Rust_OnQueryOptionAuctionInfo(
442    spi: *mut c_void,
443    option_info: *const XTPQueryOptionAuctionInfoRsp,
444    error_info: *const XTPRI,
445    request_id: c_int,
446    is_last: bool,
447    session_id: u64,
448) {
449    let spi = unwrap_trader_spi(spi);
450    let option_info = types::XTPQueryOptionAuctionInfoRsp::from_raw(&*option_info);
451    let error_info = RXTPRI::from_raw(&*error_info);
452    spi.on_query_option_auction_info(option_info, error_info, request_id, is_last, session_id)
453}
454
455#[no_mangle]
456pub unsafe extern "C" fn TraderSpiStub_Rust_Destructor(spi: *mut c_void) {
457    let spi = spi as *mut Box<dyn TraderSpi>;
458    let _: Box<Box<dyn TraderSpi>> = Box::from_raw(spi);
459}