use serde::{Deserialize, Serialize};
use strum::{AsRefStr, Display, EnumIter, EnumString};
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
#[cfg_attr(
feature = "python",
pyo3::pyclass(
module = "nautilus_trader.core.nautilus_pyo3.derive",
eq,
eq_int,
frozen,
from_py_object,
rename_all = "SCREAMING_SNAKE_CASE"
)
)]
#[cfg_attr(
feature = "python",
pyo3_stub_gen::derive::gen_stub_pyclass_enum(module = "nautilus_trader.adapters.derive")
)]
pub enum DeriveEnvironment {
#[default]
Mainnet,
Testnet,
}
impl DeriveEnvironment {
#[must_use]
pub const fn is_testnet(self) -> bool {
matches!(self, Self::Testnet)
}
}
#[derive(
Debug,
Clone,
Copy,
PartialEq,
Eq,
Hash,
Serialize,
Deserialize,
Display,
EnumString,
AsRefStr,
EnumIter,
)]
#[serde(rename_all = "lowercase")]
#[strum(serialize_all = "lowercase")]
pub enum DeriveInstrumentType {
Erc20,
Option,
Perp,
}
#[derive(
Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Display, EnumString, EnumIter,
)]
#[serde(rename_all = "lowercase")]
#[strum(serialize_all = "lowercase")]
pub enum DeriveAssetType {
Erc20,
Option,
Perp,
}
#[derive(
Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Display, EnumString, AsRefStr,
)]
#[serde(rename_all = "lowercase")]
#[strum(serialize_all = "lowercase")]
pub enum DeriveOrderSide {
Buy,
Sell,
}
#[derive(
Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Display, EnumString, AsRefStr,
)]
#[serde(rename_all = "lowercase")]
#[strum(serialize_all = "lowercase")]
pub enum DeriveOrderType {
Limit,
Market,
}
#[derive(
Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Display, EnumString, AsRefStr,
)]
#[serde(rename_all = "lowercase")]
#[strum(serialize_all = "lowercase")]
pub enum DeriveTriggerType {
Stoploss,
Takeprofit,
}
#[derive(
Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Display, EnumString, AsRefStr,
)]
#[serde(rename_all = "lowercase")]
#[strum(serialize_all = "lowercase")]
pub enum DeriveTriggerPriceType {
Mark,
Index,
}
#[derive(
Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Display, EnumString, AsRefStr,
)]
#[serde(rename_all = "snake_case")]
#[strum(serialize_all = "snake_case")]
pub enum DeriveOrderStatus {
Open,
Filled,
Rejected,
Cancelled,
Expired,
Untriggered,
AlgoActive,
}
#[derive(
Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Display, EnumString, AsRefStr,
)]
#[serde(rename_all = "snake_case")]
#[strum(serialize_all = "snake_case")]
pub enum DeriveTimeInForce {
Gtc,
PostOnly,
Fok,
Ioc,
}
#[derive(
Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Display, EnumString, AsRefStr,
)]
pub enum DeriveOptionKind {
#[serde(rename = "C")]
#[strum(serialize = "C")]
Call,
#[serde(rename = "P")]
#[strum(serialize = "P")]
Put,
}
#[derive(
Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Display, EnumString, AsRefStr,
)]
pub enum DeriveOrderCancelReason {
#[serde(rename = "")]
#[strum(serialize = "")]
Empty,
#[serde(rename = "user_request")]
#[strum(serialize = "user_request")]
UserRequest,
#[serde(rename = "mmp_trigger")]
#[strum(serialize = "mmp_trigger")]
MmpTrigger,
#[serde(rename = "insufficient_margin")]
#[strum(serialize = "insufficient_margin")]
InsufficientMargin,
#[serde(rename = "signed_max_fee_too_low")]
#[strum(serialize = "signed_max_fee_too_low")]
SignedMaxFeeTooLow,
#[serde(rename = "cancel_on_disconnect")]
#[strum(serialize = "cancel_on_disconnect")]
CancelOnDisconnect,
#[serde(rename = "ioc_or_market_partial_fill")]
#[strum(serialize = "ioc_or_market_partial_fill")]
IocOrMarketPartialFill,
#[serde(rename = "session_key_deregistered")]
#[strum(serialize = "session_key_deregistered")]
SessionKeyDeregistered,
#[serde(rename = "subaccount_withdrawn")]
#[strum(serialize = "subaccount_withdrawn")]
SubaccountWithdrawn,
#[serde(rename = "compliance")]
#[strum(serialize = "compliance")]
Compliance,
#[serde(rename = "trigger_failed")]
#[strum(serialize = "trigger_failed")]
TriggerFailed,
#[serde(rename = "validation_failed")]
#[strum(serialize = "validation_failed")]
ValidationFailed,
#[serde(rename = "algo_completed")]
#[strum(serialize = "algo_completed")]
AlgoCompleted,
#[serde(rename = "Post only order cannot cross the market")]
#[strum(serialize = "Post only order cannot cross the market")]
PostOnlyCrossMarket,
}
#[derive(
Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Display, EnumString, AsRefStr,
)]
pub enum DeriveRfqCancelReason {
#[serde(rename = "")]
#[strum(serialize = "")]
Empty,
#[serde(rename = "user_request")]
#[strum(serialize = "user_request")]
UserRequest,
#[serde(rename = "insufficient_margin")]
#[strum(serialize = "insufficient_margin")]
InsufficientMargin,
#[serde(rename = "signed_max_fee_too_low")]
#[strum(serialize = "signed_max_fee_too_low")]
SignedMaxFeeTooLow,
#[serde(rename = "mmp_trigger")]
#[strum(serialize = "mmp_trigger")]
MmpTrigger,
#[serde(rename = "cancel_on_disconnect")]
#[strum(serialize = "cancel_on_disconnect")]
CancelOnDisconnect,
#[serde(rename = "session_key_deregistered")]
#[strum(serialize = "session_key_deregistered")]
SessionKeyDeregistered,
#[serde(rename = "subaccount_withdrawn")]
#[strum(serialize = "subaccount_withdrawn")]
SubaccountWithdrawn,
#[serde(rename = "rfq_no_longer_open")]
#[strum(serialize = "rfq_no_longer_open")]
RfqNoLongerOpen,
#[serde(rename = "compliance")]
#[strum(serialize = "compliance")]
Compliance,
}
#[derive(
Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Display, EnumString, AsRefStr,
)]
#[serde(rename_all = "lowercase")]
#[strum(serialize_all = "lowercase")]
pub enum DeriveLiquidityRole {
Maker,
Taker,
}
#[derive(
Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Display, EnumString, AsRefStr,
)]
#[serde(rename_all = "lowercase")]
#[strum(serialize_all = "lowercase")]
pub enum DeriveTxStatus {
Requested,
Pending,
Settled,
Reverted,
Ignored,
}
#[derive(
Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Display, EnumString, AsRefStr,
)]
pub enum DeriveMarginType {
#[serde(rename = "SM")]
#[strum(serialize = "SM")]
Sm,
#[serde(rename = "PM")]
#[strum(serialize = "PM")]
Pm,
#[serde(rename = "PM2")]
#[strum(serialize = "PM2")]
Pm2,
}
#[derive(
Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Display, EnumString, AsRefStr,
)]
#[serde(rename_all = "lowercase")]
#[strum(serialize_all = "lowercase")]
pub enum DeriveAuctionType {
Solvent,
Insolvent,
}
#[derive(
Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Display, EnumString, AsRefStr,
)]
#[serde(rename_all = "lowercase")]
#[strum(serialize_all = "lowercase")]
pub enum DeriveAuctionState {
Ongoing,
Ended,
}
#[derive(
Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Display, EnumString, AsRefStr,
)]
#[serde(rename_all = "lowercase")]
#[strum(serialize_all = "lowercase")]
pub enum DeriveNotificationStatus {
Unseen,
Seen,
Hidden,
}
#[derive(
Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Display, EnumString, AsRefStr,
)]
#[serde(rename_all = "lowercase")]
#[strum(serialize_all = "lowercase")]
pub enum DeriveNotificationType {
Deposit,
Withdraw,
Transfer,
Trade,
Settlement,
Liquidation,
Types,
}
#[derive(
Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Display, EnumString, AsRefStr,
)]
#[serde(rename_all = "snake_case")]
#[strum(serialize_all = "snake_case")]
pub enum DeriveBalanceUpdateType {
Trade,
AssetDeposit,
AssetWithdrawal,
Transfer,
SubaccountDeposit,
SubaccountWithdrawal,
Liquidation,
OnchainDriftFix,
PerpSettlement,
OptionSettlement,
InterestAccrual,
OnchainRevert,
DoubleRevert,
}
#[derive(
Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Display, EnumString, AsRefStr,
)]
#[serde(rename_all = "lowercase")]
#[strum(serialize_all = "lowercase")]
pub enum DeriveComplianceStatus {
Enabled,
Disabled,
}
#[derive(
Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Display, EnumString, AsRefStr,
)]
pub enum DeriveOrderbookDepth {
#[serde(rename = "1")]
#[strum(serialize = "1")]
D1,
#[serde(rename = "10")]
#[strum(serialize = "10")]
D10,
#[serde(rename = "20")]
#[strum(serialize = "20")]
D20,
#[serde(rename = "100")]
#[strum(serialize = "100")]
D100,
}
#[derive(
Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Display, EnumString, AsRefStr,
)]
pub enum DeriveOrderbookGroup {
#[serde(rename = "1")]
#[strum(serialize = "1")]
G1,
#[serde(rename = "10")]
#[strum(serialize = "10")]
G10,
#[serde(rename = "100")]
#[strum(serialize = "100")]
G100,
}
#[derive(
Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Display, EnumString, AsRefStr,
)]
pub enum DeriveTickerInterval {
#[serde(rename = "100")]
#[strum(serialize = "100")]
Ms100,
#[serde(rename = "1000")]
#[strum(serialize = "1000")]
Ms1000,
}
#[cfg(test)]
mod tests {
use std::str::FromStr;
use rstest::rstest;
use super::*;
#[rstest]
fn test_environment_default_is_mainnet() {
assert_eq!(DeriveEnvironment::default(), DeriveEnvironment::Mainnet);
assert!(!DeriveEnvironment::default().is_testnet());
assert!(DeriveEnvironment::Testnet.is_testnet());
}
#[rstest]
#[case(DeriveInstrumentType::Erc20, "erc20")]
#[case(DeriveInstrumentType::Option, "option")]
#[case(DeriveInstrumentType::Perp, "perp")]
fn test_instrument_type_display(#[case] variant: DeriveInstrumentType, #[case] expected: &str) {
assert_eq!(variant.to_string(), expected);
}
#[rstest]
#[case(DeriveTimeInForce::Gtc, "gtc")]
#[case(DeriveTimeInForce::PostOnly, "post_only")]
#[case(DeriveTimeInForce::Fok, "fok")]
#[case(DeriveTimeInForce::Ioc, "ioc")]
fn test_time_in_force_wire_strings(#[case] variant: DeriveTimeInForce, #[case] expected: &str) {
assert_eq!(variant.to_string(), expected);
assert_eq!(DeriveTimeInForce::from_str(expected).unwrap(), variant);
assert_eq!(
serde_json::to_string(&variant).unwrap(),
format!("\"{expected}\""),
);
}
#[rstest]
fn test_option_kind_serialization_uses_single_letter() {
assert_eq!(DeriveOptionKind::Call.to_string(), "C");
assert_eq!(DeriveOptionKind::Put.to_string(), "P");
assert_eq!(
DeriveOptionKind::from_str("C").unwrap(),
DeriveOptionKind::Call
);
assert_eq!(
DeriveOptionKind::from_str("P").unwrap(),
DeriveOptionKind::Put
);
}
#[rstest]
#[case(DeriveAssetType::Erc20, "erc20")]
#[case(DeriveAssetType::Option, "option")]
#[case(DeriveAssetType::Perp, "perp")]
fn test_asset_type_wire_strings(#[case] variant: DeriveAssetType, #[case] expected: &str) {
assert_eq!(variant.to_string(), expected);
assert_eq!(DeriveAssetType::from_str(expected).unwrap(), variant);
}
#[rstest]
#[case(DeriveOrderSide::Buy, "buy")]
#[case(DeriveOrderSide::Sell, "sell")]
fn test_order_side_wire_strings(#[case] variant: DeriveOrderSide, #[case] expected: &str) {
assert_eq!(variant.to_string(), expected);
assert_eq!(
serde_json::from_str::<DeriveOrderSide>(&format!("\"{expected}\"")).unwrap(),
variant
);
}
#[rstest]
#[case(DeriveOrderType::Limit, "limit")]
#[case(DeriveOrderType::Market, "market")]
fn test_order_type_wire_strings(#[case] variant: DeriveOrderType, #[case] expected: &str) {
assert_eq!(variant.to_string(), expected);
assert_eq!(DeriveOrderType::from_str(expected).unwrap(), variant);
}
#[rstest]
#[case(DeriveTriggerType::Stoploss, "stoploss")]
#[case(DeriveTriggerType::Takeprofit, "takeprofit")]
fn test_trigger_type_wire_strings(#[case] variant: DeriveTriggerType, #[case] expected: &str) {
assert_eq!(variant.to_string(), expected);
assert_eq!(DeriveTriggerType::from_str(expected).unwrap(), variant);
}
#[rstest]
#[case(DeriveTriggerPriceType::Mark, "mark")]
#[case(DeriveTriggerPriceType::Index, "index")]
fn test_trigger_price_type_wire_strings(
#[case] variant: DeriveTriggerPriceType,
#[case] expected: &str,
) {
assert_eq!(variant.to_string(), expected);
assert_eq!(DeriveTriggerPriceType::from_str(expected).unwrap(), variant);
}
#[rstest]
#[case(DeriveOrderStatus::Open, "open")]
#[case(DeriveOrderStatus::Filled, "filled")]
#[case(DeriveOrderStatus::Rejected, "rejected")]
#[case(DeriveOrderStatus::Cancelled, "cancelled")]
#[case(DeriveOrderStatus::Expired, "expired")]
#[case(DeriveOrderStatus::Untriggered, "untriggered")]
#[case(DeriveOrderStatus::AlgoActive, "algo_active")]
fn test_order_status_wire_strings(#[case] variant: DeriveOrderStatus, #[case] expected: &str) {
assert_eq!(variant.to_string(), expected);
assert_eq!(DeriveOrderStatus::from_str(expected).unwrap(), variant);
}
#[rstest]
#[case(DeriveOrderCancelReason::Empty, "")]
#[case(DeriveOrderCancelReason::UserRequest, "user_request")]
#[case(DeriveOrderCancelReason::MmpTrigger, "mmp_trigger")]
#[case(DeriveOrderCancelReason::InsufficientMargin, "insufficient_margin")]
#[case(DeriveOrderCancelReason::SignedMaxFeeTooLow, "signed_max_fee_too_low")]
#[case(DeriveOrderCancelReason::CancelOnDisconnect, "cancel_on_disconnect")]
#[case(
DeriveOrderCancelReason::IocOrMarketPartialFill,
"ioc_or_market_partial_fill"
)]
#[case(
DeriveOrderCancelReason::SessionKeyDeregistered,
"session_key_deregistered"
)]
#[case(DeriveOrderCancelReason::SubaccountWithdrawn, "subaccount_withdrawn")]
#[case(DeriveOrderCancelReason::Compliance, "compliance")]
#[case(DeriveOrderCancelReason::TriggerFailed, "trigger_failed")]
#[case(DeriveOrderCancelReason::ValidationFailed, "validation_failed")]
#[case(DeriveOrderCancelReason::AlgoCompleted, "algo_completed")]
#[case(
DeriveOrderCancelReason::PostOnlyCrossMarket,
"Post only order cannot cross the market"
)]
fn test_order_cancel_reason_wire_strings(
#[case] variant: DeriveOrderCancelReason,
#[case] expected: &str,
) {
assert_eq!(variant.to_string(), expected);
assert_eq!(
serde_json::from_str::<DeriveOrderCancelReason>(&format!("\"{expected}\"")).unwrap(),
variant
);
}
#[rstest]
#[case(DeriveRfqCancelReason::Empty, "")]
#[case(DeriveRfqCancelReason::UserRequest, "user_request")]
#[case(DeriveRfqCancelReason::InsufficientMargin, "insufficient_margin")]
#[case(DeriveRfqCancelReason::SignedMaxFeeTooLow, "signed_max_fee_too_low")]
#[case(DeriveRfqCancelReason::MmpTrigger, "mmp_trigger")]
#[case(DeriveRfqCancelReason::CancelOnDisconnect, "cancel_on_disconnect")]
#[case(
DeriveRfqCancelReason::SessionKeyDeregistered,
"session_key_deregistered"
)]
#[case(DeriveRfqCancelReason::SubaccountWithdrawn, "subaccount_withdrawn")]
#[case(DeriveRfqCancelReason::RfqNoLongerOpen, "rfq_no_longer_open")]
#[case(DeriveRfqCancelReason::Compliance, "compliance")]
fn test_rfq_cancel_reason_wire_strings(
#[case] variant: DeriveRfqCancelReason,
#[case] expected: &str,
) {
assert_eq!(variant.to_string(), expected);
assert_eq!(
serde_json::from_str::<DeriveRfqCancelReason>(&format!("\"{expected}\"")).unwrap(),
variant
);
}
#[rstest]
fn test_order_cancel_reason_empty_string_round_trips() {
let json = serde_json::to_string(&DeriveOrderCancelReason::Empty).unwrap();
assert_eq!(json, "\"\"");
let parsed: DeriveOrderCancelReason = serde_json::from_str("\"\"").unwrap();
assert_eq!(parsed, DeriveOrderCancelReason::Empty);
}
#[rstest]
#[case(DeriveLiquidityRole::Maker, "maker")]
#[case(DeriveLiquidityRole::Taker, "taker")]
fn test_liquidity_role_wire_strings(
#[case] variant: DeriveLiquidityRole,
#[case] expected: &str,
) {
assert_eq!(variant.to_string(), expected);
assert_eq!(DeriveLiquidityRole::from_str(expected).unwrap(), variant);
}
#[rstest]
#[case(DeriveTxStatus::Requested, "requested")]
#[case(DeriveTxStatus::Pending, "pending")]
#[case(DeriveTxStatus::Settled, "settled")]
#[case(DeriveTxStatus::Reverted, "reverted")]
#[case(DeriveTxStatus::Ignored, "ignored")]
fn test_tx_status_wire_strings(#[case] variant: DeriveTxStatus, #[case] expected: &str) {
assert_eq!(variant.to_string(), expected);
assert_eq!(DeriveTxStatus::from_str(expected).unwrap(), variant);
}
#[rstest]
#[case(DeriveMarginType::Sm, "SM")]
#[case(DeriveMarginType::Pm, "PM")]
#[case(DeriveMarginType::Pm2, "PM2")]
fn test_margin_type_wire_strings(#[case] variant: DeriveMarginType, #[case] expected: &str) {
assert_eq!(variant.to_string(), expected);
assert_eq!(DeriveMarginType::from_str(expected).unwrap(), variant);
}
#[rstest]
#[case(DeriveAuctionType::Solvent, "solvent")]
#[case(DeriveAuctionType::Insolvent, "insolvent")]
fn test_auction_type_wire_strings(#[case] variant: DeriveAuctionType, #[case] expected: &str) {
assert_eq!(variant.to_string(), expected);
assert_eq!(DeriveAuctionType::from_str(expected).unwrap(), variant);
}
#[rstest]
#[case(DeriveAuctionState::Ongoing, "ongoing")]
#[case(DeriveAuctionState::Ended, "ended")]
fn test_auction_state_wire_strings(
#[case] variant: DeriveAuctionState,
#[case] expected: &str,
) {
assert_eq!(variant.to_string(), expected);
assert_eq!(DeriveAuctionState::from_str(expected).unwrap(), variant);
}
#[rstest]
#[case(DeriveNotificationStatus::Unseen, "unseen")]
#[case(DeriveNotificationStatus::Seen, "seen")]
#[case(DeriveNotificationStatus::Hidden, "hidden")]
fn test_notification_status_wire_strings(
#[case] variant: DeriveNotificationStatus,
#[case] expected: &str,
) {
assert_eq!(variant.to_string(), expected);
assert_eq!(
DeriveNotificationStatus::from_str(expected).unwrap(),
variant
);
}
#[rstest]
#[case(DeriveNotificationType::Deposit, "deposit")]
#[case(DeriveNotificationType::Withdraw, "withdraw")]
#[case(DeriveNotificationType::Transfer, "transfer")]
#[case(DeriveNotificationType::Trade, "trade")]
#[case(DeriveNotificationType::Settlement, "settlement")]
#[case(DeriveNotificationType::Liquidation, "liquidation")]
#[case(DeriveNotificationType::Types, "types")]
fn test_notification_type_wire_strings(
#[case] variant: DeriveNotificationType,
#[case] expected: &str,
) {
assert_eq!(variant.to_string(), expected);
assert_eq!(DeriveNotificationType::from_str(expected).unwrap(), variant);
}
#[rstest]
#[case(DeriveBalanceUpdateType::Trade, "trade")]
#[case(DeriveBalanceUpdateType::AssetDeposit, "asset_deposit")]
#[case(DeriveBalanceUpdateType::AssetWithdrawal, "asset_withdrawal")]
#[case(DeriveBalanceUpdateType::Transfer, "transfer")]
#[case(DeriveBalanceUpdateType::SubaccountDeposit, "subaccount_deposit")]
#[case(DeriveBalanceUpdateType::SubaccountWithdrawal, "subaccount_withdrawal")]
#[case(DeriveBalanceUpdateType::Liquidation, "liquidation")]
#[case(DeriveBalanceUpdateType::OnchainDriftFix, "onchain_drift_fix")]
#[case(DeriveBalanceUpdateType::PerpSettlement, "perp_settlement")]
#[case(DeriveBalanceUpdateType::OptionSettlement, "option_settlement")]
#[case(DeriveBalanceUpdateType::InterestAccrual, "interest_accrual")]
#[case(DeriveBalanceUpdateType::OnchainRevert, "onchain_revert")]
#[case(DeriveBalanceUpdateType::DoubleRevert, "double_revert")]
fn test_balance_update_type_wire_strings(
#[case] variant: DeriveBalanceUpdateType,
#[case] expected: &str,
) {
assert_eq!(variant.to_string(), expected);
assert_eq!(
DeriveBalanceUpdateType::from_str(expected).unwrap(),
variant
);
}
#[rstest]
#[case(DeriveComplianceStatus::Enabled, "enabled")]
#[case(DeriveComplianceStatus::Disabled, "disabled")]
fn test_compliance_status_wire_strings(
#[case] variant: DeriveComplianceStatus,
#[case] expected: &str,
) {
assert_eq!(variant.to_string(), expected);
assert_eq!(DeriveComplianceStatus::from_str(expected).unwrap(), variant);
}
#[rstest]
#[case(DeriveOrderbookDepth::D1, "1")]
#[case(DeriveOrderbookDepth::D10, "10")]
#[case(DeriveOrderbookDepth::D20, "20")]
#[case(DeriveOrderbookDepth::D100, "100")]
fn test_orderbook_depth_wire_strings(
#[case] variant: DeriveOrderbookDepth,
#[case] expected: &str,
) {
assert_eq!(variant.to_string(), expected);
assert_eq!(DeriveOrderbookDepth::from_str(expected).unwrap(), variant);
}
#[rstest]
#[case(DeriveOrderbookGroup::G1, "1")]
#[case(DeriveOrderbookGroup::G10, "10")]
#[case(DeriveOrderbookGroup::G100, "100")]
fn test_orderbook_group_wire_strings(
#[case] variant: DeriveOrderbookGroup,
#[case] expected: &str,
) {
assert_eq!(variant.to_string(), expected);
assert_eq!(DeriveOrderbookGroup::from_str(expected).unwrap(), variant);
}
#[rstest]
#[case(DeriveTickerInterval::Ms100, "100")]
#[case(DeriveTickerInterval::Ms1000, "1000")]
fn test_ticker_interval_wire_strings(
#[case] variant: DeriveTickerInterval,
#[case] expected: &str,
) {
assert_eq!(variant.to_string(), expected);
assert_eq!(DeriveTickerInterval::from_str(expected).unwrap(), variant);
}
}