1use serde::{Deserialize, Serialize};
4
5#[derive(Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
14#[serde(transparent)]
15pub struct RedactedString(String);
16
17impl RedactedString {
18 pub fn new(s: impl Into<String>) -> Self {
20 Self(s.into())
21 }
22
23 pub fn expose_secret(&self) -> &str {
26 &self.0
27 }
28}
29
30impl std::fmt::Debug for RedactedString {
31 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
32 f.write_str("RedactedString(***)")
35 }
36}
37
38impl From<String> for RedactedString {
39 fn from(s: String) -> Self {
40 Self(s)
41 }
42}
43
44impl From<&str> for RedactedString {
45 fn from(s: &str) -> Self {
46 Self(s.to_owned())
47 }
48}
49
50
51#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
53#[serde(rename_all = "lowercase")]
54pub enum Category {
55 Spot,
57 Linear,
59 Inverse,
61 Option,
63}
64
65impl std::fmt::Display for Category {
66 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
67 match self {
68 Self::Spot => write!(f, "spot"),
69 Self::Linear => write!(f, "linear"),
70 Self::Inverse => write!(f, "inverse"),
71 Self::Option => write!(f, "option"),
72 }
73 }
74}
75
76#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
78pub enum Side {
79 Buy,
81 Sell,
83}
84
85impl std::fmt::Display for Side {
86 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
87 match self {
88 Self::Buy => write!(f, "Buy"),
89 Self::Sell => write!(f, "Sell"),
90 }
91 }
92}
93
94#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
96pub enum OrderType {
97 Market,
99 Limit,
101}
102
103#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
105pub enum TimeInForce {
106 GTC,
108 IOC,
110 FOK,
112 PostOnly,
114}
115
116#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
118pub enum OrderStatus {
119 Created,
121 New,
123 Rejected,
125 PartiallyFilled,
127 PartiallyFilledCanceled,
129 Filled,
131 Cancelled,
133 Untriggered,
135 Triggered,
137 Deactivated,
139 Active,
141}
142
143#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
145pub enum PositionIdx {
146 #[serde(rename = "0")]
148 OneWay = 0,
149 #[serde(rename = "1")]
151 HedgeBuy = 1,
152 #[serde(rename = "2")]
154 HedgeSell = 2,
155}
156
157#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
159pub enum AccountType {
160 CONTRACT,
162 UNIFIED,
164 SPOT,
166 INVESTMENT,
168 OPTION,
170 FUND,
172}
173
174impl std::fmt::Display for AccountType {
175 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
176 match self {
177 Self::CONTRACT => write!(f, "CONTRACT"),
178 Self::UNIFIED => write!(f, "UNIFIED"),
179 Self::SPOT => write!(f, "SPOT"),
180 Self::INVESTMENT => write!(f, "INVESTMENT"),
181 Self::OPTION => write!(f, "OPTION"),
182 Self::FUND => write!(f, "FUND"),
183 }
184 }
185}
186
187#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
189pub enum Interval {
190 #[serde(rename = "1")]
192 M1,
193 #[serde(rename = "3")]
195 M3,
196 #[serde(rename = "5")]
198 M5,
199 #[serde(rename = "15")]
201 M15,
202 #[serde(rename = "30")]
204 M30,
205 #[serde(rename = "60")]
207 H1,
208 #[serde(rename = "120")]
210 H2,
211 #[serde(rename = "240")]
213 H4,
214 #[serde(rename = "360")]
216 H6,
217 #[serde(rename = "720")]
219 H12,
220 #[serde(rename = "D")]
222 D1,
223 #[serde(rename = "W")]
225 W1,
226 #[serde(rename = "M")]
228 M1Month,
229}
230
231impl std::fmt::Display for Interval {
232 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
233 match self {
234 Self::M1 => write!(f, "1"),
235 Self::M3 => write!(f, "3"),
236 Self::M5 => write!(f, "5"),
237 Self::M15 => write!(f, "15"),
238 Self::M30 => write!(f, "30"),
239 Self::H1 => write!(f, "60"),
240 Self::H2 => write!(f, "120"),
241 Self::H4 => write!(f, "240"),
242 Self::H6 => write!(f, "360"),
243 Self::H12 => write!(f, "720"),
244 Self::D1 => write!(f, "D"),
245 Self::W1 => write!(f, "W"),
246 Self::M1Month => write!(f, "M"),
247 }
248 }
249}
250
251#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
253pub enum TriggerBy {
254 LastPrice,
256 IndexPrice,
258 MarkPrice,
260}
261
262#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
264pub enum PositionMode {
265 #[serde(rename = "0")]
267 MergedSingle = 0,
268 #[serde(rename = "3")]
270 BothSides = 3,
271}
272
273#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
280pub enum MarginMode {
281 #[serde(rename = "REGULAR_MARGIN")]
283 CROSS,
284 #[serde(rename = "ISOLATED_MARGIN")]
286 ISOLATED,
287 #[serde(rename = "PORTFOLIO_MARGIN")]
289 PORTFOLIO,
290}
291
292impl std::fmt::Display for MarginMode {
293 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
294 match self {
295 Self::CROSS => write!(f, "REGULAR_MARGIN"),
296 Self::ISOLATED => write!(f, "ISOLATED_MARGIN"),
297 Self::PORTFOLIO => write!(f, "PORTFOLIO_MARGIN"),
298 }
299 }
300}
301
302#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
304pub enum TpSlMode {
305 Full,
307 Partial,
309}