use crate::events;
use crate::orderbook::Order;
pub trait Apply<T> {
fn apply(&self, target: &mut T);
}
pub trait Orderbook {
fn insert_order(&mut self, order_id: u128, order: Order);
fn remove_order(&mut self, order_id: u128);
fn reduce_order_size(&mut self, order_id: u128, size_to_sub: u64);
}
impl<T: Orderbook> Apply<T> for events::PostedOrder {
fn apply(&self, target: &mut T) {
let Self {
order_id,
order_size: size,
account_id,
reduce_only,
expiration_timestamp_ms,
..
} = *self;
let order = Order {
account_id,
size,
reduce_only,
expiration_timestamp_ms,
};
target.insert_order(order_id, order);
}
}
impl<T: Orderbook> Apply<T> for events::CanceledOrder {
fn apply(&self, target: &mut T) {
let Self { order_id, .. } = *self;
target.remove_order(order_id);
}
}
impl<T: Orderbook> Apply<T> for events::FilledMakerOrder {
fn apply(&self, target: &mut T) {
let Self {
order_id,
filled_size,
remaining_size,
..
} = *self;
if remaining_size > 0 {
target.reduce_order_size(order_id, filled_size)
} else {
target.remove_order(order_id);
}
}
}