1use crate::prelude::*;
2mod request;
3mod response;
4mod rest;
5
6pub use request::*;
7pub use response::{Error, *};
8pub use rest::*;
9
10#[derive(Serialize, Deserialize, Debug, Clone, Copy, Hash, Eq, PartialEq)]
11#[serde(rename_all = "camelCase")]
12pub enum Side {
13 Buy,
14 Sell,
15}
16impl Display for Side {
17 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
18 write!(
19 f,
20 "{}",
21 match self {
22 | Side::Buy => "buy",
23 | _ => "sell",
24 }
25 )
26 }
27}
28
29#[derive(Serialize, Deserialize, Debug, Clone, Hash, Eq, PartialEq)]
30#[serde(rename_all = "camelCase")]
31pub enum ReportType {
32 Status,
33 New,
34 Canceled,
35 Expired,
36 Suspended,
37 Trade,
38 Replaced,
39}
40
41impl Display for ReportType {
42 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
43 write!(
44 f,
45 "{}",
46 match self {
47 | ReportType::Status => "status",
48 | ReportType::New => "new",
49 | ReportType::Canceled => "canceled",
50 | ReportType::Expired => "expired",
51 | ReportType::Suspended => "suspended",
52 | ReportType::Trade => "trade",
53 | ReportType::Replaced => "replaced",
54 }
55 )
56 }
57}
58
59#[derive(Serialize, Deserialize, Debug, Clone, Hash, Eq, PartialEq)]
60#[serde(rename_all = "camelCase")]
61pub enum OrderType {
62 Limit,
63 Market,
64 StopLimit,
65 StopMarket,
66}
67
68#[derive(Serialize, Deserialize, Debug, Clone, Copy, Hash, Eq, PartialEq)]
69#[serde(rename_all = "camelCase")]
70pub enum Status {
71 New,
72 Suspended,
73 PartiallyFilled,
74 Filled,
75 Canceled,
76 Expired,
77}
78
79impl Display for Status {
80 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
81 write!(
82 f,
83 "{}",
84 match self {
85 | Status::New => "new",
86 | Status::Suspended => "suspended",
87 | Status::PartiallyFilled => "partiallyFilled",
88 | Status::Filled => "filled",
89 | Status::Canceled => "canceled",
90 | Status::Expired => "expired",
91 }
92 )
93 }
94}
95
96#[derive(Serialize, Deserialize, Debug, Clone, Hash, Eq, PartialEq)]
97pub enum TimeInForce {
98 GTC,
99 IOC,
100 FOK,
101 Day,
102 GTD,
103}
104#[serde_as]
105#[derive(Debug, Clone, Serialize, derive_builder::Builder)]
106pub struct NewOrder {
107 #[builder(default = "crate::api::request::random_id()")]
108 pub client_order_id: String,
109 pub symbol: String,
110 pub side: Side,
111 #[builder(default = "Some(OrderType::Limit)")]
112 pub r#type: Option<OrderType>,
113 #[builder(default = "None")]
114 pub time_in_force: Option<TimeInForce>,
115 #[serde_as(as = "DisplayFromStr")]
116 pub quantity: f64,
117 #[serde_as(as = "DisplayFromStr")]
118 pub price: f64,
119 #[builder(default = "None")]
120 pub stop_price: Option<f64>,
121 #[builder(default = "None")]
122 pub expire_time: Option<DateTime<Utc>>,
123 #[builder(default = "None")]
124 pub strict_validate: Option<bool>,
125 #[builder(default = "None")]
126 pub post_only: Option<bool>,
127}
128
129use std::fmt::{self, *};
130
131impl Display for NewOrder {
132 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
133 write!(
134 f,
135 "{:15} | {:>4} {:<8} | {:10.10} | {:10.10} | {:10.10} |",
136 self.client_order_id, self.side, self.symbol, self.quantity, 0.0, self.price
137 )
138 }
139}
140
141