use crate::naive::NaiveDate;
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum JapaneseEra {
Meiji,
Taisho,
Showa,
Heisei,
Reiwa,
}
impl JapaneseEra {
#[must_use]
pub const fn start_date(&self) -> NaiveDate {
let opt = match self {
JapaneseEra::Meiji => NaiveDate::from_ymd_opt(1868, 1, 25),
JapaneseEra::Taisho => NaiveDate::from_ymd_opt(1912, 7, 30),
JapaneseEra::Showa => NaiveDate::from_ymd_opt(1926, 12, 25),
JapaneseEra::Heisei => NaiveDate::from_ymd_opt(1989, 1, 8),
JapaneseEra::Reiwa => NaiveDate::from_ymd_opt(2019, 5, 1),
};
match opt {
Some(date) => date,
None => NaiveDate::MIN,
}
}
#[must_use]
pub const fn end_date_exclusive(&self) -> Option<NaiveDate> {
match self {
JapaneseEra::Meiji => Some(JapaneseEra::Taisho.start_date()),
JapaneseEra::Taisho => Some(JapaneseEra::Showa.start_date()),
JapaneseEra::Showa => Some(JapaneseEra::Heisei.start_date()),
JapaneseEra::Heisei => Some(JapaneseEra::Reiwa.start_date()),
JapaneseEra::Reiwa => None,
}
}
#[must_use]
pub const fn name(&self) -> &'static str {
match self {
JapaneseEra::Meiji => "Meiji",
JapaneseEra::Taisho => "Taisho",
JapaneseEra::Showa => "Showa",
JapaneseEra::Heisei => "Heisei",
JapaneseEra::Reiwa => "Reiwa",
}
}
}
impl std::fmt::Display for JapaneseEra {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.name())
}
}