use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum PatternKey {
JunChenQingHui,
ZiFuTongGong,
JinYuFuJia,
ZiFuJiaMing,
JiXiangLiMing,
JiJuMaoYou,
JiYueTongLiang,
ShanYinChaoGang,
JiJuTongLin,
JiJuJuMao,
RiYueTongGong,
JuRiTongGong,
RiZhaoLeiMen,
RiYueBingMing,
RiYueFanBei,
RiYueZhaoBi,
JinCanGuangHui,
RiYueCangHui,
DanChiGuiChi,
RiYueJiaMing,
RiYueJiaCai,
YueLangTianMen,
YueShengCangHai,
MingZhuChuHai,
WuTanTongXing,
LingChangTuoWu,
XingQiuJiaYin,
ShengBuFengShi,
XiongSuChaoYuan,
FuXiangChaoYuan,
HuoTan,
LingTan,
ShiZhongYinYu,
LiangMaPiaoDang,
YangLiangChangLu,
ShaPoLang,
QiShaChaoDou,
LuShuaiMaKun,
YingXingRuMiao,
ZhongShuiChaoDong,
SanQiJiaHui,
LuMaJiaoChi,
LuHeYuanYang,
MingLuAnLu,
LuMaPeiYin,
LiangChongHuaGai,
FengYunJiHui,
YangTuoJiaMing,
MaTouDaiJian,
ZuoYouTongGong,
ZuoYouJiaMing,
FuBiGongZhu,
KuiYueJiaMing,
ZuoGuiXiangGui,
JieKongJiaMing,
LuFengLiangSha,
WenGuiWenHua,
WenXingChaoMing,
ChangQuJiaMing,
WenXingAnGong,
QuanLuShengFeng,
KeMingAnLu,
KeQuanLuJia,
JiaDiDengYong,
}
pub const ALL_PATTERNS: [PatternKey; 64] = [
PatternKey::JunChenQingHui,
PatternKey::ZiFuTongGong,
PatternKey::JinYuFuJia,
PatternKey::ZiFuJiaMing,
PatternKey::JiXiangLiMing,
PatternKey::JiJuMaoYou,
PatternKey::JiYueTongLiang,
PatternKey::ShanYinChaoGang,
PatternKey::JiJuTongLin,
PatternKey::JiJuJuMao,
PatternKey::RiYueTongGong,
PatternKey::JuRiTongGong,
PatternKey::RiZhaoLeiMen,
PatternKey::RiYueBingMing,
PatternKey::RiYueFanBei,
PatternKey::RiYueZhaoBi,
PatternKey::JinCanGuangHui,
PatternKey::RiYueCangHui,
PatternKey::DanChiGuiChi,
PatternKey::RiYueJiaMing,
PatternKey::RiYueJiaCai,
PatternKey::YueLangTianMen,
PatternKey::YueShengCangHai,
PatternKey::MingZhuChuHai,
PatternKey::WuTanTongXing,
PatternKey::LingChangTuoWu,
PatternKey::XingQiuJiaYin,
PatternKey::ShengBuFengShi,
PatternKey::XiongSuChaoYuan,
PatternKey::FuXiangChaoYuan,
PatternKey::HuoTan,
PatternKey::LingTan,
PatternKey::ShiZhongYinYu,
PatternKey::LiangMaPiaoDang,
PatternKey::YangLiangChangLu,
PatternKey::ShaPoLang,
PatternKey::QiShaChaoDou,
PatternKey::LuShuaiMaKun,
PatternKey::YingXingRuMiao,
PatternKey::ZhongShuiChaoDong,
PatternKey::SanQiJiaHui,
PatternKey::LuMaJiaoChi,
PatternKey::LuHeYuanYang,
PatternKey::MingLuAnLu,
PatternKey::LuMaPeiYin,
PatternKey::LiangChongHuaGai,
PatternKey::FengYunJiHui,
PatternKey::YangTuoJiaMing,
PatternKey::MaTouDaiJian,
PatternKey::ZuoYouTongGong,
PatternKey::ZuoYouJiaMing,
PatternKey::FuBiGongZhu,
PatternKey::KuiYueJiaMing,
PatternKey::ZuoGuiXiangGui,
PatternKey::JieKongJiaMing,
PatternKey::LuFengLiangSha,
PatternKey::WenGuiWenHua,
PatternKey::WenXingChaoMing,
PatternKey::ChangQuJiaMing,
PatternKey::WenXingAnGong,
PatternKey::QuanLuShengFeng,
PatternKey::KeMingAnLu,
PatternKey::KeQuanLuJia,
PatternKey::JiaDiDengYong,
];
impl PatternKey {
pub fn as_key(self) -> &'static str {
match self {
PatternKey::JunChenQingHui => "jun_chen_qing_hui",
PatternKey::ZiFuTongGong => "zi_fu_tong_gong",
PatternKey::JinYuFuJia => "jin_yu_fu_jia",
PatternKey::ZiFuJiaMing => "zi_fu_jia_ming",
PatternKey::JiXiangLiMing => "ji_xiang_li_ming",
PatternKey::JiJuMaoYou => "ji_ju_mao_you",
PatternKey::JiYueTongLiang => "ji_yue_tong_liang",
PatternKey::ShanYinChaoGang => "shan_yin_chao_gang",
PatternKey::JiJuTongLin => "ji_ju_tong_lin",
PatternKey::JiJuJuMao => "ji_ju_ju_mao",
PatternKey::RiYueTongGong => "ri_yue_tong_gong",
PatternKey::JuRiTongGong => "ju_ri_tong_gong",
PatternKey::RiZhaoLeiMen => "ri_zhao_lei_men",
PatternKey::RiYueBingMing => "ri_yue_bing_ming",
PatternKey::RiYueFanBei => "ri_yue_fan_bei",
PatternKey::RiYueZhaoBi => "ri_yue_zhao_bi",
PatternKey::JinCanGuangHui => "jin_can_guang_hui",
PatternKey::RiYueCangHui => "ri_yue_cang_hui",
PatternKey::DanChiGuiChi => "dan_chi_gui_chi",
PatternKey::RiYueJiaMing => "ri_yue_jia_ming",
PatternKey::RiYueJiaCai => "ri_yue_jia_cai",
PatternKey::YueLangTianMen => "yue_lang_tian_men",
PatternKey::YueShengCangHai => "yue_sheng_cang_hai",
PatternKey::MingZhuChuHai => "ming_zhu_chu_hai",
PatternKey::WuTanTongXing => "wu_tan_tong_xing",
PatternKey::LingChangTuoWu => "ling_chang_tuo_wu",
PatternKey::XingQiuJiaYin => "xing_qiu_jia_yin",
PatternKey::ShengBuFengShi => "sheng_bu_feng_shi",
PatternKey::XiongSuChaoYuan => "xiong_su_chao_yuan",
PatternKey::FuXiangChaoYuan => "fu_xiang_chao_yuan",
PatternKey::HuoTan => "huo_tan",
PatternKey::LingTan => "ling_tan",
PatternKey::ShiZhongYinYu => "shi_zhong_yin_yu",
PatternKey::LiangMaPiaoDang => "liang_ma_piao_dang",
PatternKey::YangLiangChangLu => "yang_liang_chang_lu",
PatternKey::ShaPoLang => "sha_po_lang",
PatternKey::QiShaChaoDou => "qi_sha_chao_dou",
PatternKey::LuShuaiMaKun => "lu_shuai_ma_kun",
PatternKey::YingXingRuMiao => "ying_xing_ru_miao",
PatternKey::ZhongShuiChaoDong => "zhong_shui_chao_dong",
PatternKey::SanQiJiaHui => "san_qi_jia_hui",
PatternKey::LuMaJiaoChi => "lu_ma_jiao_chi",
PatternKey::LuHeYuanYang => "lu_he_yuan_yang",
PatternKey::MingLuAnLu => "ming_lu_an_lu",
PatternKey::LuMaPeiYin => "lu_ma_pei_yin",
PatternKey::LiangChongHuaGai => "liang_chong_hua_gai",
PatternKey::FengYunJiHui => "feng_yun_ji_hui",
PatternKey::YangTuoJiaMing => "yang_tuo_jia_ming",
PatternKey::MaTouDaiJian => "ma_tou_dai_jian",
PatternKey::ZuoYouTongGong => "zuo_you_tong_gong",
PatternKey::ZuoYouJiaMing => "zuo_you_jia_ming",
PatternKey::FuBiGongZhu => "fu_bi_gong_zhu",
PatternKey::KuiYueJiaMing => "kui_yue_jia_ming",
PatternKey::ZuoGuiXiangGui => "zuo_gui_xiang_gui",
PatternKey::JieKongJiaMing => "jie_kong_jia_ming",
PatternKey::LuFengLiangSha => "lu_feng_liang_sha",
PatternKey::WenGuiWenHua => "wen_gui_wen_hua",
PatternKey::WenXingChaoMing => "wen_xing_chao_ming",
PatternKey::ChangQuJiaMing => "chang_qu_jia_ming",
PatternKey::WenXingAnGong => "wen_xing_an_gong",
PatternKey::QuanLuShengFeng => "quan_lu_sheng_feng",
PatternKey::KeMingAnLu => "ke_ming_an_lu",
PatternKey::KeQuanLuJia => "ke_quan_lu_jia",
PatternKey::JiaDiDengYong => "jia_di_deng_yong",
}
}
pub fn from_key(key: &str) -> Option<Self> {
ALL_PATTERNS.iter().copied().find(|p| p.as_key() == key)
}
pub fn is_horoscope_only(self) -> bool {
matches!(self, PatternKey::LuShuaiMaKun | PatternKey::FengYunJiHui)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn keys_round_trip_and_unique() {
let mut seen = std::collections::HashSet::new();
for p in ALL_PATTERNS {
assert_eq!(PatternKey::from_key(p.as_key()), Some(p));
assert!(seen.insert(p.as_key()), "duplicate key {}", p.as_key());
}
assert_eq!(PatternKey::from_key("nope"), None);
}
}