1use serde::{Deserialize, Serialize};
7
8use crate::{
9 order::{OrderId, Price, Quantity},
10 LimitOrderOptions, MarketOrderOptions,
11};
12
13#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
15#[serde(rename_all = "snake_case")]
16pub enum OrderType {
17 Market,
19 Limit,
21 }
25
26#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
28#[serde(rename_all = "lowercase")]
29pub enum Side {
30 Buy,
32 Sell,
34}
35
36#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
38#[serde(rename_all = "UPPERCASE")]
39pub enum TimeInForce {
40 GTC,
42 IOC,
44 FOK,
46}
47
48#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
50#[serde(rename_all = "snake_case")]
51pub enum OrderStatus {
52 New,
54 PartiallyFilled,
56 Filled,
58 Canceled,
60 Rejected,
62}
63
64#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
69#[serde(rename_all = "snake_case")]
70pub enum JournalOp {
71 Market,
73 Limit,
75 Modify,
77 Cancel,
79}
80
81#[derive(Debug, Clone, Copy, PartialEq, Eq)]
82pub enum OrderOptions {
83 Market(MarketOrderOptions),
84 Limit(LimitOrderOptions),
85 Modify { id: OrderId, price: Option<Price>, quantity: Option<Quantity> },
86 Cancel(OrderId),
87}
88
89#[cfg(test)]
90mod tests {
91 use super::*;
92 use serde_json::to_string;
93
94 #[test]
95 fn test_enum_serialization() {
96 assert_eq!(to_string(&Side::Buy).unwrap(), "\"buy\"");
97 assert_eq!(to_string(&Side::Sell).unwrap(), "\"sell\"");
98
99 assert_eq!(to_string(&OrderType::Market).unwrap(), "\"market\"");
100 assert_eq!(to_string(&OrderType::Limit).unwrap(), "\"limit\"");
101
102 assert_eq!(to_string(&OrderStatus::New).unwrap(), "\"new\"");
103 assert_eq!(to_string(&OrderStatus::PartiallyFilled).unwrap(), "\"partially_filled\"");
104 assert_eq!(to_string(&OrderStatus::Filled).unwrap(), "\"filled\"");
105 assert_eq!(to_string(&OrderStatus::Canceled).unwrap(), "\"canceled\"");
106 assert_eq!(to_string(&OrderStatus::Rejected).unwrap(), "\"rejected\"");
107
108 assert_eq!(to_string(&TimeInForce::GTC).unwrap(), "\"GTC\"");
109 assert_eq!(to_string(&TimeInForce::IOC).unwrap(), "\"IOC\"");
110 assert_eq!(to_string(&TimeInForce::FOK).unwrap(), "\"FOK\"");
111
112 assert_eq!(to_string(&JournalOp::Market).unwrap(), "\"market\"");
113 assert_eq!(to_string(&JournalOp::Limit).unwrap(), "\"limit\"");
114 assert_eq!(to_string(&JournalOp::Cancel).unwrap(), "\"cancel\"");
115 }
116}