use serde::{Deserialize, Serialize};
#[derive(Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(transparent)]
pub struct RedactedString(String);
impl RedactedString {
pub fn new(s: impl Into<String>) -> Self {
Self(s.into())
}
pub fn expose_secret(&self) -> &str {
&self.0
}
}
impl std::fmt::Debug for RedactedString {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str("RedactedString(***)")
}
}
impl From<String> for RedactedString {
fn from(s: String) -> Self {
Self(s)
}
}
impl From<&str> for RedactedString {
fn from(s: &str) -> Self {
Self(s.to_owned())
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum Category {
Spot,
Linear,
Inverse,
Option,
}
impl std::fmt::Display for Category {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Spot => write!(f, "spot"),
Self::Linear => write!(f, "linear"),
Self::Inverse => write!(f, "inverse"),
Self::Option => write!(f, "option"),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum Side {
Buy,
Sell,
}
impl std::fmt::Display for Side {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Buy => write!(f, "Buy"),
Self::Sell => write!(f, "Sell"),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum OrderType {
Market,
Limit,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum TimeInForce {
GTC,
IOC,
FOK,
PostOnly,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum OrderStatus {
Created,
New,
Rejected,
PartiallyFilled,
PartiallyFilledCanceled,
Filled,
Cancelled,
Untriggered,
Triggered,
Deactivated,
Active,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum PositionIdx {
#[serde(rename = "0")]
OneWay = 0,
#[serde(rename = "1")]
HedgeBuy = 1,
#[serde(rename = "2")]
HedgeSell = 2,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum AccountType {
CONTRACT,
UNIFIED,
SPOT,
INVESTMENT,
OPTION,
FUND,
}
impl std::fmt::Display for AccountType {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::CONTRACT => write!(f, "CONTRACT"),
Self::UNIFIED => write!(f, "UNIFIED"),
Self::SPOT => write!(f, "SPOT"),
Self::INVESTMENT => write!(f, "INVESTMENT"),
Self::OPTION => write!(f, "OPTION"),
Self::FUND => write!(f, "FUND"),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum Interval {
#[serde(rename = "1")]
M1,
#[serde(rename = "3")]
M3,
#[serde(rename = "5")]
M5,
#[serde(rename = "15")]
M15,
#[serde(rename = "30")]
M30,
#[serde(rename = "60")]
H1,
#[serde(rename = "120")]
H2,
#[serde(rename = "240")]
H4,
#[serde(rename = "360")]
H6,
#[serde(rename = "720")]
H12,
#[serde(rename = "D")]
D1,
#[serde(rename = "W")]
W1,
#[serde(rename = "M")]
M1Month,
}
impl std::fmt::Display for Interval {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::M1 => write!(f, "1"),
Self::M3 => write!(f, "3"),
Self::M5 => write!(f, "5"),
Self::M15 => write!(f, "15"),
Self::M30 => write!(f, "30"),
Self::H1 => write!(f, "60"),
Self::H2 => write!(f, "120"),
Self::H4 => write!(f, "240"),
Self::H6 => write!(f, "360"),
Self::H12 => write!(f, "720"),
Self::D1 => write!(f, "D"),
Self::W1 => write!(f, "W"),
Self::M1Month => write!(f, "M"),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum TriggerBy {
LastPrice,
IndexPrice,
MarkPrice,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum PositionMode {
#[serde(rename = "0")]
MergedSingle = 0,
#[serde(rename = "3")]
BothSides = 3,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum MarginMode {
#[serde(rename = "REGULAR_MARGIN")]
CROSS,
#[serde(rename = "ISOLATED_MARGIN")]
ISOLATED,
#[serde(rename = "PORTFOLIO_MARGIN")]
PORTFOLIO,
}
impl std::fmt::Display for MarginMode {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::CROSS => write!(f, "REGULAR_MARGIN"),
Self::ISOLATED => write!(f, "ISOLATED_MARGIN"),
Self::PORTFOLIO => write!(f, "PORTFOLIO_MARGIN"),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum TpSlMode {
Full,
Partial,
}