1use serde::{Deserialize, Serialize};
24use strum::{AsRefStr, Display, EnumIter, EnumString};
25
26#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, Hash, Serialize, Deserialize)]
29#[serde(rename_all = "lowercase")]
30#[cfg_attr(
31 feature = "python",
32 pyo3::pyclass(
33 module = "nautilus_trader.adapters.derive",
34 eq,
35 eq_int,
36 frozen,
37 from_py_object,
38 rename_all = "SCREAMING_SNAKE_CASE"
39 )
40)]
41#[cfg_attr(
42 feature = "python",
43 pyo3_stub_gen::derive::gen_stub_pyclass_enum(module = "nautilus_trader.adapters.derive")
44)]
45pub enum DeriveEnvironment {
46 #[default]
48 Mainnet,
49 Testnet,
51}
52
53impl DeriveEnvironment {
54 #[must_use]
55 pub const fn is_testnet(self) -> bool {
56 matches!(self, Self::Testnet)
57 }
58}
59
60#[derive(
64 Debug,
65 Clone,
66 Copy,
67 PartialEq,
68 Eq,
69 Hash,
70 Serialize,
71 Deserialize,
72 Display,
73 EnumString,
74 AsRefStr,
75 EnumIter,
76)]
77#[serde(rename_all = "lowercase")]
78#[strum(serialize_all = "lowercase")]
79pub enum DeriveInstrumentType {
80 Erc20,
82 Option,
84 Perp,
86 #[serde(other)]
88 Unknown,
89}
90
91#[derive(
96 Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Display, EnumString, EnumIter,
97)]
98#[serde(rename_all = "lowercase")]
99#[strum(serialize_all = "lowercase")]
100pub enum DeriveAssetType {
101 Erc20,
103 Option,
105 Perp,
107 #[serde(other)]
109 Unknown,
110}
111
112#[derive(
114 Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Display, EnumString, AsRefStr,
115)]
116#[serde(rename_all = "lowercase")]
117#[strum(serialize_all = "lowercase")]
118pub enum DeriveOrderSide {
119 Buy,
120 Sell,
121}
122
123#[derive(
125 Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Display, EnumString, AsRefStr,
126)]
127#[serde(rename_all = "lowercase")]
128#[strum(serialize_all = "lowercase")]
129pub enum DeriveOrderType {
130 Limit,
131 Market,
132 #[serde(other)]
134 Unknown,
135}
136
137#[derive(
139 Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Display, EnumString, AsRefStr,
140)]
141#[serde(rename_all = "lowercase")]
142#[strum(serialize_all = "lowercase")]
143pub enum DeriveTriggerType {
144 Stoploss,
146 Takeprofit,
148 #[serde(other)]
150 Unknown,
151}
152
153#[derive(
155 Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Display, EnumString, AsRefStr,
156)]
157#[serde(rename_all = "lowercase")]
158#[strum(serialize_all = "lowercase")]
159pub enum DeriveTriggerPriceType {
160 Mark,
162 Index,
164 #[serde(other)]
166 Unknown,
167}
168
169#[derive(
172 Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Display, EnumString, AsRefStr,
173)]
174#[serde(rename_all = "snake_case")]
175#[strum(serialize_all = "snake_case")]
176pub enum DeriveOrderStatus {
177 Open,
179 Filled,
181 Rejected,
183 Cancelled,
185 Expired,
187 Untriggered,
189 AlgoActive,
191}
192
193#[derive(
195 Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Display, EnumString, AsRefStr,
196)]
197#[serde(rename_all = "snake_case")]
198#[strum(serialize_all = "snake_case")]
199pub enum DeriveTimeInForce {
200 Gtc,
202 PostOnly,
204 Fok,
206 Ioc,
208 #[serde(other)]
210 Unknown,
211}
212
213#[derive(
215 Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Display, EnumString, AsRefStr,
216)]
217pub enum DeriveOptionKind {
218 #[serde(rename = "C")]
220 #[strum(serialize = "C")]
221 Call,
222 #[serde(rename = "P")]
224 #[strum(serialize = "P")]
225 Put,
226}
227
228#[derive(
234 Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Display, EnumString, AsRefStr,
235)]
236pub enum DeriveOrderCancelReason {
237 #[serde(rename = "")]
239 #[strum(serialize = "")]
240 Empty,
241 #[serde(rename = "user_request")]
243 #[strum(serialize = "user_request")]
244 UserRequest,
245 #[serde(rename = "mmp_trigger")]
247 #[strum(serialize = "mmp_trigger")]
248 MmpTrigger,
249 #[serde(rename = "insufficient_margin")]
251 #[strum(serialize = "insufficient_margin")]
252 InsufficientMargin,
253 #[serde(rename = "signed_max_fee_too_low")]
255 #[strum(serialize = "signed_max_fee_too_low")]
256 SignedMaxFeeTooLow,
257 #[serde(rename = "cancel_on_disconnect")]
259 #[strum(serialize = "cancel_on_disconnect")]
260 CancelOnDisconnect,
261 #[serde(rename = "ioc_or_market_partial_fill")]
263 #[strum(serialize = "ioc_or_market_partial_fill")]
264 IocOrMarketPartialFill,
265 #[serde(rename = "session_key_deregistered")]
267 #[strum(serialize = "session_key_deregistered")]
268 SessionKeyDeregistered,
269 #[serde(rename = "subaccount_withdrawn")]
271 #[strum(serialize = "subaccount_withdrawn")]
272 SubaccountWithdrawn,
273 #[serde(rename = "compliance")]
275 #[strum(serialize = "compliance")]
276 Compliance,
277 #[serde(rename = "trigger_failed")]
279 #[strum(serialize = "trigger_failed")]
280 TriggerFailed,
281 #[serde(rename = "validation_failed")]
283 #[strum(serialize = "validation_failed")]
284 ValidationFailed,
285 #[serde(rename = "algo_completed")]
287 #[strum(serialize = "algo_completed")]
288 AlgoCompleted,
289 #[serde(rename = "Post only order cannot cross the market")]
291 #[strum(serialize = "Post only order cannot cross the market")]
292 PostOnlyCrossMarket,
293 #[serde(rename = "unknown", other)]
296 #[strum(serialize = "unknown")]
297 Unknown,
298}
299
300#[derive(
304 Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Display, EnumString, AsRefStr,
305)]
306pub enum DeriveRfqCancelReason {
307 #[serde(rename = "")]
309 #[strum(serialize = "")]
310 Empty,
311 #[serde(rename = "user_request")]
313 #[strum(serialize = "user_request")]
314 UserRequest,
315 #[serde(rename = "insufficient_margin")]
317 #[strum(serialize = "insufficient_margin")]
318 InsufficientMargin,
319 #[serde(rename = "signed_max_fee_too_low")]
321 #[strum(serialize = "signed_max_fee_too_low")]
322 SignedMaxFeeTooLow,
323 #[serde(rename = "mmp_trigger")]
325 #[strum(serialize = "mmp_trigger")]
326 MmpTrigger,
327 #[serde(rename = "cancel_on_disconnect")]
329 #[strum(serialize = "cancel_on_disconnect")]
330 CancelOnDisconnect,
331 #[serde(rename = "session_key_deregistered")]
333 #[strum(serialize = "session_key_deregistered")]
334 SessionKeyDeregistered,
335 #[serde(rename = "subaccount_withdrawn")]
337 #[strum(serialize = "subaccount_withdrawn")]
338 SubaccountWithdrawn,
339 #[serde(rename = "rfq_no_longer_open")]
341 #[strum(serialize = "rfq_no_longer_open")]
342 RfqNoLongerOpen,
343 #[serde(rename = "compliance")]
345 #[strum(serialize = "compliance")]
346 Compliance,
347}
348
349#[derive(
351 Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Display, EnumString, AsRefStr,
352)]
353#[serde(rename_all = "lowercase")]
354#[strum(serialize_all = "lowercase")]
355pub enum DeriveLiquidityRole {
356 Maker,
358 Taker,
360 #[serde(other)]
362 Unknown,
363}
364
365#[derive(
373 Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Display, EnumString, AsRefStr,
374)]
375#[serde(rename_all = "lowercase")]
376#[strum(serialize_all = "lowercase")]
377pub enum DeriveTxStatus {
378 Requested,
380 Pending,
382 Settled,
384 Reverted,
386 Ignored,
388}
389
390#[derive(
394 Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Display, EnumString, AsRefStr,
395)]
396pub enum DeriveMarginType {
397 #[serde(rename = "SM")]
399 #[strum(serialize = "SM")]
400 Sm,
401 #[serde(rename = "PM")]
403 #[strum(serialize = "PM")]
404 Pm,
405 #[serde(rename = "PM2")]
407 #[strum(serialize = "PM2")]
408 Pm2,
409 #[serde(rename = "unknown", other)]
411 #[strum(serialize = "unknown")]
412 Unknown,
413}
414
415#[derive(
417 Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Display, EnumString, AsRefStr,
418)]
419#[serde(rename_all = "lowercase")]
420#[strum(serialize_all = "lowercase")]
421pub enum DeriveAuctionType {
422 Solvent,
424 Insolvent,
426}
427
428#[derive(
430 Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Display, EnumString, AsRefStr,
431)]
432#[serde(rename_all = "lowercase")]
433#[strum(serialize_all = "lowercase")]
434pub enum DeriveAuctionState {
435 Ongoing,
437 Ended,
439}
440
441#[derive(
444 Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Display, EnumString, AsRefStr,
445)]
446#[serde(rename_all = "lowercase")]
447#[strum(serialize_all = "lowercase")]
448pub enum DeriveNotificationStatus {
449 Unseen,
451 Seen,
453 Hidden,
455}
456
457#[derive(
461 Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Display, EnumString, AsRefStr,
462)]
463#[serde(rename_all = "lowercase")]
464#[strum(serialize_all = "lowercase")]
465pub enum DeriveNotificationType {
466 Deposit,
468 Withdraw,
470 Transfer,
472 Trade,
474 Settlement,
476 Liquidation,
478 Types,
480}
481
482#[derive(
485 Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Display, EnumString, AsRefStr,
486)]
487#[serde(rename_all = "snake_case")]
488#[strum(serialize_all = "snake_case")]
489pub enum DeriveBalanceUpdateType {
490 Trade,
492 AssetDeposit,
494 AssetWithdrawal,
496 Transfer,
498 SubaccountDeposit,
500 SubaccountWithdrawal,
502 Liquidation,
504 OnchainDriftFix,
506 PerpSettlement,
508 OptionSettlement,
510 InterestAccrual,
512 OnchainRevert,
514 DoubleRevert,
516}
517
518#[derive(
520 Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Display, EnumString, AsRefStr,
521)]
522#[serde(rename_all = "lowercase")]
523#[strum(serialize_all = "lowercase")]
524pub enum DeriveComplianceStatus {
525 Enabled,
527 Disabled,
529}
530
531#[derive(
534 Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Display, EnumString, AsRefStr,
535)]
536pub enum DeriveOrderbookDepth {
537 #[serde(rename = "1")]
539 #[strum(serialize = "1")]
540 D1,
541 #[serde(rename = "10")]
543 #[strum(serialize = "10")]
544 D10,
545 #[serde(rename = "20")]
547 #[strum(serialize = "20")]
548 D20,
549 #[serde(rename = "100")]
551 #[strum(serialize = "100")]
552 D100,
553}
554
555#[derive(
557 Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Display, EnumString, AsRefStr,
558)]
559pub enum DeriveOrderbookGroup {
560 #[serde(rename = "1")]
562 #[strum(serialize = "1")]
563 G1,
564 #[serde(rename = "10")]
566 #[strum(serialize = "10")]
567 G10,
568 #[serde(rename = "100")]
570 #[strum(serialize = "100")]
571 G100,
572}
573
574#[derive(
577 Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Display, EnumString, AsRefStr,
578)]
579pub enum DeriveTickerInterval {
580 #[serde(rename = "100")]
582 #[strum(serialize = "100")]
583 Ms100,
584 #[serde(rename = "1000")]
586 #[strum(serialize = "1000")]
587 Ms1000,
588}
589
590#[cfg(test)]
591mod tests {
592 use std::str::FromStr;
593
594 use rstest::rstest;
595
596 use super::*;
597
598 #[rstest]
599 fn test_environment_default_is_mainnet() {
600 assert_eq!(DeriveEnvironment::default(), DeriveEnvironment::Mainnet);
601 assert!(!DeriveEnvironment::default().is_testnet());
602 assert!(DeriveEnvironment::Testnet.is_testnet());
603 }
604
605 #[rstest]
606 #[case(DeriveInstrumentType::Erc20, "erc20")]
607 #[case(DeriveInstrumentType::Option, "option")]
608 #[case(DeriveInstrumentType::Perp, "perp")]
609 #[case(DeriveInstrumentType::Unknown, "unknown")]
610 fn test_instrument_type_display(#[case] variant: DeriveInstrumentType, #[case] expected: &str) {
611 assert_eq!(variant.to_string(), expected);
612 }
613
614 #[rstest]
615 #[case(DeriveTimeInForce::Gtc, "gtc")]
616 #[case(DeriveTimeInForce::PostOnly, "post_only")]
617 #[case(DeriveTimeInForce::Fok, "fok")]
618 #[case(DeriveTimeInForce::Ioc, "ioc")]
619 #[case(DeriveTimeInForce::Unknown, "unknown")]
620 fn test_time_in_force_wire_strings(#[case] variant: DeriveTimeInForce, #[case] expected: &str) {
621 assert_eq!(variant.to_string(), expected);
622 assert_eq!(DeriveTimeInForce::from_str(expected).unwrap(), variant);
623 assert_eq!(
624 serde_json::to_string(&variant).unwrap(),
625 format!("\"{expected}\""),
626 );
627 }
628
629 #[rstest]
630 fn test_option_kind_serialization_uses_single_letter() {
631 assert_eq!(DeriveOptionKind::Call.to_string(), "C");
632 assert_eq!(DeriveOptionKind::Put.to_string(), "P");
633 assert_eq!(
634 DeriveOptionKind::from_str("C").unwrap(),
635 DeriveOptionKind::Call
636 );
637 assert_eq!(
638 DeriveOptionKind::from_str("P").unwrap(),
639 DeriveOptionKind::Put
640 );
641 }
642
643 #[rstest]
644 #[case(DeriveAssetType::Erc20, "erc20")]
645 #[case(DeriveAssetType::Option, "option")]
646 #[case(DeriveAssetType::Perp, "perp")]
647 #[case(DeriveAssetType::Unknown, "unknown")]
648 fn test_asset_type_wire_strings(#[case] variant: DeriveAssetType, #[case] expected: &str) {
649 assert_eq!(variant.to_string(), expected);
650 assert_eq!(DeriveAssetType::from_str(expected).unwrap(), variant);
651 }
652
653 #[rstest]
654 #[case(DeriveOrderSide::Buy, "buy")]
655 #[case(DeriveOrderSide::Sell, "sell")]
656 fn test_order_side_wire_strings(#[case] variant: DeriveOrderSide, #[case] expected: &str) {
657 assert_eq!(variant.to_string(), expected);
658 assert_eq!(
659 serde_json::from_str::<DeriveOrderSide>(&format!("\"{expected}\"")).unwrap(),
660 variant
661 );
662 }
663
664 #[rstest]
665 #[case(DeriveOrderType::Limit, "limit")]
666 #[case(DeriveOrderType::Market, "market")]
667 #[case(DeriveOrderType::Unknown, "unknown")]
668 fn test_order_type_wire_strings(#[case] variant: DeriveOrderType, #[case] expected: &str) {
669 assert_eq!(variant.to_string(), expected);
670 assert_eq!(DeriveOrderType::from_str(expected).unwrap(), variant);
671 }
672
673 #[rstest]
674 #[case(DeriveTriggerType::Stoploss, "stoploss")]
675 #[case(DeriveTriggerType::Takeprofit, "takeprofit")]
676 #[case(DeriveTriggerType::Unknown, "unknown")]
677 fn test_trigger_type_wire_strings(#[case] variant: DeriveTriggerType, #[case] expected: &str) {
678 assert_eq!(variant.to_string(), expected);
679 assert_eq!(DeriveTriggerType::from_str(expected).unwrap(), variant);
680 }
681
682 #[rstest]
683 #[case(DeriveTriggerPriceType::Mark, "mark")]
684 #[case(DeriveTriggerPriceType::Index, "index")]
685 #[case(DeriveTriggerPriceType::Unknown, "unknown")]
686 fn test_trigger_price_type_wire_strings(
687 #[case] variant: DeriveTriggerPriceType,
688 #[case] expected: &str,
689 ) {
690 assert_eq!(variant.to_string(), expected);
691 assert_eq!(DeriveTriggerPriceType::from_str(expected).unwrap(), variant);
692 }
693
694 #[rstest]
695 #[case(DeriveOrderStatus::Open, "open")]
696 #[case(DeriveOrderStatus::Filled, "filled")]
697 #[case(DeriveOrderStatus::Rejected, "rejected")]
698 #[case(DeriveOrderStatus::Cancelled, "cancelled")]
699 #[case(DeriveOrderStatus::Expired, "expired")]
700 #[case(DeriveOrderStatus::Untriggered, "untriggered")]
701 #[case(DeriveOrderStatus::AlgoActive, "algo_active")]
702 fn test_order_status_wire_strings(#[case] variant: DeriveOrderStatus, #[case] expected: &str) {
703 assert_eq!(variant.to_string(), expected);
704 assert_eq!(DeriveOrderStatus::from_str(expected).unwrap(), variant);
705 }
706
707 #[rstest]
708 #[case(DeriveOrderCancelReason::Empty, "")]
709 #[case(DeriveOrderCancelReason::UserRequest, "user_request")]
710 #[case(DeriveOrderCancelReason::MmpTrigger, "mmp_trigger")]
711 #[case(DeriveOrderCancelReason::InsufficientMargin, "insufficient_margin")]
712 #[case(DeriveOrderCancelReason::SignedMaxFeeTooLow, "signed_max_fee_too_low")]
713 #[case(DeriveOrderCancelReason::CancelOnDisconnect, "cancel_on_disconnect")]
714 #[case(
715 DeriveOrderCancelReason::IocOrMarketPartialFill,
716 "ioc_or_market_partial_fill"
717 )]
718 #[case(
719 DeriveOrderCancelReason::SessionKeyDeregistered,
720 "session_key_deregistered"
721 )]
722 #[case(DeriveOrderCancelReason::SubaccountWithdrawn, "subaccount_withdrawn")]
723 #[case(DeriveOrderCancelReason::Compliance, "compliance")]
724 #[case(DeriveOrderCancelReason::TriggerFailed, "trigger_failed")]
725 #[case(DeriveOrderCancelReason::ValidationFailed, "validation_failed")]
726 #[case(DeriveOrderCancelReason::AlgoCompleted, "algo_completed")]
727 #[case(
728 DeriveOrderCancelReason::PostOnlyCrossMarket,
729 "Post only order cannot cross the market"
730 )]
731 #[case(DeriveOrderCancelReason::Unknown, "unknown")]
732 fn test_order_cancel_reason_wire_strings(
733 #[case] variant: DeriveOrderCancelReason,
734 #[case] expected: &str,
735 ) {
736 assert_eq!(variant.to_string(), expected);
737 assert_eq!(
738 serde_json::from_str::<DeriveOrderCancelReason>(&format!("\"{expected}\"")).unwrap(),
739 variant
740 );
741 }
742
743 #[rstest]
744 #[case(DeriveRfqCancelReason::Empty, "")]
745 #[case(DeriveRfqCancelReason::UserRequest, "user_request")]
746 #[case(DeriveRfqCancelReason::InsufficientMargin, "insufficient_margin")]
747 #[case(DeriveRfqCancelReason::SignedMaxFeeTooLow, "signed_max_fee_too_low")]
748 #[case(DeriveRfqCancelReason::MmpTrigger, "mmp_trigger")]
749 #[case(DeriveRfqCancelReason::CancelOnDisconnect, "cancel_on_disconnect")]
750 #[case(
751 DeriveRfqCancelReason::SessionKeyDeregistered,
752 "session_key_deregistered"
753 )]
754 #[case(DeriveRfqCancelReason::SubaccountWithdrawn, "subaccount_withdrawn")]
755 #[case(DeriveRfqCancelReason::RfqNoLongerOpen, "rfq_no_longer_open")]
756 #[case(DeriveRfqCancelReason::Compliance, "compliance")]
757 fn test_rfq_cancel_reason_wire_strings(
758 #[case] variant: DeriveRfqCancelReason,
759 #[case] expected: &str,
760 ) {
761 assert_eq!(variant.to_string(), expected);
762 assert_eq!(
763 serde_json::from_str::<DeriveRfqCancelReason>(&format!("\"{expected}\"")).unwrap(),
764 variant
765 );
766 }
767
768 #[rstest]
769 fn test_response_enums_decode_unknown_wire_strings_leniently() {
770 assert_eq!(
771 serde_json::from_str::<DeriveInstrumentType>("\"structured\"").unwrap(),
772 DeriveInstrumentType::Unknown,
773 );
774 assert_eq!(
775 serde_json::from_str::<DeriveAssetType>("\"structured\"").unwrap(),
776 DeriveAssetType::Unknown,
777 );
778 assert_eq!(
779 serde_json::from_str::<DeriveOrderType>("\"twap\"").unwrap(),
780 DeriveOrderType::Unknown,
781 );
782 assert_eq!(
783 serde_json::from_str::<DeriveTriggerType>("\"trailing_stop\"").unwrap(),
784 DeriveTriggerType::Unknown,
785 );
786 assert_eq!(
787 serde_json::from_str::<DeriveTriggerPriceType>("\"last\"").unwrap(),
788 DeriveTriggerPriceType::Unknown,
789 );
790 assert_eq!(
791 serde_json::from_str::<DeriveTimeInForce>("\"day\"").unwrap(),
792 DeriveTimeInForce::Unknown,
793 );
794 assert_eq!(
795 serde_json::from_str::<DeriveOrderCancelReason>("\"Trigger worker restarted\"")
796 .unwrap(),
797 DeriveOrderCancelReason::Unknown,
798 );
799 assert_eq!(
800 serde_json::from_str::<DeriveLiquidityRole>("\"auction\"").unwrap(),
801 DeriveLiquidityRole::Unknown,
802 );
803 assert_eq!(
804 serde_json::from_str::<DeriveMarginType>("\"PM3\"").unwrap(),
805 DeriveMarginType::Unknown,
806 );
807
808 assert!(serde_json::from_str::<DeriveTxStatus>("\"bridging\"").is_err());
810 }
811
812 #[rstest]
813 fn test_order_cancel_reason_empty_string_round_trips() {
814 let json = serde_json::to_string(&DeriveOrderCancelReason::Empty).unwrap();
815 assert_eq!(json, "\"\"");
816 let parsed: DeriveOrderCancelReason = serde_json::from_str("\"\"").unwrap();
817 assert_eq!(parsed, DeriveOrderCancelReason::Empty);
818 }
819
820 #[rstest]
821 #[case(DeriveLiquidityRole::Maker, "maker")]
822 #[case(DeriveLiquidityRole::Taker, "taker")]
823 #[case(DeriveLiquidityRole::Unknown, "unknown")]
824 fn test_liquidity_role_wire_strings(
825 #[case] variant: DeriveLiquidityRole,
826 #[case] expected: &str,
827 ) {
828 assert_eq!(variant.to_string(), expected);
829 assert_eq!(DeriveLiquidityRole::from_str(expected).unwrap(), variant);
830 }
831
832 #[rstest]
833 #[case(DeriveTxStatus::Requested, "requested")]
834 #[case(DeriveTxStatus::Pending, "pending")]
835 #[case(DeriveTxStatus::Settled, "settled")]
836 #[case(DeriveTxStatus::Reverted, "reverted")]
837 #[case(DeriveTxStatus::Ignored, "ignored")]
838 fn test_tx_status_wire_strings(#[case] variant: DeriveTxStatus, #[case] expected: &str) {
839 assert_eq!(variant.to_string(), expected);
840 assert_eq!(DeriveTxStatus::from_str(expected).unwrap(), variant);
841 }
842
843 #[rstest]
844 #[case(DeriveMarginType::Sm, "SM")]
845 #[case(DeriveMarginType::Pm, "PM")]
846 #[case(DeriveMarginType::Pm2, "PM2")]
847 #[case(DeriveMarginType::Unknown, "unknown")]
848 fn test_margin_type_wire_strings(#[case] variant: DeriveMarginType, #[case] expected: &str) {
849 assert_eq!(variant.to_string(), expected);
850 assert_eq!(DeriveMarginType::from_str(expected).unwrap(), variant);
851 }
852
853 #[rstest]
854 #[case(DeriveAuctionType::Solvent, "solvent")]
855 #[case(DeriveAuctionType::Insolvent, "insolvent")]
856 fn test_auction_type_wire_strings(#[case] variant: DeriveAuctionType, #[case] expected: &str) {
857 assert_eq!(variant.to_string(), expected);
858 assert_eq!(DeriveAuctionType::from_str(expected).unwrap(), variant);
859 }
860
861 #[rstest]
862 #[case(DeriveAuctionState::Ongoing, "ongoing")]
863 #[case(DeriveAuctionState::Ended, "ended")]
864 fn test_auction_state_wire_strings(
865 #[case] variant: DeriveAuctionState,
866 #[case] expected: &str,
867 ) {
868 assert_eq!(variant.to_string(), expected);
869 assert_eq!(DeriveAuctionState::from_str(expected).unwrap(), variant);
870 }
871
872 #[rstest]
873 #[case(DeriveNotificationStatus::Unseen, "unseen")]
874 #[case(DeriveNotificationStatus::Seen, "seen")]
875 #[case(DeriveNotificationStatus::Hidden, "hidden")]
876 fn test_notification_status_wire_strings(
877 #[case] variant: DeriveNotificationStatus,
878 #[case] expected: &str,
879 ) {
880 assert_eq!(variant.to_string(), expected);
881 assert_eq!(
882 DeriveNotificationStatus::from_str(expected).unwrap(),
883 variant
884 );
885 }
886
887 #[rstest]
888 #[case(DeriveNotificationType::Deposit, "deposit")]
889 #[case(DeriveNotificationType::Withdraw, "withdraw")]
890 #[case(DeriveNotificationType::Transfer, "transfer")]
891 #[case(DeriveNotificationType::Trade, "trade")]
892 #[case(DeriveNotificationType::Settlement, "settlement")]
893 #[case(DeriveNotificationType::Liquidation, "liquidation")]
894 #[case(DeriveNotificationType::Types, "types")]
895 fn test_notification_type_wire_strings(
896 #[case] variant: DeriveNotificationType,
897 #[case] expected: &str,
898 ) {
899 assert_eq!(variant.to_string(), expected);
900 assert_eq!(DeriveNotificationType::from_str(expected).unwrap(), variant);
901 }
902
903 #[rstest]
904 #[case(DeriveBalanceUpdateType::Trade, "trade")]
905 #[case(DeriveBalanceUpdateType::AssetDeposit, "asset_deposit")]
906 #[case(DeriveBalanceUpdateType::AssetWithdrawal, "asset_withdrawal")]
907 #[case(DeriveBalanceUpdateType::Transfer, "transfer")]
908 #[case(DeriveBalanceUpdateType::SubaccountDeposit, "subaccount_deposit")]
909 #[case(DeriveBalanceUpdateType::SubaccountWithdrawal, "subaccount_withdrawal")]
910 #[case(DeriveBalanceUpdateType::Liquidation, "liquidation")]
911 #[case(DeriveBalanceUpdateType::OnchainDriftFix, "onchain_drift_fix")]
912 #[case(DeriveBalanceUpdateType::PerpSettlement, "perp_settlement")]
913 #[case(DeriveBalanceUpdateType::OptionSettlement, "option_settlement")]
914 #[case(DeriveBalanceUpdateType::InterestAccrual, "interest_accrual")]
915 #[case(DeriveBalanceUpdateType::OnchainRevert, "onchain_revert")]
916 #[case(DeriveBalanceUpdateType::DoubleRevert, "double_revert")]
917 fn test_balance_update_type_wire_strings(
918 #[case] variant: DeriveBalanceUpdateType,
919 #[case] expected: &str,
920 ) {
921 assert_eq!(variant.to_string(), expected);
922 assert_eq!(
923 DeriveBalanceUpdateType::from_str(expected).unwrap(),
924 variant
925 );
926 }
927
928 #[rstest]
929 #[case(DeriveComplianceStatus::Enabled, "enabled")]
930 #[case(DeriveComplianceStatus::Disabled, "disabled")]
931 fn test_compliance_status_wire_strings(
932 #[case] variant: DeriveComplianceStatus,
933 #[case] expected: &str,
934 ) {
935 assert_eq!(variant.to_string(), expected);
936 assert_eq!(DeriveComplianceStatus::from_str(expected).unwrap(), variant);
937 }
938
939 #[rstest]
940 #[case(DeriveOrderbookDepth::D1, "1")]
941 #[case(DeriveOrderbookDepth::D10, "10")]
942 #[case(DeriveOrderbookDepth::D20, "20")]
943 #[case(DeriveOrderbookDepth::D100, "100")]
944 fn test_orderbook_depth_wire_strings(
945 #[case] variant: DeriveOrderbookDepth,
946 #[case] expected: &str,
947 ) {
948 assert_eq!(variant.to_string(), expected);
949 assert_eq!(DeriveOrderbookDepth::from_str(expected).unwrap(), variant);
950 }
951
952 #[rstest]
953 #[case(DeriveOrderbookGroup::G1, "1")]
954 #[case(DeriveOrderbookGroup::G10, "10")]
955 #[case(DeriveOrderbookGroup::G100, "100")]
956 fn test_orderbook_group_wire_strings(
957 #[case] variant: DeriveOrderbookGroup,
958 #[case] expected: &str,
959 ) {
960 assert_eq!(variant.to_string(), expected);
961 assert_eq!(DeriveOrderbookGroup::from_str(expected).unwrap(), variant);
962 }
963
964 #[rstest]
965 #[case(DeriveTickerInterval::Ms100, "100")]
966 #[case(DeriveTickerInterval::Ms1000, "1000")]
967 fn test_ticker_interval_wire_strings(
968 #[case] variant: DeriveTickerInterval,
969 #[case] expected: &str,
970 ) {
971 assert_eq!(variant.to_string(), expected);
972 assert_eq!(DeriveTickerInterval::from_str(expected).unwrap(), variant);
973 }
974}