Fix status message deserialization

Signed-off-by: Nikolaos Karaolidis <nick@karaolidis.com>
This commit is contained in:
2024-02-16 19:39:36 +00:00
parent a1781cdf29
commit ae5044142d
4 changed files with 219 additions and 108 deletions

View File

@@ -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,

View File

@@ -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,
}