use serde::{Deserialize, Serialize};
pub const DEFAULT_LOOKBACK: usize = 20;
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct ObservationRichness {
pub lookback: usize,
pub fundamentals: bool,
pub news: bool,
}
impl Default for ObservationRichness {
fn default() -> Self {
Self {
lookback: DEFAULT_LOOKBACK,
fundamentals: false,
news: false,
}
}
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum RichnessTier {
DataPoor,
#[default]
Standard,
DataRich,
}
impl RichnessTier {
pub fn richness(self) -> ObservationRichness {
match self {
RichnessTier::DataPoor => ObservationRichness {
lookback: 3,
fundamentals: false,
news: false,
},
RichnessTier::Standard => ObservationRichness::default(),
RichnessTier::DataRich => ObservationRichness {
lookback: 50,
fundamentals: true,
news: true,
},
}
}
pub fn all() -> [RichnessTier; 3] {
[
RichnessTier::DataPoor,
RichnessTier::Standard,
RichnessTier::DataRich,
]
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_is_the_historical_disclosure() {
let d = ObservationRichness::default();
assert_eq!(d.lookback, DEFAULT_LOOKBACK);
assert!(!d.fundamentals);
assert!(!d.news);
}
#[test]
fn standard_tier_equals_default() {
assert_eq!(
RichnessTier::Standard.richness(),
ObservationRichness::default()
);
assert_eq!(RichnessTier::default(), RichnessTier::Standard);
}
#[test]
fn tiers_span_the_axis() {
let poor = RichnessTier::DataPoor.richness();
let std = RichnessTier::Standard.richness();
let rich = RichnessTier::DataRich.richness();
assert!(poor.lookback < std.lookback);
assert!(std.lookback < rich.lookback);
assert!(!poor.fundamentals && !poor.news);
assert!(!std.fundamentals && !std.news);
assert!(rich.fundamentals && rich.news);
}
#[test]
fn tier_serializes_snake_case() {
assert_eq!(
serde_json::to_string(&RichnessTier::DataPoor).unwrap(),
"\"data_poor\""
);
assert_eq!(
serde_json::to_string(&RichnessTier::DataRich).unwrap(),
"\"data_rich\""
);
}
#[test]
fn richness_round_trips_through_json() {
let r = RichnessTier::DataRich.richness();
let j = serde_json::to_string(&r).unwrap();
let back: ObservationRichness = serde_json::from_str(&j).unwrap();
assert_eq!(r, back);
}
}