use nautilus_core::{UnixNanos, ffi::cvec::CVec};
use crate::{
data::{OrderBookDelta, OrderBookDeltas, OrderBookDeltas_API},
enums::BookAction,
identifiers::InstrumentId,
};
#[unsafe(no_mangle)]
pub unsafe extern "C" fn orderbook_deltas_new(
instrument_id: InstrumentId,
deltas: &CVec,
) -> OrderBookDeltas_API {
let cloned_deltas = unsafe { deltas.as_slice::<OrderBookDelta>() }.to_vec();
OrderBookDeltas_API::new(OrderBookDeltas::new(instrument_id, cloned_deltas))
}
#[unsafe(no_mangle)]
pub extern "C" fn orderbook_deltas_drop(deltas: OrderBookDeltas_API) {
drop(deltas); }
#[unsafe(no_mangle)]
pub extern "C" fn orderbook_deltas_clone(deltas: &OrderBookDeltas_API) -> OrderBookDeltas_API {
deltas.clone()
}
#[unsafe(no_mangle)]
pub extern "C" fn orderbook_deltas_instrument_id(deltas: &OrderBookDeltas_API) -> InstrumentId {
deltas.instrument_id
}
#[unsafe(no_mangle)]
pub extern "C" fn orderbook_deltas_vec_deltas(deltas: &OrderBookDeltas_API) -> CVec {
deltas.deltas.clone().into()
}
#[unsafe(no_mangle)]
pub extern "C" fn orderbook_deltas_is_snapshot(deltas: &OrderBookDeltas_API) -> u8 {
deltas
.deltas
.first()
.map_or(0, |first| u8::from(first.action == BookAction::Clear))
}
#[unsafe(no_mangle)]
pub extern "C" fn orderbook_deltas_flags(deltas: &OrderBookDeltas_API) -> u8 {
deltas.flags
}
#[unsafe(no_mangle)]
pub extern "C" fn orderbook_deltas_sequence(deltas: &OrderBookDeltas_API) -> u64 {
deltas.sequence
}
#[unsafe(no_mangle)]
pub extern "C" fn orderbook_deltas_ts_event(deltas: &OrderBookDeltas_API) -> UnixNanos {
deltas.ts_event
}
#[unsafe(no_mangle)]
pub extern "C" fn orderbook_deltas_ts_init(deltas: &OrderBookDeltas_API) -> UnixNanos {
deltas.ts_init
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn orderbook_deltas_vec_drop(v: CVec) {
let deltas = unsafe { v.into_vec::<OrderBookDelta>() };
drop(deltas); }
#[cfg(test)]
mod tests {
use rstest::rstest;
use super::*;
use crate::data::stubs::stub_delta;
#[rstest]
fn test_empty_delta_drop_returns_without_panic() {
unsafe { orderbook_deltas_vec_drop(CVec::empty()) };
}
#[rstest]
fn test_orderbook_deltas_new_clones_borrowed_buffer() {
let delta = stub_delta();
let mut caller_owned = vec![delta];
let cvec = CVec {
ptr: caller_owned.as_mut_ptr().cast(),
len: caller_owned.len(),
cap: caller_owned.capacity(),
};
let deltas = unsafe { orderbook_deltas_new(delta.instrument_id, &cvec) };
assert_eq!(deltas.deltas, caller_owned);
caller_owned[0].sequence += 1;
assert_ne!(deltas.deltas, caller_owned);
}
}