diff --git a/Cargo.lock b/Cargo.lock index fcc5acb..b59538c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -90,7 +90,7 @@ checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -227,9 +227,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.14.0" +version = "3.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +checksum = "d32a994c2b3ca201d9b263612a374263f05e7adde37c4707f693dcd375076d1f" [[package]] name = "byteorder" @@ -311,6 +311,7 @@ dependencies = [ "android-tzdata", "iana-time-zone", "num-traits", + "serde", "windows-targets 0.52.0", ] @@ -485,6 +486,41 @@ dependencies = [ "memchr", ] +[[package]] +name = "darling" +version = "0.20.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c376d08ea6aa96aafe61237c7200d1241cb177b7d3a542d791f2d118e9cbb955" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33043dcd19068b8192064c704b3f83eb464f91f1ff527b44a4e2b08d9cdb8855" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.49", +] + +[[package]] +name = "darling_macro" +version = "0.20.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5a91391accf613803c2a9bf9abccdbaa07c54b4244a5b64883f9c3c137c86be" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.49", +] + [[package]] name = "dashmap" version = "5.5.3" @@ -492,7 +528,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" dependencies = [ "cfg-if", - "hashbrown", + "hashbrown 0.14.3", "lock_api", "once_cell", "parking_lot_core", @@ -730,7 +766,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -804,9 +840,9 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "governor" -version = "0.6.0" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "821239e5672ff23e2a7060901fa622950bbd80b649cdaadd78d1c1767ed14eb4" +checksum = "68a7f542ee6b35af73b06abc0dad1c1bae89964e4e253bc4b587b91c9637867b" dependencies = [ "cfg-if", "dashmap", @@ -815,9 +851,11 @@ dependencies = [ "no-std-compat", "nonzero_ext", "parking_lot", + "portable-atomic", "quanta", "rand", "smallvec", + "spinning_top", ] [[package]] @@ -832,7 +870,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.11", - "indexmap", + "indexmap 2.2.3", "slab", "tokio", "tokio-util", @@ -851,7 +889,7 @@ dependencies = [ "futures-sink", "futures-util", "http 1.0.0", - "indexmap", + "indexmap 2.2.3", "slab", "tokio", "tokio-util", @@ -868,6 +906,12 @@ dependencies = [ "crunchy", ] +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + [[package]] name = "hashbrown" version = "0.14.3" @@ -893,6 +937,12 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd5256b483761cd23699d0da46cc6fd2ee3be420bbe6d020ae4a091e70b7e9fd" +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + [[package]] name = "hmac" version = "0.12.1" @@ -1080,6 +1130,12 @@ dependencies = [ "cc", ] +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "idna" version = "0.5.0" @@ -1090,6 +1146,17 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + [[package]] name = "indexmap" version = "2.2.3" @@ -1097,7 +1164,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.14.3", + "serde", ] [[package]] @@ -1280,15 +1348,6 @@ dependencies = [ "libc", ] -[[package]] -name = "mach2" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" -dependencies = [ - "libc", -] - [[package]] name = "matchit" version = "0.7.3" @@ -1467,7 +1526,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -1581,7 +1640,7 @@ checksum = "266c042b60c9c76b8d53061e52b2e0d1116abc57cefc8c5cd671619a56ac3690" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -1602,6 +1661,12 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" +[[package]] +name = "portable-atomic" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" + [[package]] name = "powerfmt" version = "0.2.0" @@ -1653,6 +1718,7 @@ dependencies = [ "serde-aux", "serde_json", "serde_repr", + "serde_with", "time", "tokio", "tokio-tungstenite", @@ -1661,13 +1727,12 @@ dependencies = [ [[package]] name = "quanta" -version = "0.11.1" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17e662a7a8291a865152364c20c7abc5e60486ab2001e8ec10b24862de0b9ab" +checksum = "9ca0b7bac0b97248c40bb77288fc52029cf1459c0461ea1b05ee32ccf011de2c" dependencies = [ "crossbeam-utils", "libc", - "mach2", "once_cell", "raw-cpuid", "wasi", @@ -1716,11 +1781,11 @@ dependencies = [ [[package]] name = "raw-cpuid" -version = "10.7.0" +version = "11.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c297679cb867470fa8c9f67dbba74a78d78e3e98d7cf2b08d6d71540f797332" +checksum = "9d86a7c4638d42c44551f4791a20e687dbb4c3de1f33c43dd71e355cd429def1" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.4.2", ] [[package]] @@ -1865,7 +1930,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19599f60a688b5160247ee9c37a6af8b0c742ee8b160c5b44acc0f0eb265a59f" dependencies = [ "csv", - "hashbrown", + "hashbrown 0.14.3", "itertools 0.11.0", "lazy_static", "protobuf", @@ -2016,7 +2081,7 @@ checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -2059,7 +2124,7 @@ checksum = "0b2e6b945e9d3df726b65d6ee24060aff8e3533d431f677a9695db04eff9dfdb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -2074,13 +2139,43 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_with" +version = "3.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15d167997bd841ec232f5b2b8e0e26606df2e7caa4c31b95ea9ca52b200bd270" +dependencies = [ + "base64", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.2.3", + "serde", + "serde_derive", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "865f9743393e638991566a8b7a479043c2c8da94a33e0a31f18214c9cae0a64d" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.49", +] + [[package]] name = "serde_yaml" version = "0.9.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adf8a49373e98a4c5f0ceb5d05aa7c648d75f63774981ed95b7c7443bbd50c6e" dependencies = [ - "indexmap", + "indexmap 2.2.3", "itoa", "ryu", "serde", @@ -2145,12 +2240,27 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "spinning_top" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d96d2d1d716fb500937168cc09353ffdc7a012be8475ac7308e1bdf0e3923300" +dependencies = [ + "lock_api", +] + [[package]] name = "static_assertions" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + [[package]] name = "subtle" version = "2.5.0" @@ -2170,9 +2280,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.48" +version = "2.0.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" +checksum = "915aea9e586f80826ee59f8453c1101f9d1c4b3964cd2460185ee8e299ada496" dependencies = [ "proc-macro2", "quote", @@ -2263,7 +2373,7 @@ checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -2347,7 +2457,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] @@ -2621,7 +2731,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", "wasm-bindgen-shared", ] @@ -2655,7 +2765,7 @@ checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -2877,7 +2987,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.49", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 2f2b11e..bd4700a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,6 +27,7 @@ log4rs = "1.2.0" serde = "1.0.188" serde_json = "1.0.105" serde_repr = "0.1.18" +serde_with = "3.6.1" serde-aux = "4.4.0" futures-util = "0.3.28" reqwest = { version = "0.11.20", features = [ diff --git a/src/threads/data/websocket.rs b/src/threads/data/websocket.rs index 4ef2762..a009455 100644 --- a/src/threads/data/websocket.rs +++ b/src/threads/data/websocket.rs @@ -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, diff --git a/src/types/alpaca/websocket/data/incoming/status.rs b/src/types/alpaca/websocket/data/incoming/status.rs index 94ea21e..6ef5298 100644 --- a/src/types/alpaca/websocket/data/incoming/status.rs +++ b/src/types/alpaca/websocket/data/incoming/status.rs @@ -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, #[serde(rename = "z")] pub tape: Tape, }