use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum YinYang {
Yang,
Yin,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum FiveElements {
Wood,
Metal,
Water,
Fire,
Earth,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[repr(usize)]
pub enum HeavenlyStem {
Jia,
Yi,
Bing,
Ding,
Wu,
Ji,
Geng,
Xin,
Ren,
Gui,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[repr(usize)]
pub enum EarthlyBranch {
Zi,
Chou,
Yin,
Mao,
Chen,
Si,
Wu,
Wei,
Shen,
You,
Xu,
Hai,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[repr(usize)]
pub enum Palace {
Soul,
Parents,
Spirit,
Property,
Career,
Friends,
Surface,
Health,
Wealth,
Children,
Spouse,
Siblings,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[repr(u8)]
pub enum FiveElementsClass {
Water2nd = 2,
Wood3rd = 3,
Metal4th = 4,
Earth5th = 5,
Fire6th = 6,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Mutagen {
Lu,
Quan,
Ke,
Ji,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum Brightness {
Miao,
Wang,
De,
Li,
Ping,
Bu,
Xian,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum StarType {
Major,
Soft,
Tough,
Adjective,
Flower,
Helper,
Lucun,
Tianma,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum Scope {
Origin,
Decadal,
Yearly,
Monthly,
Daily,
Hourly,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum HoroscopeName {
Decadal,
Childhood,
Age,
Yearly,
Monthly,
Daily,
Hourly,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum Gender {
Male,
Female,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum Language {
ZhCN,
ZhTW,
EnUS,
JaJP,
KoKR,
ViVN,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum Algorithm {
Default,
Zhongzhou,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum YearDivide {
Normal,
Exact,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum HoroscopeDivide {
Normal,
Exact,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum AgeDivide {
Normal,
Birthday,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum DayDivide {
Forward,
Current,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub struct Config {
pub year_divide: YearDivide,
pub horoscope_divide: HoroscopeDivide,
pub age_divide: AgeDivide,
pub day_divide: DayDivide,
pub algorithm: Algorithm,
}
impl Default for Config {
fn default() -> Self {
Config {
year_divide: YearDivide::Normal,
horoscope_divide: HoroscopeDivide::Normal,
age_divide: AgeDivide::Normal,
day_divide: DayDivide::Forward,
algorithm: Algorithm::Default,
}
}
}
pub type TimeIndex = u8;
impl HeavenlyStem {
pub fn index(&self) -> usize {
*self as usize
}
pub fn from_index(i: usize) -> Self {
crate::data::constants::HEAVENLY_STEMS[i % 10]
}
}
impl EarthlyBranch {
pub fn index(&self) -> usize {
*self as usize
}
pub fn from_index(i: usize) -> Self {
crate::data::constants::EARTHLY_BRANCHES[i % 12]
}
}
impl Palace {
pub fn index(&self) -> usize {
*self as usize
}
pub fn from_index(i: usize) -> Self {
crate::data::constants::PALACES[i % 12]
}
}
impl FiveElementsClass {
pub fn value(&self) -> usize {
*self as usize
}
}
impl Palace {
pub fn as_key(&self) -> &'static str {
match self {
Palace::Soul => "soulPalace",
Palace::Parents => "parentsPalace",
Palace::Spirit => "spiritPalace",
Palace::Property => "propertyPalace",
Palace::Career => "careerPalace",
Palace::Friends => "friendsPalace",
Palace::Surface => "surfacePalace",
Palace::Health => "healthPalace",
Palace::Wealth => "wealthPalace",
Palace::Children => "childrenPalace",
Palace::Spouse => "spousePalace",
Palace::Siblings => "siblingsPalace",
}
}
}
impl HeavenlyStem {
pub fn as_key(&self) -> &'static str {
match self {
HeavenlyStem::Jia => "jiaHeavenly",
HeavenlyStem::Yi => "yiHeavenly",
HeavenlyStem::Bing => "bingHeavenly",
HeavenlyStem::Ding => "dingHeavenly",
HeavenlyStem::Wu => "wuHeavenly",
HeavenlyStem::Ji => "jiHeavenly",
HeavenlyStem::Geng => "gengHeavenly",
HeavenlyStem::Xin => "xinHeavenly",
HeavenlyStem::Ren => "renHeavenly",
HeavenlyStem::Gui => "guiHeavenly",
}
}
}
impl EarthlyBranch {
pub fn as_key(&self) -> &'static str {
match self {
EarthlyBranch::Zi => "ziEarthly",
EarthlyBranch::Chou => "chouEarthly",
EarthlyBranch::Yin => "yinEarthly",
EarthlyBranch::Mao => "maoEarthly",
EarthlyBranch::Chen => "chenEarthly",
EarthlyBranch::Si => "siEarthly",
EarthlyBranch::Wu => "wuEarthly",
EarthlyBranch::Wei => "weiEarthly",
EarthlyBranch::Shen => "shenEarthly",
EarthlyBranch::You => "youEarthly",
EarthlyBranch::Xu => "xuEarthly",
EarthlyBranch::Hai => "haiEarthly",
}
}
}
impl Mutagen {
pub fn as_key(&self) -> &'static str {
match self {
Mutagen::Lu => "sihuaLu",
Mutagen::Quan => "sihuaQuan",
Mutagen::Ke => "sihuaKe",
Mutagen::Ji => "sihuaJi",
}
}
}
impl Brightness {
pub fn as_key(&self) -> &'static str {
match self {
Brightness::Miao => "miao",
Brightness::Wang => "wang",
Brightness::De => "de",
Brightness::Li => "li",
Brightness::Ping => "ping",
Brightness::Bu => "bu",
Brightness::Xian => "xian",
}
}
}
impl FiveElementsClass {
pub fn as_key(&self) -> &'static str {
match self {
FiveElementsClass::Water2nd => "water2nd",
FiveElementsClass::Wood3rd => "wood3rd",
FiveElementsClass::Metal4th => "metal4th",
FiveElementsClass::Earth5th => "earth5th",
FiveElementsClass::Fire6th => "fire6th",
}
}
}