Skip to main content

af_iperps/event_ext/
apply.rs

1//! Helpers for updating off-chain orderbook data with event content
2
3use crate::events;
4use crate::orderbook::Order;
5
6/// Intended for defining how to update off-chain data with event information.
7pub trait Apply<T> {
8    /// Use the contents of `self` to (possibly) mutate data in `target`.
9    fn apply(&self, target: &mut T);
10}
11
12/// General interface to help apply orderbook-related events to a database.
13///
14/// The methods here don't have to be used as an interface for other applications, they're only
15/// defined for conveniently calling `event.apply(&mut database)` on whatever the `database` type
16/// is.
17pub trait Orderbook {
18    /// To use with `OrderbookPostReceipt` event.
19    fn insert_order(&mut self, order_id: u128, order: Order);
20
21    /// To use with `CanceledOrder` or `FilledMakerOrder`
22    /// in which maker order was fully filled.
23    fn remove_order(&mut self, order_id: u128);
24
25    /// To use with `FilledMakerOrder` in which
26    /// maker order was not fully filled.
27    fn reduce_order_size(&mut self, order_id: u128, size_to_sub: u64);
28}
29
30impl<T: Orderbook> Apply<T> for events::PostedOrder {
31    fn apply(&self, target: &mut T) {
32        let Self {
33            order_id,
34            order_size: size,
35            account_id,
36            reduce_only,
37            expiration_timestamp_ms,
38            ..
39        } = *self;
40        let order = Order {
41            account_id,
42            size,
43            reduce_only,
44            expiration_timestamp_ms,
45        };
46        target.insert_order(order_id, order);
47    }
48}
49
50impl<T: Orderbook> Apply<T> for events::CanceledOrder {
51    fn apply(&self, target: &mut T) {
52        let Self { order_id, .. } = *self;
53        target.remove_order(order_id);
54    }
55}
56
57impl<T: Orderbook> Apply<T> for events::FilledMakerOrder {
58    fn apply(&self, target: &mut T) {
59        let Self {
60            order_id,
61            filled_size,
62            remaining_size,
63            ..
64        } = *self;
65        if remaining_size > 0 {
66            target.reduce_order_size(order_id, filled_size)
67        } else {
68            target.remove_order(order_id);
69        }
70    }
71}