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::OrderbookPostReceipt {
31    fn apply(&self, target: &mut T) {
32        let Self {
33            order_id,
34            order_size: size,
35            account_id,
36            ..
37        } = *self;
38        let order = Order { account_id, size };
39        target.insert_order(order_id, order);
40    }
41}
42
43impl<T: Orderbook> Apply<T> for events::CanceledOrder {
44    fn apply(&self, target: &mut T) {
45        let Self { order_id, .. } = *self;
46        target.remove_order(order_id);
47    }
48}
49
50impl<T: Orderbook> Apply<T> for events::FilledMakerOrder {
51    fn apply(&self, target: &mut T) {
52        let Self {
53            order_id,
54            filled_size,
55            remaining_size,
56            ..
57        } = *self;
58        if remaining_size > 0 {
59            target.reduce_order_size(order_id, filled_size)
60        } else {
61            target.remove_order(order_id);
62        }
63    }
64}