use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default, Serialize, Deserialize)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum OrderSide {
#[default]
Buy,
Sell,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default, Serialize, Deserialize)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum OrderType {
Limit,
#[default]
Market,
StopLoss,
StopLossLimit,
TakeProfit,
TakeProfitLimit,
LimitMaker,
#[serde(other)]
Other,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default, Serialize, Deserialize)]
pub enum TimeInForce {
#[default]
GTC,
IOC,
FOK,
GTX,
#[serde(other)]
Other,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum OrderStatus {
New,
PartiallyFilled,
Filled,
Canceled,
PendingCancel,
Rejected,
Expired,
ExpiredInMatch,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum ExecutionType {
New,
Canceled,
Replaced,
Rejected,
Trade,
Expired,
TradePrevention,
Amendment,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum KlineInterval {
#[serde(rename = "1s")]
Seconds1,
#[serde(rename = "1m")]
Minutes1,
#[serde(rename = "3m")]
Minutes3,
#[serde(rename = "5m")]
Minutes5,
#[serde(rename = "15m")]
Minutes15,
#[serde(rename = "30m")]
Minutes30,
#[serde(rename = "1h")]
Hours1,
#[serde(rename = "2h")]
Hours2,
#[serde(rename = "4h")]
Hours4,
#[serde(rename = "6h")]
Hours6,
#[serde(rename = "8h")]
Hours8,
#[serde(rename = "12h")]
Hours12,
#[serde(rename = "1d")]
Days1,
#[serde(rename = "3d")]
Days3,
#[serde(rename = "1w")]
Weeks1,
#[serde(rename = "1M")]
Months1,
}
impl std::fmt::Display for KlineInterval {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let s = match self {
Self::Seconds1 => "1s",
Self::Minutes1 => "1m",
Self::Minutes3 => "3m",
Self::Minutes5 => "5m",
Self::Minutes15 => "15m",
Self::Minutes30 => "30m",
Self::Hours1 => "1h",
Self::Hours2 => "2h",
Self::Hours4 => "4h",
Self::Hours6 => "6h",
Self::Hours8 => "8h",
Self::Hours12 => "12h",
Self::Days1 => "1d",
Self::Days3 => "3d",
Self::Weeks1 => "1w",
Self::Months1 => "1M",
};
write!(f, "{}", s)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum TickerType {
Full,
Mini,
}
impl std::fmt::Display for TickerType {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let s = match self {
Self::Full => "FULL",
Self::Mini => "MINI",
};
write!(f, "{}", s)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum SymbolStatus {
PreTrading,
Trading,
PostTrading,
EndOfDay,
Halt,
AuctionMatch,
Break,
PendingTrading,
#[serde(other)]
Other,
}
impl std::fmt::Display for SymbolStatus {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let s = match self {
Self::PreTrading => "PRE_TRADING",
Self::Trading => "TRADING",
Self::PostTrading => "POST_TRADING",
Self::EndOfDay => "END_OF_DAY",
Self::Halt => "HALT",
Self::AuctionMatch => "AUCTION_MATCH",
Self::Break => "BREAK",
Self::PendingTrading => "PENDING_TRADING",
Self::Other => "OTHER",
};
write!(f, "{}", s)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum SymbolPermission {
Spot,
Margin,
#[serde(other)]
Other,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum AccountType {
Spot,
UsdtFuture,
CoinFuture,
Leveraged,
#[serde(other)]
Other,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum RateLimitType {
RequestWeight,
Orders,
RawRequests,
#[serde(other)]
Other,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum RateLimitInterval {
Second,
Minute,
Day,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum OrderResponseType {
Ack,
Result,
Full,
#[serde(other)]
Other,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum OcoStatus {
Response,
ExecStarted,
AllDone,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum OcoOrderStatus {
Executing,
AllDone,
Reject,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum ContingencyType {
Oco,
Oto,
Otoco,
Opo,
Opoco,
#[serde(other)]
Other,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum CancelReplaceMode {
StopOnFailure,
AllowFailure,
}
impl std::fmt::Display for CancelReplaceMode {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let s = match self {
Self::StopOnFailure => "STOP_ON_FAILURE",
Self::AllowFailure => "ALLOW_FAILURE",
};
write!(f, "{}", s)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum CancelReplaceResult {
Success,
Failure,
NotAttempted,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum CancelRestrictions {
OnlyNew,
OnlyPartiallyFilled,
}
impl std::fmt::Display for CancelRestrictions {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let s = match self {
Self::OnlyNew => "ONLY_NEW",
Self::OnlyPartiallyFilled => "ONLY_PARTIALLY_FILLED",
};
write!(f, "{}", s)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum OrderRateLimitExceededMode {
DoNothing,
CancelOnly,
}
impl std::fmt::Display for OrderRateLimitExceededMode {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let s = match self {
Self::DoNothing => "DO_NOTHING",
Self::CancelOnly => "CANCEL_ONLY",
};
write!(f, "{}", s)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_order_side_serde() {
let buy: OrderSide = serde_json::from_str("\"BUY\"").unwrap();
assert_eq!(buy, OrderSide::Buy);
let sell: OrderSide = serde_json::from_str("\"SELL\"").unwrap();
assert_eq!(sell, OrderSide::Sell);
let serialized = serde_json::to_string(&OrderSide::Buy).unwrap();
assert_eq!(serialized, "\"BUY\"");
}
#[test]
fn test_order_type_serde() {
let limit: OrderType = serde_json::from_str("\"LIMIT\"").unwrap();
assert_eq!(limit, OrderType::Limit);
let market: OrderType = serde_json::from_str("\"MARKET\"").unwrap();
assert_eq!(market, OrderType::Market);
let stop_loss: OrderType = serde_json::from_str("\"STOP_LOSS\"").unwrap();
assert_eq!(stop_loss, OrderType::StopLoss);
let other: OrderType = serde_json::from_str("\"UNKNOWN_TYPE\"").unwrap();
assert_eq!(other, OrderType::Other);
}
#[test]
fn test_time_in_force_serde() {
let gtc: TimeInForce = serde_json::from_str("\"GTC\"").unwrap();
assert_eq!(gtc, TimeInForce::GTC);
let ioc: TimeInForce = serde_json::from_str("\"IOC\"").unwrap();
assert_eq!(ioc, TimeInForce::IOC);
let fok: TimeInForce = serde_json::from_str("\"FOK\"").unwrap();
assert_eq!(fok, TimeInForce::FOK);
}
#[test]
fn test_order_status_serde() {
let new: OrderStatus = serde_json::from_str("\"NEW\"").unwrap();
assert_eq!(new, OrderStatus::New);
let filled: OrderStatus = serde_json::from_str("\"FILLED\"").unwrap();
assert_eq!(filled, OrderStatus::Filled);
let canceled: OrderStatus = serde_json::from_str("\"CANCELED\"").unwrap();
assert_eq!(canceled, OrderStatus::Canceled);
}
#[test]
fn test_kline_interval_display() {
assert_eq!(KlineInterval::Minutes1.to_string(), "1m");
assert_eq!(KlineInterval::Hours1.to_string(), "1h");
assert_eq!(KlineInterval::Days1.to_string(), "1d");
assert_eq!(KlineInterval::Months1.to_string(), "1M");
}
#[test]
fn test_kline_interval_serde() {
let interval: KlineInterval = serde_json::from_str("\"1h\"").unwrap();
assert_eq!(interval, KlineInterval::Hours1);
let serialized = serde_json::to_string(&KlineInterval::Minutes15).unwrap();
assert_eq!(serialized, "\"15m\"");
}
}