use crate::DomainError;
use std::borrow::Cow;
paft_core::other_string_code_type!(
pub struct OtherMarketState for MarketState;
type Error = DomainError;
parse(input) => input.parse::<MarketState>();
invalid(input) => DomainError::InvalidMarketStateValue {
value: input.to_string(),
};
);
#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
#[non_exhaustive]
pub enum MarketState {
Pre,
Regular,
Post,
#[default]
Closed,
Halted,
Suspended,
Auction,
Other(OtherMarketState),
}
crate::string_enum_with_code!(
MarketState, Other(OtherMarketState),
"MarketState",
type Error = DomainError;
invalid(input) => DomainError::InvalidMarketStateValue {
value: input.to_string(),
};
{
"PREMARKET" => MarketState::Pre,
"REGULAR" => MarketState::Regular,
"POSTMARKET" => MarketState::Post,
"CLOSED" => MarketState::Closed,
"HALTED" => MarketState::Halted,
"SUSPENDED" => MarketState::Suspended,
"AUCTION" => MarketState::Auction
},
{
"PRE" => MarketState::Pre,
"POST" => MarketState::Post,
"PRE_MARKET" => MarketState::Pre,
"POST_MARKET" => MarketState::Post,
}
);
crate::impl_display_via_code!(MarketState);
impl MarketState {
pub fn other(input: &str) -> Result<Self, DomainError> {
OtherMarketState::new(input).map(Self::Other)
}
#[must_use]
pub fn full_name(&self) -> Cow<'static, str> {
match self {
Self::Pre => Cow::Borrowed("Pre-market"),
Self::Regular => Cow::Borrowed("Regular session"),
Self::Post => Cow::Borrowed("Post-market"),
Self::Closed => Cow::Borrowed("Closed"),
Self::Halted => Cow::Borrowed("Halted"),
Self::Suspended => Cow::Borrowed("Suspended"),
Self::Auction => Cow::Borrowed("Auction"),
Self::Other(code) => Cow::Owned(code.as_ref().to_string()),
}
}
#[must_use]
pub const fn is_trading(&self) -> bool {
matches!(self, Self::Pre | Self::Regular | Self::Post)
}
}