Fix status message deserialization
Signed-off-by: Nikolaos Karaolidis <nick@karaolidis.com>
This commit is contained in:
@@ -269,13 +269,13 @@ impl Handler for BarsHandler {
|
||||
}
|
||||
websocket::data::incoming::Message::Status(message) => {
|
||||
debug!(
|
||||
"Received status message for {}: {}.",
|
||||
message.symbol, message.status_message
|
||||
"Received status message for {}: {:?}.",
|
||||
message.symbol, message.status
|
||||
);
|
||||
|
||||
match message.status {
|
||||
websocket::data::incoming::status::Status::TradingHalt
|
||||
| websocket::data::incoming::status::Status::VolatilityTradingPause => {
|
||||
websocket::data::incoming::status::Status::TradingHalt(_)
|
||||
| websocket::data::incoming::status::Status::VolatilityTradingPause(_) => {
|
||||
database::assets::update_status_where_symbol(
|
||||
&self.config.clickhouse_client,
|
||||
&message.symbol,
|
||||
@@ -284,8 +284,8 @@ impl Handler for BarsHandler {
|
||||
.await
|
||||
.unwrap();
|
||||
}
|
||||
websocket::data::incoming::status::Status::Resume
|
||||
| websocket::data::incoming::status::Status::TradingResumption => {
|
||||
websocket::data::incoming::status::Status::Resume(_)
|
||||
| websocket::data::incoming::status::Status::TradingResumption(_) => {
|
||||
database::assets::update_status_where_symbol(
|
||||
&self.config.clickhouse_client,
|
||||
&message.symbol,
|
||||
|
@@ -1,128 +1,130 @@
|
||||
use serde::Deserialize;
|
||||
use serde_with::serde_as;
|
||||
use time::OffsetDateTime;
|
||||
|
||||
#[derive(Deserialize, Debug, PartialEq, Eq)]
|
||||
#[serde(tag = "sc", content = "sm")]
|
||||
pub enum Status {
|
||||
#[serde(rename = "2")]
|
||||
#[serde(alias = "H")]
|
||||
TradingHalt,
|
||||
TradingHalt(String),
|
||||
#[serde(rename = "3")]
|
||||
Resume,
|
||||
Resume(String),
|
||||
#[serde(rename = "5")]
|
||||
PriceIndication,
|
||||
PriceIndication(String),
|
||||
#[serde(rename = "6")]
|
||||
TradingRangeIndication,
|
||||
TradingRangeIndication(String),
|
||||
#[serde(rename = "7")]
|
||||
MarketImbalanceBuy,
|
||||
MarketImbalanceBuy(String),
|
||||
#[serde(rename = "8")]
|
||||
MarketImbalanceSell,
|
||||
MarketImbalanceSell(String),
|
||||
#[serde(rename = "9")]
|
||||
MarketOnCloseImbalanceBuy,
|
||||
MarketOnCloseImbalanceBuy(String),
|
||||
#[serde(rename = "A")]
|
||||
MarketOnCloseImbalanceSell,
|
||||
MarketOnCloseImbalanceSell(String),
|
||||
#[serde(rename = "C")]
|
||||
NoMarketImbalance,
|
||||
NoMarketImbalance(String),
|
||||
#[serde(rename = "D")]
|
||||
NoMarketOnCloseImbalance,
|
||||
NoMarketOnCloseImbalance(String),
|
||||
#[serde(rename = "E")]
|
||||
ShortSaleRestriction,
|
||||
ShortSaleRestriction(String),
|
||||
#[serde(rename = "F")]
|
||||
LimitUpLimitDown,
|
||||
LimitUpLimitDown(String),
|
||||
#[serde(rename = "Q")]
|
||||
QuotationResumption,
|
||||
QuotationResumption(String),
|
||||
#[serde(rename = "T")]
|
||||
TradingResumption,
|
||||
TradingResumption(String),
|
||||
#[serde(rename = "P")]
|
||||
VolatilityTradingPause,
|
||||
VolatilityTradingPause(String),
|
||||
}
|
||||
|
||||
#[derive(Deserialize, Debug, PartialEq, Eq)]
|
||||
#[serde(tag = "rc", content = "rm")]
|
||||
pub enum Reason {
|
||||
#[serde(rename = "D")]
|
||||
NewsReleased,
|
||||
NewsReleased(String),
|
||||
#[serde(rename = "I")]
|
||||
OrderImbalance,
|
||||
OrderImbalance(String),
|
||||
#[serde(rename = "M")]
|
||||
LimitUpLimitDown,
|
||||
LimitUpLimitDown(String),
|
||||
#[serde(rename = "P")]
|
||||
NewsPending,
|
||||
NewsPending(String),
|
||||
#[serde(rename = "X")]
|
||||
Operational,
|
||||
Operational(String),
|
||||
#[serde(rename = "Y")]
|
||||
SubPennyTrading,
|
||||
SubPennyTrading(String),
|
||||
#[serde(rename = "1")]
|
||||
MarketWideCircuitBreakerL1Breached,
|
||||
MarketWideCircuitBreakerL1Breached(String),
|
||||
#[serde(rename = "2")]
|
||||
MarketWideCircuitBreakerL2Breached,
|
||||
MarketWideCircuitBreakerL2Breached(String),
|
||||
#[serde(rename = "3")]
|
||||
MarketWideCircuitBreakerL3Breached,
|
||||
MarketWideCircuitBreakerL3Breached(String),
|
||||
#[serde(rename = "T1")]
|
||||
HaltNewsPending,
|
||||
HaltNewsPending(String),
|
||||
#[serde(rename = "T2")]
|
||||
HaltNewsDissemination,
|
||||
HaltNewsDissemination(String),
|
||||
#[serde(rename = "T5")]
|
||||
SingleStockTradingPauseInAffect,
|
||||
SingleStockTradingPauseInAffect(String),
|
||||
#[serde(rename = "T6")]
|
||||
RegulatoryHaltExtraordinaryMarketActivity,
|
||||
RegulatoryHaltExtraordinaryMarketActivity(String),
|
||||
#[serde(rename = "T8")]
|
||||
HaltETF,
|
||||
HaltETF(String),
|
||||
#[serde(rename = "T12")]
|
||||
TradingHaltedForInformationRequestedByNASDAQ,
|
||||
TradingHaltedForInformationRequestedByNASDAQ(String),
|
||||
#[serde(rename = "H4")]
|
||||
HaltNonCompliance,
|
||||
HaltNonCompliance(String),
|
||||
#[serde(rename = "H9")]
|
||||
HaltFilingsNotCurrent,
|
||||
HaltFilingsNotCurrent(String),
|
||||
#[serde(rename = "H10")]
|
||||
HaltSECTradingSuspension,
|
||||
HaltSECTradingSuspension(String),
|
||||
#[serde(rename = "H11")]
|
||||
HaltRegulatoryConcern,
|
||||
HaltRegulatoryConcern(String),
|
||||
#[serde(rename = "01")]
|
||||
OperationsHaltContactMarketOperations,
|
||||
OperationsHaltContactMarketOperations(String),
|
||||
#[serde(rename = "IPO1")]
|
||||
IPOIssueNotYetTrading,
|
||||
IPOIssueNotYetTrading(String),
|
||||
#[serde(rename = "M1")]
|
||||
CorporateAction,
|
||||
CorporateAction(String),
|
||||
#[serde(rename = "M2")]
|
||||
QuotationNotAvailable,
|
||||
QuotationNotAvailable(String),
|
||||
#[serde(rename = "LUDP")]
|
||||
VolatilityTradingPause,
|
||||
VolatilityTradingPause(String),
|
||||
#[serde(rename = "LUDS")]
|
||||
VolatilityTradingPauseStraddleCondition,
|
||||
VolatilityTradingPauseStraddleCondition(String),
|
||||
#[serde(rename = "MWC1")]
|
||||
MarketWideCircuitBreakerHaltL1,
|
||||
MarketWideCircuitBreakerHaltL1(String),
|
||||
#[serde(rename = "MWC2")]
|
||||
MarketWideCircuitBreakerHaltL2,
|
||||
MarketWideCircuitBreakerHaltL2(String),
|
||||
#[serde(rename = "MWC3")]
|
||||
MarketWideCircuitBreakerHaltL3,
|
||||
MarketWideCircuitBreakerHaltL3(String),
|
||||
#[serde(rename = "MWC0")]
|
||||
MarketWideCircuitBreakerHaltCarryOverFromPreviousDay,
|
||||
MarketWideCircuitBreakerHaltCarryOverFromPreviousDay(String),
|
||||
#[serde(rename = "T3")]
|
||||
NewsAndResumptionTimes,
|
||||
NewsAndResumptionTimes(String),
|
||||
#[serde(rename = "T7")]
|
||||
SingleStockTradingPauseQuotationOnlyPeriod,
|
||||
SingleStockTradingPauseQuotationOnlyPeriod(String),
|
||||
#[serde(rename = "R4")]
|
||||
QualificationsIssuesReviewedResolvedQuotationsTradingToResume,
|
||||
QualificationsIssuesReviewedResolvedQuotationsTradingToResume(String),
|
||||
#[serde(rename = "R9")]
|
||||
FilingRequirementsSatisfiedResolvedQuotationsTradingToResume,
|
||||
FilingRequirementsSatisfiedResolvedQuotationsTradingToResume(String),
|
||||
#[serde(rename = "C3")]
|
||||
IssuerNewsNotForthcomingQuotationsTradingToResume,
|
||||
IssuerNewsNotForthcomingQuotationsTradingToResume(String),
|
||||
#[serde(rename = "C4")]
|
||||
QualificationsHaltEndedMaintReqMetResume,
|
||||
QualificationsHaltEndedMaintReqMetResume(String),
|
||||
#[serde(rename = "C9")]
|
||||
QualificationsHaltConcludedFilingsMetQuotesTradesToResume,
|
||||
QualificationsHaltConcludedFilingsMetQuotesTradesToResume(String),
|
||||
#[serde(rename = "C11")]
|
||||
TradeHaltConcludedByOtherRegulatoryAuthQuotesTradesResume,
|
||||
TradeHaltConcludedByOtherRegulatoryAuthQuotesTradesResume(String),
|
||||
#[serde(rename = "R1")]
|
||||
NewIssueAvailable,
|
||||
NewIssueAvailable(String),
|
||||
#[serde(rename = "R")]
|
||||
IssueAvailable,
|
||||
IssueAvailable(String),
|
||||
#[serde(rename = "IPOQ")]
|
||||
IPOSecurityReleasedForQuotation,
|
||||
IPOSecurityReleasedForQuotation(String),
|
||||
#[serde(rename = "IPOE")]
|
||||
IPOSecurityPositioningWindowExtension,
|
||||
IPOSecurityPositioningWindowExtension(String),
|
||||
#[serde(rename = "MWCQ")]
|
||||
MarketWideCircuitBreakerResumption,
|
||||
MarketWideCircuitBreakerResumption(String),
|
||||
}
|
||||
|
||||
#[derive(Deserialize, Debug, PartialEq, Eq)]
|
||||
@@ -135,20 +137,18 @@ pub enum Tape {
|
||||
|
||||
#[derive(Deserialize, Debug, PartialEq, Eq)]
|
||||
#[allow(clippy::struct_field_names)]
|
||||
#[serde_as]
|
||||
pub struct Message {
|
||||
#[serde(rename = "t")]
|
||||
#[serde(with = "time::serde::rfc3339")]
|
||||
pub time: OffsetDateTime,
|
||||
#[serde(rename = "S")]
|
||||
pub symbol: String,
|
||||
#[serde(rename = "sc")]
|
||||
#[serde(flatten)]
|
||||
pub status: Status,
|
||||
#[serde(rename = "sm")]
|
||||
pub status_message: String,
|
||||
#[serde(rename = "rc")]
|
||||
pub reason: Reason,
|
||||
#[serde(rename = "rm")]
|
||||
pub reason_message: String,
|
||||
#[serde(flatten)]
|
||||
#[serde_as(as = "NoneAsEmptyString")]
|
||||
pub reason: Option<Reason>,
|
||||
#[serde(rename = "z")]
|
||||
pub tape: Tape,
|
||||
}
|
||||
|
Reference in New Issue
Block a user