use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum Market {
#[serde(rename = "ALL")]
All,
#[serde(rename = "US")]
Us,
#[serde(rename = "HK")]
Hk,
#[serde(rename = "CN")]
Cn,
#[serde(rename = "SG")]
Sg,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum SecurityType {
#[serde(rename = "ALL")]
All,
#[serde(rename = "STK")]
Stk,
#[serde(rename = "OPT")]
Opt,
#[serde(rename = "WAR")]
War,
#[serde(rename = "IOPT")]
Iopt,
#[serde(rename = "FUT")]
Fut,
#[serde(rename = "FOP")]
Fop,
#[serde(rename = "CASH")]
Cash,
#[serde(rename = "MLEG")]
Mleg,
#[serde(rename = "FUND")]
Fund,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum Currency {
#[serde(rename = "ALL")]
All,
#[serde(rename = "USD")]
Usd,
#[serde(rename = "HKD")]
Hkd,
#[serde(rename = "CNH")]
Cnh,
#[serde(rename = "SGD")]
Sgd,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum OrderType {
#[serde(rename = "MKT")]
Mkt,
#[serde(rename = "LMT")]
Lmt,
#[serde(rename = "STP")]
Stp,
#[serde(rename = "STP_LMT")]
StpLmt,
#[serde(rename = "TRAIL")]
Trail,
#[serde(rename = "AM")]
Am,
#[serde(rename = "AL")]
Al,
#[serde(rename = "TWAP")]
Twap,
#[serde(rename = "VWAP")]
Vwap,
#[serde(rename = "OCA")]
Oca,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum OrderStatus {
#[serde(rename = "Invalid")]
Invalid,
#[serde(rename = "Initial")]
Initial,
#[serde(rename = "PendingCancel")]
PendingCancel,
#[serde(rename = "Cancelled")]
Cancelled,
#[serde(rename = "Submitted")]
Submitted,
#[serde(rename = "Filled")]
Filled,
#[serde(rename = "Inactive")]
Inactive,
#[serde(rename = "PendingSubmit")]
PendingSubmit,
}
impl OrderStatus {
pub fn code(&self) -> i32 {
match self {
OrderStatus::Invalid => -2,
OrderStatus::Initial => -1,
OrderStatus::PendingCancel => 3,
OrderStatus::Cancelled => 4,
OrderStatus::Submitted => 5,
OrderStatus::Filled => 6,
OrderStatus::Inactive => 7,
OrderStatus::PendingSubmit => 8,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum BarPeriod {
#[serde(rename = "day")]
Day,
#[serde(rename = "week")]
Week,
#[serde(rename = "month")]
Month,
#[serde(rename = "year")]
Year,
#[serde(rename = "1min")]
Min1,
#[serde(rename = "5min")]
Min5,
#[serde(rename = "15min")]
Min15,
#[serde(rename = "30min")]
Min30,
#[serde(rename = "60min")]
Min60,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum Language {
#[serde(rename = "zh_CN")]
ZhCn,
#[serde(rename = "zh_TW")]
ZhTw,
#[serde(rename = "en_US")]
EnUs,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum QuoteRight {
#[serde(rename = "br")]
Br,
#[serde(rename = "nr")]
Nr,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum License {
#[serde(rename = "TBNZ")]
Tbnz,
#[serde(rename = "TBSG")]
Tbsg,
#[serde(rename = "TBHK")]
Tbhk,
#[serde(rename = "TBAU")]
Tbau,
#[serde(rename = "TBUS")]
Tbus,
#[serde(rename = "TBMS")]
Tbms,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum OrderSortBy {
#[serde(rename = "LATEST_CREATED")]
LatestCreated,
#[serde(rename = "LATEST_STATUS_UPDATED")]
LatestStatusUpdated,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum SegmentType {
#[serde(rename = "ALL")]
All,
#[serde(rename = "SEC")]
Sec,
#[serde(rename = "FUT")]
Fut,
#[serde(rename = "FUND")]
Fund,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum CorporateActionType {
#[serde(rename = "split")]
Split,
#[serde(rename = "dividend")]
Dividend,
#[serde(rename = "earning")]
Earning,
#[serde(rename = "symbol_change")]
SymbolChange,
#[serde(rename = "delisting")]
Delisting,
#[serde(rename = "ipo")]
Ipo,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum IndustryLevel {
#[serde(rename = "GSECTOR")]
GSector,
#[serde(rename = "GGROUP")]
GGroup,
#[serde(rename = "GIND")]
GInd,
#[serde(rename = "GSUBIND")]
GSubInd,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum SortDirection {
#[serde(rename = "SortDir_No")]
No,
#[serde(rename = "SortDir_Ascend")]
Ascend,
#[serde(rename = "SortDir_Descend")]
Descend,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum OptionAnalysisPeriod {
#[serde(rename = "3year")]
ThreeYear,
#[serde(rename = "52week")]
FiftyTwoWeek,
#[serde(rename = "26week")]
TwentySixWeek,
#[serde(rename = "13week")]
ThirteenWeek,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum FinancialReportPeriod {
#[serde(rename = "Annual")]
Annual,
#[serde(rename = "Quarterly")]
Quarterly,
#[serde(rename = "LTM")]
Ltm,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum TimeInForce {
#[serde(rename = "DAY")]
Day,
#[serde(rename = "GTC")]
Gtc,
#[serde(rename = "OPG")]
Opg,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_market_serialize() {
assert_eq!(serde_json::to_string(&Market::All).unwrap(), "\"ALL\"");
assert_eq!(serde_json::to_string(&Market::Us).unwrap(), "\"US\"");
assert_eq!(serde_json::to_string(&Market::Hk).unwrap(), "\"HK\"");
assert_eq!(serde_json::to_string(&Market::Cn).unwrap(), "\"CN\"");
assert_eq!(serde_json::to_string(&Market::Sg).unwrap(), "\"SG\"");
}
#[test]
fn test_market_deserialize() {
assert_eq!(
serde_json::from_str::<Market>("\"ALL\"").unwrap(),
Market::All
);
assert_eq!(
serde_json::from_str::<Market>("\"US\"").unwrap(),
Market::Us
);
assert_eq!(
serde_json::from_str::<Market>("\"HK\"").unwrap(),
Market::Hk
);
assert_eq!(
serde_json::from_str::<Market>("\"CN\"").unwrap(),
Market::Cn
);
assert_eq!(
serde_json::from_str::<Market>("\"SG\"").unwrap(),
Market::Sg
);
}
#[test]
fn test_security_type_serialize() {
assert_eq!(
serde_json::to_string(&SecurityType::All).unwrap(),
"\"ALL\""
);
assert_eq!(
serde_json::to_string(&SecurityType::Stk).unwrap(),
"\"STK\""
);
assert_eq!(
serde_json::to_string(&SecurityType::Opt).unwrap(),
"\"OPT\""
);
assert_eq!(
serde_json::to_string(&SecurityType::War).unwrap(),
"\"WAR\""
);
assert_eq!(
serde_json::to_string(&SecurityType::Iopt).unwrap(),
"\"IOPT\""
);
assert_eq!(
serde_json::to_string(&SecurityType::Fut).unwrap(),
"\"FUT\""
);
assert_eq!(
serde_json::to_string(&SecurityType::Fop).unwrap(),
"\"FOP\""
);
assert_eq!(
serde_json::to_string(&SecurityType::Cash).unwrap(),
"\"CASH\""
);
assert_eq!(
serde_json::to_string(&SecurityType::Mleg).unwrap(),
"\"MLEG\""
);
assert_eq!(
serde_json::to_string(&SecurityType::Fund).unwrap(),
"\"FUND\""
);
}
#[test]
fn test_security_type_deserialize() {
assert_eq!(
serde_json::from_str::<SecurityType>("\"STK\"").unwrap(),
SecurityType::Stk
);
assert_eq!(
serde_json::from_str::<SecurityType>("\"OPT\"").unwrap(),
SecurityType::Opt
);
assert_eq!(
serde_json::from_str::<SecurityType>("\"FUT\"").unwrap(),
SecurityType::Fut
);
assert_eq!(
serde_json::from_str::<SecurityType>("\"FUND\"").unwrap(),
SecurityType::Fund
);
}
#[test]
fn test_currency_serialize() {
assert_eq!(serde_json::to_string(&Currency::All).unwrap(), "\"ALL\"");
assert_eq!(serde_json::to_string(&Currency::Usd).unwrap(), "\"USD\"");
assert_eq!(serde_json::to_string(&Currency::Hkd).unwrap(), "\"HKD\"");
assert_eq!(serde_json::to_string(&Currency::Cnh).unwrap(), "\"CNH\"");
assert_eq!(serde_json::to_string(&Currency::Sgd).unwrap(), "\"SGD\"");
}
#[test]
fn test_currency_deserialize() {
assert_eq!(
serde_json::from_str::<Currency>("\"USD\"").unwrap(),
Currency::Usd
);
assert_eq!(
serde_json::from_str::<Currency>("\"HKD\"").unwrap(),
Currency::Hkd
);
}
#[test]
fn test_order_type_serialize() {
assert_eq!(serde_json::to_string(&OrderType::Mkt).unwrap(), "\"MKT\"");
assert_eq!(serde_json::to_string(&OrderType::Lmt).unwrap(), "\"LMT\"");
assert_eq!(serde_json::to_string(&OrderType::Stp).unwrap(), "\"STP\"");
assert_eq!(
serde_json::to_string(&OrderType::StpLmt).unwrap(),
"\"STP_LMT\""
);
assert_eq!(
serde_json::to_string(&OrderType::Trail).unwrap(),
"\"TRAIL\""
);
assert_eq!(serde_json::to_string(&OrderType::Am).unwrap(), "\"AM\"");
assert_eq!(serde_json::to_string(&OrderType::Al).unwrap(), "\"AL\"");
assert_eq!(serde_json::to_string(&OrderType::Twap).unwrap(), "\"TWAP\"");
assert_eq!(serde_json::to_string(&OrderType::Vwap).unwrap(), "\"VWAP\"");
assert_eq!(serde_json::to_string(&OrderType::Oca).unwrap(), "\"OCA\"");
}
#[test]
fn test_order_type_deserialize() {
assert_eq!(
serde_json::from_str::<OrderType>("\"MKT\"").unwrap(),
OrderType::Mkt
);
assert_eq!(
serde_json::from_str::<OrderType>("\"STP_LMT\"").unwrap(),
OrderType::StpLmt
);
assert_eq!(
serde_json::from_str::<OrderType>("\"TWAP\"").unwrap(),
OrderType::Twap
);
}
#[test]
fn test_order_status_serialize() {
assert_eq!(
serde_json::to_string(&OrderStatus::Invalid).unwrap(),
"\"Invalid\""
);
assert_eq!(
serde_json::to_string(&OrderStatus::Initial).unwrap(),
"\"Initial\""
);
assert_eq!(
serde_json::to_string(&OrderStatus::PendingCancel).unwrap(),
"\"PendingCancel\""
);
assert_eq!(
serde_json::to_string(&OrderStatus::Cancelled).unwrap(),
"\"Cancelled\""
);
assert_eq!(
serde_json::to_string(&OrderStatus::Submitted).unwrap(),
"\"Submitted\""
);
assert_eq!(
serde_json::to_string(&OrderStatus::Filled).unwrap(),
"\"Filled\""
);
assert_eq!(
serde_json::to_string(&OrderStatus::Inactive).unwrap(),
"\"Inactive\""
);
assert_eq!(
serde_json::to_string(&OrderStatus::PendingSubmit).unwrap(),
"\"PendingSubmit\""
);
}
#[test]
fn test_order_status_deserialize() {
assert_eq!(
serde_json::from_str::<OrderStatus>("\"Invalid\"").unwrap(),
OrderStatus::Invalid
);
assert_eq!(
serde_json::from_str::<OrderStatus>("\"Initial\"").unwrap(),
OrderStatus::Initial
);
assert_eq!(
serde_json::from_str::<OrderStatus>("\"PendingCancel\"").unwrap(),
OrderStatus::PendingCancel
);
assert_eq!(
serde_json::from_str::<OrderStatus>("\"Cancelled\"").unwrap(),
OrderStatus::Cancelled
);
assert_eq!(
serde_json::from_str::<OrderStatus>("\"Submitted\"").unwrap(),
OrderStatus::Submitted
);
assert_eq!(
serde_json::from_str::<OrderStatus>("\"Filled\"").unwrap(),
OrderStatus::Filled
);
assert_eq!(
serde_json::from_str::<OrderStatus>("\"Inactive\"").unwrap(),
OrderStatus::Inactive
);
assert_eq!(
serde_json::from_str::<OrderStatus>("\"PendingSubmit\"").unwrap(),
OrderStatus::PendingSubmit
);
}
#[test]
fn test_order_status_code() {
assert_eq!(OrderStatus::Invalid.code(), -2);
assert_eq!(OrderStatus::Initial.code(), -1);
assert_eq!(OrderStatus::PendingCancel.code(), 3);
assert_eq!(OrderStatus::Cancelled.code(), 4);
assert_eq!(OrderStatus::Submitted.code(), 5);
assert_eq!(OrderStatus::Filled.code(), 6);
assert_eq!(OrderStatus::Inactive.code(), 7);
assert_eq!(OrderStatus::PendingSubmit.code(), 8);
}
#[test]
fn test_bar_period_serialize() {
assert_eq!(serde_json::to_string(&BarPeriod::Day).unwrap(), "\"day\"");
assert_eq!(serde_json::to_string(&BarPeriod::Week).unwrap(), "\"week\"");
assert_eq!(
serde_json::to_string(&BarPeriod::Month).unwrap(),
"\"month\""
);
assert_eq!(serde_json::to_string(&BarPeriod::Year).unwrap(), "\"year\"");
assert_eq!(serde_json::to_string(&BarPeriod::Min1).unwrap(), "\"1min\"");
assert_eq!(serde_json::to_string(&BarPeriod::Min5).unwrap(), "\"5min\"");
assert_eq!(
serde_json::to_string(&BarPeriod::Min15).unwrap(),
"\"15min\""
);
assert_eq!(
serde_json::to_string(&BarPeriod::Min30).unwrap(),
"\"30min\""
);
assert_eq!(
serde_json::to_string(&BarPeriod::Min60).unwrap(),
"\"60min\""
);
}
#[test]
fn test_bar_period_deserialize() {
assert_eq!(
serde_json::from_str::<BarPeriod>("\"day\"").unwrap(),
BarPeriod::Day
);
assert_eq!(
serde_json::from_str::<BarPeriod>("\"1min\"").unwrap(),
BarPeriod::Min1
);
assert_eq!(
serde_json::from_str::<BarPeriod>("\"60min\"").unwrap(),
BarPeriod::Min60
);
}
#[test]
fn test_language_serialize() {
assert_eq!(serde_json::to_string(&Language::ZhCn).unwrap(), "\"zh_CN\"");
assert_eq!(serde_json::to_string(&Language::ZhTw).unwrap(), "\"zh_TW\"");
assert_eq!(serde_json::to_string(&Language::EnUs).unwrap(), "\"en_US\"");
}
#[test]
fn test_language_deserialize() {
assert_eq!(
serde_json::from_str::<Language>("\"zh_CN\"").unwrap(),
Language::ZhCn
);
assert_eq!(
serde_json::from_str::<Language>("\"en_US\"").unwrap(),
Language::EnUs
);
}
#[test]
fn test_quote_right_serialize() {
assert_eq!(serde_json::to_string(&QuoteRight::Br).unwrap(), "\"br\"");
assert_eq!(serde_json::to_string(&QuoteRight::Nr).unwrap(), "\"nr\"");
}
#[test]
fn test_quote_right_deserialize() {
assert_eq!(
serde_json::from_str::<QuoteRight>("\"br\"").unwrap(),
QuoteRight::Br
);
assert_eq!(
serde_json::from_str::<QuoteRight>("\"nr\"").unwrap(),
QuoteRight::Nr
);
}
#[test]
fn test_license_serialize() {
assert_eq!(serde_json::to_string(&License::Tbnz).unwrap(), "\"TBNZ\"");
assert_eq!(serde_json::to_string(&License::Tbsg).unwrap(), "\"TBSG\"");
assert_eq!(serde_json::to_string(&License::Tbhk).unwrap(), "\"TBHK\"");
assert_eq!(serde_json::to_string(&License::Tbau).unwrap(), "\"TBAU\"");
assert_eq!(serde_json::to_string(&License::Tbus).unwrap(), "\"TBUS\"");
assert_eq!(serde_json::to_string(&License::Tbms).unwrap(), "\"TBMS\"");
}
#[test]
fn test_license_deserialize() {
assert_eq!(
serde_json::from_str::<License>("\"TBNZ\"").unwrap(),
License::Tbnz
);
assert_eq!(
serde_json::from_str::<License>("\"TBHK\"").unwrap(),
License::Tbhk
);
assert_eq!(
serde_json::from_str::<License>("\"TBMS\"").unwrap(),
License::Tbms
);
}
#[test]
fn test_new_enums_serialize() {
assert_eq!(
serde_json::to_string(&OrderSortBy::LatestCreated).unwrap(),
"\"LATEST_CREATED\""
);
assert_eq!(
serde_json::to_string(&OrderSortBy::LatestStatusUpdated).unwrap(),
"\"LATEST_STATUS_UPDATED\""
);
assert_eq!(serde_json::to_string(&SegmentType::Sec).unwrap(), "\"SEC\"");
assert_eq!(
serde_json::to_string(&SegmentType::Fund).unwrap(),
"\"FUND\""
);
assert_eq!(
serde_json::to_string(&CorporateActionType::Split).unwrap(),
"\"split\""
);
assert_eq!(
serde_json::to_string(&CorporateActionType::Dividend).unwrap(),
"\"dividend\""
);
assert_eq!(
serde_json::to_string(&IndustryLevel::GSector).unwrap(),
"\"GSECTOR\""
);
assert_eq!(
serde_json::to_string(&IndustryLevel::GSubInd).unwrap(),
"\"GSUBIND\""
);
assert_eq!(
serde_json::to_string(&SortDirection::No).unwrap(),
"\"SortDir_No\""
);
assert_eq!(
serde_json::to_string(&SortDirection::Ascend).unwrap(),
"\"SortDir_Ascend\""
);
assert_eq!(
serde_json::to_string(&SortDirection::Descend).unwrap(),
"\"SortDir_Descend\""
);
assert_eq!(
serde_json::to_string(&OptionAnalysisPeriod::ThreeYear).unwrap(),
"\"3year\""
);
assert_eq!(
serde_json::to_string(&OptionAnalysisPeriod::FiftyTwoWeek).unwrap(),
"\"52week\""
);
assert_eq!(
serde_json::to_string(&FinancialReportPeriod::Annual).unwrap(),
"\"Annual\""
);
assert_eq!(
serde_json::to_string(&FinancialReportPeriod::Ltm).unwrap(),
"\"LTM\""
);
}
#[test]
fn test_new_enums_deserialize() {
assert_eq!(
serde_json::from_str::<OrderSortBy>("\"LATEST_CREATED\"").unwrap(),
OrderSortBy::LatestCreated
);
assert_eq!(
serde_json::from_str::<SegmentType>("\"SEC\"").unwrap(),
SegmentType::Sec
);
assert_eq!(
serde_json::from_str::<CorporateActionType>("\"split\"").unwrap(),
CorporateActionType::Split
);
assert_eq!(
serde_json::from_str::<IndustryLevel>("\"GSECTOR\"").unwrap(),
IndustryLevel::GSector
);
assert_eq!(
serde_json::from_str::<SortDirection>("\"SortDir_Descend\"").unwrap(),
SortDirection::Descend
);
assert_eq!(
serde_json::from_str::<OptionAnalysisPeriod>("\"52week\"").unwrap(),
OptionAnalysisPeriod::FiftyTwoWeek
);
assert_eq!(
serde_json::from_str::<FinancialReportPeriod>("\"LTM\"").unwrap(),
FinancialReportPeriod::Ltm
);
}
#[test]
fn test_time_in_force_serialize() {
assert_eq!(serde_json::to_string(&TimeInForce::Day).unwrap(), "\"DAY\"");
assert_eq!(serde_json::to_string(&TimeInForce::Gtc).unwrap(), "\"GTC\"");
assert_eq!(serde_json::to_string(&TimeInForce::Opg).unwrap(), "\"OPG\"");
}
#[test]
fn test_time_in_force_deserialize() {
assert_eq!(
serde_json::from_str::<TimeInForce>("\"DAY\"").unwrap(),
TimeInForce::Day
);
assert_eq!(
serde_json::from_str::<TimeInForce>("\"GTC\"").unwrap(),
TimeInForce::Gtc
);
assert_eq!(
serde_json::from_str::<TimeInForce>("\"OPG\"").unwrap(),
TimeInForce::Opg
);
}
}