gmsol_utils/
config.rs

1use crate::order::OrderKind;
2
3/// Config error.
4#[derive(Debug, thiserror::Error)]
5pub enum ConfigError {
6    /// Unsupported domain.
7    #[error("unsupported domain")]
8    UnsupportedDomain,
9}
10
11/// Domain Disabled Flag.
12#[derive(Clone, Copy, strum::EnumString, strum::Display)]
13#[repr(u8)]
14#[non_exhaustive]
15#[strum(serialize_all = "kebab-case")]
16#[cfg_attr(feature = "debug", derive(Debug))]
17#[cfg_attr(feature = "enum-iter", derive(strum::EnumIter))]
18#[cfg_attr(feature = "clap", derive(clap::ValueEnum))]
19#[cfg_attr(feature = "clap", clap(rename_all = "kebab-case"))]
20#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
21#[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))]
22pub enum DomainDisabledFlag {
23    /// Market Swap Order.
24    MarketSwap = 0,
25    /// Market Increase Order.
26    MarketIncrease = 1,
27    /// Market Decrease Order.
28    MarketDecrease = 2,
29    /// Liquidation Order.
30    Liquidation = 3,
31    /// Auto-deleveraging Order.
32    AutoDeleveraging = 4,
33    /// Limit Swap Order.
34    LimitSwap = 5,
35    /// Limit Increase Order.
36    LimitIncrease = 6,
37    /// Limit Decrease Order.
38    LimitDecrease = 7,
39    /// Stop-loss Decrease Order.
40    StopLossDecrease = 8,
41    /// Deposit.
42    Deposit = 9,
43    /// Withdrawal.
44    Withdrawal = 10,
45    /// Shift.
46    Shift = 11,
47    /// GLV deposit.
48    GlvDeposit = 12,
49    /// GLV withdrawal.
50    GlvWithdrawal = 13,
51    /// GLV shift.
52    GlvShift = 14,
53}
54
55impl TryFrom<OrderKind> for DomainDisabledFlag {
56    type Error = ConfigError;
57
58    fn try_from(kind: OrderKind) -> Result<Self, Self::Error> {
59        match kind {
60            OrderKind::MarketSwap => Ok(Self::MarketSwap),
61            OrderKind::MarketIncrease => Ok(Self::MarketIncrease),
62            OrderKind::MarketDecrease => Ok(Self::MarketDecrease),
63            OrderKind::Liquidation => Ok(Self::Liquidation),
64            OrderKind::AutoDeleveraging => Ok(Self::AutoDeleveraging),
65            OrderKind::LimitSwap => Ok(Self::LimitSwap),
66            OrderKind::LimitIncrease => Ok(Self::LimitIncrease),
67            OrderKind::LimitDecrease => Ok(Self::LimitDecrease),
68            OrderKind::StopLossDecrease => Ok(Self::StopLossDecrease),
69        }
70    }
71}
72
73/// Action Disabled Flag.
74#[derive(Clone, Copy, Default, strum::EnumString, strum::Display)]
75#[repr(u8)]
76#[non_exhaustive]
77#[strum(serialize_all = "kebab-case")]
78#[cfg_attr(feature = "debug", derive(Debug))]
79#[cfg_attr(feature = "enum-iter", derive(strum::EnumIter))]
80#[cfg_attr(feature = "clap", derive(clap::ValueEnum))]
81#[cfg_attr(feature = "clap", clap(rename_all = "kebab-case"))]
82#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
83#[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))]
84pub enum ActionDisabledFlag {
85    /// Default Action.
86    #[default]
87    Default = 0,
88    /// Create.
89    Create = 1,
90    /// Update.
91    Update = 2,
92    /// Execute.
93    Execute = 3,
94    /// Cancel.
95    Cancel = 4,
96}
97
98/// Display feature.
99pub fn display_feature(domain: DomainDisabledFlag, action: ActionDisabledFlag) -> String {
100    let action = match action {
101        ActionDisabledFlag::Default => String::new(),
102        action => format!(":{action}"),
103    };
104    format!("{domain}{action}")
105}
106
107/// Amount keys.
108#[derive(strum::EnumString, strum::Display, Clone, Copy)]
109#[strum(serialize_all = "snake_case")]
110#[non_exhaustive]
111#[cfg_attr(feature = "debug", derive(Debug))]
112#[cfg_attr(feature = "enum-iter", derive(strum::EnumIter))]
113#[cfg_attr(feature = "clap", derive(clap::ValueEnum))]
114#[cfg_attr(feature = "clap", clap(rename_all = "snake_case"))]
115pub enum AmountKey {
116    /// Claimable time window (seconds).
117    ClaimableTimeWindow,
118    /// Recent time window (seconds).
119    RecentTimeWindow,
120    /// Request expiration (seconds).
121    RequestExpiration,
122    /// Oracle max age (seconds).
123    OracleMaxAge,
124    /// Oracle max timestamp range (seconds).
125    OracleMaxTimestampRange,
126    /// Max timestamp excess for oracle timestamp (seconds).
127    OracleMaxFutureTimestampExcess,
128    /// Max ADL prices staleness (seconds).
129    AdlPricesMaxStaleness,
130}
131
132/// Factor keys.
133#[derive(strum::EnumString, strum::Display, Clone, Copy)]
134#[strum(serialize_all = "snake_case")]
135#[non_exhaustive]
136#[cfg_attr(feature = "debug", derive(Debug))]
137#[cfg_attr(feature = "enum-iter", derive(strum::EnumIter))]
138#[cfg_attr(feature = "clap", derive(clap::ValueEnum))]
139#[cfg_attr(feature = "clap", clap(rename_all = "snake_case"))]
140pub enum FactorKey {
141    /// Oracle Ref Price Deviation.
142    OracleRefPriceDeviation,
143    /// Order fee discount for referred user.
144    OrderFeeDiscountForReferredUser,
145}
146
147/// Address keys.
148#[derive(strum::EnumString, strum::Display, Clone, Copy)]
149#[strum(serialize_all = "snake_case")]
150#[non_exhaustive]
151#[cfg_attr(feature = "debug", derive(Debug))]
152#[cfg_attr(feature = "enum-iter", derive(strum::EnumIter))]
153#[cfg_attr(feature = "clap", derive(clap::ValueEnum))]
154#[cfg_attr(feature = "clap", clap(rename_all = "snake_case"))]
155pub enum AddressKey {
156    /// Holding.
157    Holding,
158}