cryptomarket/api/
mod.rs

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// #[derive(Debug, Clone, Serialize, )]
142// struct Trade {
143
144// }