Skip to main content

df_hyperliquid_core/trade/
action.rs

1//! Every trading action as one value, so what a confirmation shows and what is signed are the
2//! same value.
3
4use crate::trade::cancel::{Cancel, CancelByCloid};
5use crate::trade::leverage::{UpdateIsolatedMargin, UpdateLeverage};
6use crate::trade::modify::{BatchModify, Modify};
7use crate::trade::order::PlaceOrder;
8use crate::trade::schedule::{Noop, ScheduleCancel};
9use crate::trade::twap::{Twap, TwapCancel};
10use crate::utils::sign::{L1Action, Map};
11
12#[derive(Debug, Clone, PartialEq, Eq)]
13pub enum TradeAction {
14    Place(PlaceOrder),
15    Cancel(Cancel),
16    CancelByCloid(CancelByCloid),
17    Modify(Modify),
18    BatchModify(BatchModify),
19    Twap(Twap),
20    TwapCancel(TwapCancel),
21    Leverage(UpdateLeverage),
22    Margin(UpdateIsolatedMargin),
23    ScheduleCancel(ScheduleCancel),
24    Noop(Noop),
25}
26
27impl TradeAction {
28    /// The action's `type`, which is also what an answer about it names.
29    #[must_use]
30    pub const fn kind(&self) -> &'static str {
31        match self {
32            TradeAction::Place(_) => "order",
33            TradeAction::Cancel(_) => "cancel",
34            TradeAction::CancelByCloid(_) => "cancelByCloid",
35            TradeAction::Modify(_) => "modify",
36            TradeAction::BatchModify(_) => "batchModify",
37            TradeAction::Twap(_) => "twapOrder",
38            TradeAction::TwapCancel(_) => "twapCancel",
39            TradeAction::Leverage(_) => "updateLeverage",
40            TradeAction::Margin(_) => "updateIsolatedMargin",
41            TradeAction::ScheduleCancel(_) => "scheduleCancel",
42            TradeAction::Noop(_) => "noop",
43        }
44    }
45
46    /// How many statuses the venue answers it with, one an order, cancel or
47    /// modify; `None` for an action answered by one status or none.
48    #[must_use]
49    pub fn items(&self) -> Option<usize> {
50        match self {
51            TradeAction::Place(place) => Some(place.orders().len()),
52            TradeAction::Cancel(cancel) => Some(cancel.cancels().len()),
53            TradeAction::CancelByCloid(cancel) => Some(cancel.cancels().len()),
54            TradeAction::BatchModify(batch) => Some(batch.modifies().len()),
55            _ => None,
56        }
57    }
58}
59
60impl L1Action for TradeAction {
61    fn action(&self) -> Map {
62        match self {
63            TradeAction::Place(action) => action.action(),
64            TradeAction::Cancel(action) => action.action(),
65            TradeAction::CancelByCloid(action) => action.action(),
66            TradeAction::Modify(action) => action.action(),
67            TradeAction::BatchModify(action) => action.action(),
68            TradeAction::Twap(action) => action.action(),
69            TradeAction::TwapCancel(action) => action.action(),
70            TradeAction::Leverage(action) => action.action(),
71            TradeAction::Margin(action) => action.action(),
72            TradeAction::ScheduleCancel(action) => action.action(),
73            TradeAction::Noop(action) => action.action(),
74        }
75    }
76}
77
78macro_rules! from {
79    ($($action:ident => $variant:ident),* $(,)?) => {
80        $(impl From<$action> for TradeAction {
81            fn from(action: $action) -> TradeAction {
82                TradeAction::$variant(action)
83            }
84        })*
85    };
86}
87
88from! {
89    PlaceOrder => Place,
90    Cancel => Cancel,
91    CancelByCloid => CancelByCloid,
92    Modify => Modify,
93    BatchModify => BatchModify,
94    Twap => Twap,
95    TwapCancel => TwapCancel,
96    UpdateLeverage => Leverage,
97    UpdateIsolatedMargin => Margin,
98    ScheduleCancel => ScheduleCancel,
99    Noop => Noop,
100}
101
102#[cfg(test)]
103#[path = "tests/action.rs"]
104mod tests;