@@ -34,6 +34,8 @@ pub struct LatestPriceRequestRepr {
3434 #[ serde( default = "default_parsed" ) ]
3535 pub parsed : bool ,
3636 pub channel : Channel ,
37+ #[ serde( default = "default_market_sessions" ) ]
38+ pub market_sessions : Vec < MarketSession > ,
3739}
3840
3941#[ derive( Debug , Clone , PartialEq , Eq , Hash , Serialize , ToSchema ) ]
@@ -99,6 +101,8 @@ pub struct PriceRequestRepr {
99101 #[ serde( default = "default_parsed" ) ]
100102 pub parsed : bool ,
101103 pub channel : Channel ,
104+ #[ serde( default = "default_market_sessions" ) ]
105+ pub market_sessions : Vec < MarketSession > ,
102106}
103107
104108#[ derive( Debug , Clone , PartialEq , Eq , Hash , Serialize , ToSchema ) ]
@@ -162,6 +166,16 @@ pub fn default_parsed() -> bool {
162166 true
163167}
164168
169+ pub fn default_market_sessions ( ) -> Vec < MarketSession > {
170+ vec ! [
171+ MarketSession :: Regular ,
172+ MarketSession :: PreMarket ,
173+ MarketSession :: PostMarket ,
174+ MarketSession :: OverNight ,
175+ MarketSession :: Closed ,
176+ ]
177+ }
178+
165179pub fn schema_default_symbols ( ) -> Option < Vec < String > > {
166180 None
167181}
@@ -311,6 +325,9 @@ pub struct SubscriptionParamsRepr {
311325 // "ignoreInvalidFeedIds" was renamed to "ignoreInvalidFeeds". "ignoreInvalidFeedIds" is still supported for compatibility.
312326 #[ serde( default , alias = "ignoreInvalidFeedIds" ) ]
313327 pub ignore_invalid_feeds : bool ,
328+ // Market sessions to filter price feeds by. Default to [Regular] for backward compatibility.
329+ #[ serde( default = "default_market_sessions" ) ]
330+ pub market_sessions : Vec < MarketSession > ,
314331}
315332
316333#[ derive( Debug , Clone , PartialEq , Eq , Hash , Serialize , ToSchema ) ]
@@ -429,6 +446,9 @@ pub struct ParsedFeedPayload {
429446 #[ serde( skip_serializing_if = "Option::is_none" ) ]
430447 #[ serde( default ) ]
431448 pub funding_rate_interval : Option < DurationUs > ,
449+ #[ serde( skip_serializing_if = "Option::is_none" ) ]
450+ #[ serde( default ) ]
451+ pub market_session : Option < MarketSession > ,
432452}
433453
434454impl ParsedFeedPayload {
@@ -448,6 +468,7 @@ impl ParsedFeedPayload {
448468 funding_rate : None ,
449469 funding_timestamp : None ,
450470 funding_rate_interval : None ,
471+ market_session : None ,
451472 } ;
452473 for & property in properties {
453474 match property {
@@ -478,6 +499,9 @@ impl ParsedFeedPayload {
478499 PriceFeedProperty :: FundingRateInterval => {
479500 output. funding_rate_interval = data. funding_rate_interval ;
480501 }
502+ PriceFeedProperty :: MarketSession => {
503+ output. market_session = Some ( data. market_session ) ;
504+ }
481505 }
482506 }
483507 output
@@ -499,6 +523,7 @@ impl ParsedFeedPayload {
499523 funding_rate : data. funding_rate ,
500524 funding_timestamp : data. funding_timestamp ,
501525 funding_rate_interval : data. funding_rate_interval ,
526+ market_session : Some ( data. market_session ) ,
502527 }
503528 }
504529}
@@ -662,4 +687,32 @@ pub enum MarketSession {
662687 PreMarket ,
663688 PostMarket ,
664689 OverNight ,
690+ Closed ,
691+ }
692+
693+ impl From < MarketSession > for i16 {
694+ fn from ( s : MarketSession ) -> i16 {
695+ match s {
696+ MarketSession :: Regular => 0 ,
697+ MarketSession :: PreMarket => 1 ,
698+ MarketSession :: PostMarket => 2 ,
699+ MarketSession :: OverNight => 3 ,
700+ MarketSession :: Closed => 4 ,
701+ }
702+ }
703+ }
704+
705+ impl TryFrom < i16 > for MarketSession {
706+ type Error = anyhow:: Error ;
707+
708+ fn try_from ( value : i16 ) -> Result < MarketSession , Self :: Error > {
709+ match value {
710+ 0 => Ok ( MarketSession :: Regular ) ,
711+ 1 => Ok ( MarketSession :: PreMarket ) ,
712+ 2 => Ok ( MarketSession :: PostMarket ) ,
713+ 3 => Ok ( MarketSession :: OverNight ) ,
714+ 4 => Ok ( MarketSession :: Closed ) ,
715+ _ => Err ( anyhow:: anyhow!( "invalid MarketSession value: {}" , value) ) ,
716+ }
717+ }
665718}
0 commit comments