use std::ffi::CString;
use std::time::Duration;
use std::thread;
use rtp::trader::{GenericTraderApi, TraderApi, TraderSpi, ResumeType};
use rtp::trader::{DisconnectionReason, RspResult};
use rtp::trader::CThostFtdcRspUserLoginField;
use rtp::binding::TThostFtdcRequestIDType;
struct TestTraderSpi {
connected: bool,
disconnected: bool,
login_received: bool,
}
impl TestTraderSpi {
fn new() -> Self {
TestTraderSpi {
connected: false,
disconnected: false,
login_received: false,
}
}
}
impl TraderSpi for TestTraderSpi {
fn on_front_connected(&mut self) {
println!("Connected to trading server");
self.connected = true;
}
fn on_front_disconnected(&mut self, reason: DisconnectionReason) {
println!("Disconnected from trading server: {:?}", reason);
self.disconnected = true;
}
fn on_rsp_user_login(&mut self,
rsp_user_login: Option<&CThostFtdcRspUserLoginField>,
result: RspResult,
request_id: TThostFtdcRequestIDType,
is_last: bool) {
println!("Login response: {:?}, result: {:?}, request_id: {}, is_last: {}",
rsp_user_login, result, request_id, is_last);
self.login_received = true;
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_trader_api_basic_usage() {
let flow_path = CString::new("./flow_path").unwrap();
let mut trader = TraderApi::new(flow_path);
let version = trader.version();
println!("RTP API Version: {}", version);
let trader_spi = Box::new(TestTraderSpi::new());
trader.register_spi(trader_spi);
trader.subscribe_public_topic(ResumeType::Quick);
trader.subscribe_private_topic(ResumeType::Quick);
trader.init();
println!("Trader API initialized successfully");
thread::sleep(Duration::from_millis(100));
}
}