#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct Fill {
pub order_id: u64,
pub px_1e9: u64,
pub qty_1e8: i64,
pub recv_ns: u64, pub side: i8,
pub _pad: [u8; 7],
}
impl Fill {
#[inline(always)]
pub fn since_ns(&self, start_ns: u64) -> u64 {
self.recv_ns.saturating_sub(start_ns)
}
#[inline(always)]
pub fn since_us(&self, start_ns: u64) -> u64 {
self.since_ns(start_ns) / 1_000
}
#[inline(always)]
pub fn since_ms(&self, start_ns: u64) -> u64 {
self.since_ns(start_ns) / 1_000_000
}
#[inline(always)]
pub fn symbol_id(&self) -> u16 {
u16::from_le_bytes([self._pad[0], self._pad[1]])
}
#[inline(always)]
pub fn set_symbol_id(&mut self, id: u16) {
let bytes = id.to_le_bytes();
self._pad[0] = bytes[0];
self._pad[1] = bytes[1];
}
}
const _: () = assert!(
core::mem::size_of::<Fill>() == 40,
"Fill size changed — ABI break"
);
const _: () = assert!(
core::mem::size_of::<Reject>() == 16,
"Reject size changed — ABI break"
);
#[derive(Debug, Clone, Copy, Default)]
pub struct FillExt {
pub is_maker: u8,
pub fee_1e9: i64,
pub queue_ahead_1e8: i64,
}
pub mod RejectCode {
pub const UNKNOWN: u8 = 0;
pub const INSUFFICIENT_BALANCE: u8 = 1;
pub const INVALID_PARAMS: u8 = 2;
pub const RATE_LIMIT: u8 = 3;
pub const EXCHANGE_BUSY: u8 = 4;
pub const NETWORK: u8 = 5;
pub const AUTH: u8 = 6;
pub const RISK: u8 = 100;
pub const POSITION_LIMIT: u8 = 101;
pub const KILL_SWITCH: u8 = 102;
pub const PRICE_DEVIATION: u8 = 103;
pub const DAILY_LOSS_LIMIT: u8 = 104;
pub const BAD_VENUE: u8 = 105;
pub const STALE_VENUE: u8 = 106;
pub fn to_str(code: u8) -> &'static str {
match code {
UNKNOWN => "UNKNOWN",
INSUFFICIENT_BALANCE => "INSUFFICIENT_BALANCE",
INVALID_PARAMS => "INVALID_PARAMS",
RATE_LIMIT => "RATE_LIMIT",
EXCHANGE_BUSY => "EXCHANGE_BUSY",
NETWORK => "NETWORK",
AUTH => "AUTH",
RISK => "RISK_CHECK_FAILED",
POSITION_LIMIT => "POSITION_LIMIT",
KILL_SWITCH => "KILL_SWITCH",
PRICE_DEVIATION => "PRICE_DEVIATION",
DAILY_LOSS_LIMIT => "DAILY_LOSS_LIMIT",
BAD_VENUE => "BAD_VENUE",
STALE_VENUE => "STALE_VENUE",
_ => "UNKNOWN",
}
}
}
#[derive(Debug, Clone, Copy)]
#[repr(C)]
pub struct Reject {
pub order_id: u64,
pub code: u8,
pub _pad: [u8; 7],
}
impl Reject {
#[inline]
pub fn reason(&self) -> &'static str {
RejectCode::to_str(self.code)
}
#[inline(always)]
pub fn symbol_id(&self) -> u16 {
u16::from_le_bytes([self._pad[0], self._pad[1]])
}
#[inline(always)]
pub fn set_symbol_id(&mut self, id: u16) {
let bytes = id.to_le_bytes();
self._pad[0] = bytes[0];
self._pad[1] = bytes[1];
}
}