use serde::{Deserialize, Serialize};
use std::fmt;
use crate::error::{NumRs2Error, Result};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum DateUnit {
Year,
Month,
Week,
Day,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum DateTimeUnit {
Year,
Month,
Week,
Day,
Hour,
Minute,
Second,
Millisecond,
Microsecond,
Nanosecond,
}
impl fmt::Display for DateTimeUnit {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
DateTimeUnit::Year => write!(f, "Y"),
DateTimeUnit::Month => write!(f, "M"),
DateTimeUnit::Week => write!(f, "W"),
DateTimeUnit::Day => write!(f, "D"),
DateTimeUnit::Hour => write!(f, "h"),
DateTimeUnit::Minute => write!(f, "m"),
DateTimeUnit::Second => write!(f, "s"),
DateTimeUnit::Millisecond => write!(f, "ms"),
DateTimeUnit::Microsecond => write!(f, "us"),
DateTimeUnit::Nanosecond => write!(f, "ns"),
}
}
}
pub fn parse_unit_string(unit: &str) -> Result<DateTimeUnit> {
match unit.to_lowercase().as_str() {
"y" | "year" | "years" => Ok(DateTimeUnit::Year),
"m" | "month" | "months" => Ok(DateTimeUnit::Month),
"w" | "week" | "weeks" => Ok(DateTimeUnit::Week),
"d" | "day" | "days" => Ok(DateTimeUnit::Day),
"h" | "hour" | "hours" => Ok(DateTimeUnit::Hour),
"min" | "minute" | "minutes" => Ok(DateTimeUnit::Minute),
"s" | "sec" | "second" | "seconds" => Ok(DateTimeUnit::Second),
"ms" | "millisecond" | "milliseconds" => Ok(DateTimeUnit::Millisecond),
"us" | "microsecond" | "microseconds" => Ok(DateTimeUnit::Microsecond),
"ns" | "nanosecond" | "nanoseconds" => Ok(DateTimeUnit::Nanosecond),
_ => Err(NumRs2Error::ValueError(format!("Unknown unit: {}", unit))),
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_datetime_unit_display() {
assert_eq!(format!("{}", DateTimeUnit::Year), "Y");
assert_eq!(format!("{}", DateTimeUnit::Month), "M");
assert_eq!(format!("{}", DateTimeUnit::Week), "W");
assert_eq!(format!("{}", DateTimeUnit::Day), "D");
assert_eq!(format!("{}", DateTimeUnit::Hour), "h");
assert_eq!(format!("{}", DateTimeUnit::Minute), "m");
assert_eq!(format!("{}", DateTimeUnit::Second), "s");
assert_eq!(format!("{}", DateTimeUnit::Millisecond), "ms");
assert_eq!(format!("{}", DateTimeUnit::Microsecond), "us");
assert_eq!(format!("{}", DateTimeUnit::Nanosecond), "ns");
}
#[test]
fn test_parse_unit_string() {
assert_eq!(
parse_unit_string("D").expect("should parse day unit"),
DateTimeUnit::Day
);
assert_eq!(
parse_unit_string("s").expect("should parse second unit"),
DateTimeUnit::Second
);
assert_eq!(
parse_unit_string("ms").expect("should parse millisecond unit"),
DateTimeUnit::Millisecond
);
assert!(parse_unit_string("invalid").is_err());
}
}