use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum Frequency {
#[serde(alias = "yearly", alias = "year")]
Annual,
#[serde(alias = "quarter", alias = "q")]
Quarterly,
}
impl Frequency {
pub fn as_str(&self) -> &'static str {
match self {
Frequency::Annual => "annual",
Frequency::Quarterly => "quarterly",
}
}
pub fn prefix(&self, field: &str) -> String {
format!("{}{}", self.as_str(), field)
}
}
impl std::str::FromStr for Frequency {
type Err = ();
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s.to_lowercase().as_str() {
"annual" | "yearly" | "year" => Ok(Frequency::Annual),
"quarterly" | "quarter" | "q" => Ok(Frequency::Quarterly),
_ => Err(()),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_frequency_from_str_round_trips_as_str() {
for frequency in [Frequency::Annual, Frequency::Quarterly] {
assert_eq!(frequency.as_str().parse(), Ok(frequency));
}
assert_eq!("YEARLY".parse(), Ok(Frequency::Annual));
assert_eq!("q".parse(), Ok(Frequency::Quarterly));
assert_eq!("bogus".parse::<Frequency>(), Err(()));
}
}