diff --git a/.gitignore b/.gitignore index 088ba6b..fa083b0 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,5 @@ Cargo.lock # These are backup files generated by rustfmt **/*.rs.bk + +src/resources diff --git a/Cargo.toml b/Cargo.toml index 4b92399..66aae0a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,11 +1,14 @@ [package] name = "mikaboshi" -version = "0.1.3" +version = "0.2.0" edition = "2018" [dependencies] +# env_logger = "0.8.4" lazy_static = "1.4.0" +# log = "0.4.0" serde = { version = "1.0.127", features = ["derive"] } +serde_json = "1.0.75" sowngwala = { git = "https://github.com/minagawah/sowngwala", version = "0.4.0" } [dev-dependencies] diff --git a/README.md b/README.md index 6b93544..99b25c4 100644 --- a/README.md +++ b/README.md @@ -109,6 +109,11 @@ println!("時: {} ({})", hour.alphabet(), hour.alphabet_ja()); // 時: 癸未 (みずのと・ひつじ) ``` +## Test + +``` +RUST_BACKTRACE=1 cargo test -vv -- --nocapture +``` ## Dislaimer diff --git a/json/ganzhi_branches.json b/json/ganzhi_branches.json new file mode 100644 index 0000000..acb6fe3 --- /dev/null +++ b/json/ganzhi_branches.json @@ -0,0 +1,134 @@ +[ + { + "no": 1, + "name": { + "en": "zi", + "ja": ["ね", "ne"], + "ja2": ["し", "shi"], + "vi": ["tí", "tí"], + "zh_cn": ["子", "zǐ"], + "zh_tw": ["子", "zǐ"] + } + }, + { + "no": 2, + "name": { + "en": "chou", + "ja": ["うし", "ushi"], + "ja2": ["ちゅう", "chu"], + "vi": ["sửu", "sửu"], + "zh_cn": ["丑", "chǒu"], + "zh_tw": ["丑", "chǒu"] + } + }, + { + "no": 3, + "name": { + "en": "", + "ja": ["とら", "tora"], + "ja2": ["いん", "in"], + "vi": ["dần", "dần"], + "zh_cn": ["寅", "yín"], + "zh_tw": ["寅", "yín"] + } + }, + { + "no": 4, + "name": { + "en": "mao", + "ja": ["う", "u"], + "ja2": ["ぼう", "bou"], + "vi": ["mão", "mão"], + "zh_cn": ["卯", "mǎo"], + "zh_tw": ["卯", "mǎo"] + } + }, + { + "no": 5, + "name": { + "en": "", + "ja": ["たつ", "tatsu"], + "ja2": ["しん", "shin"], + "vi": ["thần", "thần"], + "zh_cn": ["辰", "chén"], + "zh_tw": ["辰", "chén"] + } + }, + { + "no": 6, + "name": { + "en": "si", + "ja": ["み", "mi"], + "ja2": ["し", "shi"], + "vi": ["tị", "tị"], + "zh_cn": ["巳", "sì"], + "zh_tw": ["巳", "sì"] + } + }, + { + "no": 7, + "name": { + "en": "wu", + "ja": ["うま", "uma"], + "ja2": ["ご", "go"], + "vi": ["ngọ", "ngọ"], + "zh_cn": ["午", "wǔ"], + "zh_tw": ["午", "wǔ"] + } + }, + { + "no": 8, + "name": { + "en": "wei", + "ja": ["ひつじ", "hitsuji"], + "ja2": ["び", "bi"], + "vi": ["vị", "vị"], + "zh_cn": ["未", "wèi"], + "zh_tw": ["未", "wèi"] + } + }, + { + "no": 9, + "name": { + "en": "shen", + "ja": ["さる", "saru"], + "ja2": ["しん", "shin"], + "vi": ["thân", "thân"], + "zh_cn": ["申", "shēn"], + "zh_tw": ["申", "shēn"] + } + }, + { + "no": 10, + "name": { + "en": "you", + "ja": ["とり", "tori"], + "ja2": ["ゆう", "yuu"], + "vi": ["dậu", "dậu"], + "zh_cn": ["酉", "yǒu"], + "zh_tw": ["酉", "yǒu"] + } + }, + { + "no": 11, + "name": { + "en": "xu", + "ja": ["いぬ", "inu"], + "ja2": ["じゅつ", "jutsu"], + "vi": ["tuất", "tuất"], + "zh_cn": ["戌", "xū"], + "zh_tw": ["戌", "xū"] + } + }, + { + "no": 12, + "name": { + "en": "hai", + "ja": ["い", "i"], + "ja2": ["がい", "gai"], + "vi": ["hợi", "hợi"], + "zh_cn": ["亥", "hài"], + "zh_tw": ["亥", "hài"] + } + } +] diff --git a/json/ganzhi_stems.json b/json/ganzhi_stems.json new file mode 100644 index 0000000..212d54b --- /dev/null +++ b/json/ganzhi_stems.json @@ -0,0 +1,112 @@ +[ + { + "no": 1, + "name": { + "en": "jia", + "ja": ["きのえ", "kinoe"], + "ja2": ["コウ", "kou"], + "vi": ["giáp", "giap"], + "zh_cn": ["甲", "jiǎ"], + "zh_tw": ["甲", "jiǎ"] + } + }, + { + "no": 2, + "name": { + "en": "yi", + "ja": ["きのと", "kinoto"], + "ja2": ["オツ", "otsu"], + "vi": ["ất", "ất"], + "zh_cn": ["乙", "yǐ"], + "zh_tw": ["乙", "yǐ"] + } + }, + { + "no": 3, + "name": { + "en": "bing", + "ja": ["ひのえ", "hinoe"], + "ja2": ["ヘイ", "hei"], + "vi": ["bính", "bính"], + "zh_cn": ["丙", "bǐng"], + "zh_tw": ["丙", "bǐng"] + } + }, + { + "no": 4, + "name": { + "en": "ding", + "ja": ["ひのと", "hinoto"], + "ja2": ["テイ", "tei"], + "vi": ["đinh", "đinh"], + "zh_cn": ["丁", "dīng"], + "zh_tw": ["丁", "dīng"] + } + }, + { + "no": 5, + "name": { + "en": "wu", + "ja": ["つちのえ", "tsuchinoe"], + "ja2": ["ボ", "bo"], + "vi": ["mậu", "mậu"], + "zh_cn": ["戊", "wù"], + "zh_tw": ["戊", "wù"] + } + }, + { + "no": 6, + "name": { + "en": "ji", + "ja": ["つちのと", "tsuchinoe"], + "ja2": ["キ", "ki"], + "vi": ["kỷ", "kỷ"], + "zh_cn": ["己", "jǐ"], + "zh_tw": ["己", "jǐ"] + } + }, + { + "no": 7, + "name": { + "en": "geng", + "ja": ["かのえ", "kanoe"], + "ja2": ["コウ", "kou"], + "vi": ["canh", "canh"], + "zh_cn": ["庚", "gēng"], + "zh_tw": ["庚", "gēng"] + } + }, + { + "no": 8, + "name": { + "en": "xin", + "ja": ["かのと", "kanoto"], + "ja2": ["シン", "shin"], + "vi": ["tân", "tân"], + "zh_cn": ["辛", "xīn"], + "zh_tw": ["辛", "xīn"] + } + }, + { + "no": 9, + "name": { + "en": "ren", + "ja": ["みずのえ", "mizunoe"], + "ja2": ["ジン", "jin"], + "vi": ["nhâm", "nhâm"], + "zh_cn": ["壬", "rén"], + "zh_tw": ["壬", "rén"] + } + }, + { + "no": 10, + "name": { + "en": "gui", + "ja": ["みずのと", "mizunoto"], + "ja2": ["キ", "ki"], + "vi": ["quý", "quý"], + "zh_cn": ["癸", "guǐ"], + "zh_tw": ["癸", "guǐ"] + } + } +] diff --git a/json/solar_terms.json b/json/solar_terms.json new file mode 100644 index 0000000..d68eed2 --- /dev/null +++ b/json/solar_terms.json @@ -0,0 +1,290 @@ +[ + { + "id": 1, + "name": { + "en": "lichun", + "ja": ["立春", "risshun"], + "ja2": ["りっしゅん", "risshun"], + "vi": ["lập xuân", "lập xuân"], + "zh_cn": ["立春", "lìchūn"], + "zh_tw": ["立春", "lìchūn"] + }, + "angle": 315 + }, + { + "id": 2, + "name": { + "en": "yushui", + "ja": ["雨水", "usui"], + "ja2": ["うすい", "usui"], + "vi": ["vũ thủy", "vũ thủy"], + "zh_cn": ["雨水", "yǔshuǐ"], + "zh_tw": ["雨水", "yǔshuǐ"] + }, + "angle": 330 + }, + { + "id": 3, + "name": { + "en": "jingzhe", + "ja": ["啓蟄", "keichitsu"], + "ja2": ["けいちつ", "keichitsu"], + "vi": ["kinh trập", "kinh trập"], + "zh_cn": ["驚蟄", "jīngzhé"], + "zh_tw": ["驚蟄", "jīngzhé"] + }, + "angle": 345 + }, + { + "id": 4, + "name": { + "en": "chunfen", + "ja": ["春分", "shunbun"], + "ja2": ["しゅんぶん", "shunbun"], + "vi": ["xuân phân", "xuân phân"], + "zh_cn": ["春分", "chūnfēn"], + "zh_tw": ["春分", "chūnfēn"] + }, + "angle": 0 + }, + { + "id": 5, + "name": { + "en": "qingming", + "ja": ["清明", "seimei"], + "ja2": ["せいめい", "seimei"], + "vi": ["thanh minh", "thanh minh"], + "zh_cn": ["清明", "qīngmíng"], + "zh_tw": ["清明", "qīngmíng"] + }, + "angle": 15 + }, + { + "id": 6, + "name": { + "en": "guyu", + "ja": ["穀雨", "kokuu"], + "ja2": ["こくう", "kokuu"], + "vi": ["cốc vũ", "cốc vũ"], + "zh_cn": ["穀雨", "gǔyǔ"], + "zh_tw": ["穀雨", "gǔyǔ"] + }, + "angle": 30 + }, + { + "id": 7, + "name": { + "en": "lixia", + "ja": ["立夏", "rikka"], + "ja2": ["りっか", "rikka"], + "vi": ["lập hạ", "lập hạ"], + "zh_cn": ["立夏", "lìxià"], + "zh_tw": ["立夏", "lìxià"] + }, + "angle": 45 + }, + { + "id": 8, + "name": { + "en": "xiaoman", + "ja": ["小満", "shouman"], + "ja2": ["しょうまん", "shouman"], + "vi": ["tiểu mãn", "tiểu mãn"], + "zh_cn": ["小滿", "xiǎomǎn"], + "zh_tw": ["小滿", "xiǎomǎn"] + }, + "angle": 60 + }, + { + "id": 9, + "name": { + "en": "mangzhong", + "ja": ["芒種", "boushu"], + "ja2": ["ぼうしゅ", "boushu"], + "vi": ["mang chủng", "mang chủng"], + "zh_cn": ["芒種", "mángzhòng"], + "zh_tw": ["芒種", "mángzhòng"] + }, + "angle": 75 + }, + { + "id": 10, + "name": { + "en": "xiazhi", + "ja": ["夏至", "geshi"], + "ja2": ["げし", "geshi"], + "vi": ["hạ chí", "hạ chí"], + "zh_cn": ["夏至", "xiàzhì"], + "zh_tw": ["夏至", "xiàzhì"] + }, + "angle": 90 + }, + { + "id": 11, + "name": { + "en": "xiaoshu", + "ja": ["小暑", "shousho"], + "ja2": ["しょうしょ", "shousho"], + "vi": ["tiểu thử", "tiểu thử"], + "zh_cn": ["小暑", "xiǎoshǔ"], + "zh_tw": ["小暑", "xiǎoshǔ"] + }, + "angle": 105 + }, + { + "id": 12, + "name": { + "en": "dashu", + "ja": ["大暑", "taisho"], + "ja2": ["たいしょ", "taisho"], + "vi": ["đại thử", "đại thử"], + "zh_cn": ["大暑", "dàshǔ"], + "zh_tw": ["大暑", "dàshǔ"] + }, + "angle": 120 + }, + { + "id": 13, + "name": { + "en": "liqiu", + "ja": ["立秋", "risshuu"], + "ja2": ["りっしゅう", "risshuu"], + "vi": ["lập thu", "lập thu"], + "zh_cn": ["立秋", "lìqiū"], + "zh_tw": ["立秋", "lìqiū"] + }, + "angle": 135 + }, + { + "id": 14, + "name": { + "en": "chushu", + "ja": ["処暑", "shosho"], + "ja2": ["しょしょ", "shosho"], + "vi": ["xử thử", "xử thử"], + "zh_cn": ["處暑", "chǔshǔ"], + "zh_tw": ["處暑", "chǔshǔ"] + }, + "angle": 150 + }, + { + "id": 15, + "name": { + "en": "bailu", + "ja": ["白露", "hakuro"], + "ja2": ["はくろ", "hakuro"], + "vi": ["bạch lộ", "bạch lộ"], + "zh_cn": ["白露", "báilù"], + "zh_tw": ["白露", "báilù"] + }, + "angle": 165 + }, + { + "id": 16, + "name": { + "en": "qiufen", + "ja": ["秋分", "shubun"], + "ja2": ["しゅうぶん", "shubun"], + "vi": ["thu phân", "thu phân"], + "zh_cn": ["秋分", "qiūfēn"], + "zh_tw": ["秋分", "qiūfēn"] + }, + "angle": 180 + }, + { + "id": 17, + "name": { + "en": "hanlu", + "ja": ["寒露", "kanro"], + "ja2": ["かんろ", "kanro"], + "vi": ["hàn lộ", "hàn lộ"], + "zh_cn": ["寒露", "hánlù"], + "zh_tw": ["寒露", "hánlù"] + }, + "angle": 195 + }, + { + "id": 18, + "name": { + "en": "shuanjiang", + "ja": ["霜降", "soukou"], + "ja2": ["そうこう", "soukou"], + "vi": ["sương giáng", "sương giáng"], + "zh_cn": ["霜降", "shuāngjiàng"], + "zh_tw": ["", ""] + }, + "angle": 210 + }, + { + "id": 19, + "name": { + "en": "lidong", + "ja": ["立冬", "rittou"], + "ja2": ["りっとう", "rittou"], + "vi": ["lập đông", "lập đông"], + "zh_cn": ["立冬", "lìdōng"], + "zh_tw": ["立冬", "lìdōng"] + }, + "angle": 225 + }, + { + "id": 20, + "name": { + "en": "xiaoxue", + "ja": ["小雪", "shousetsu"], + "ja2": ["しょうせつ", "shousetsu"], + "vi": ["tiểu tuyết", "tiểu tuyết"], + "zh_cn": ["小雪", "xiǎoxuě"], + "zh_tw": ["小雪", "xiǎoxuě"] + }, + "angle": 240 + }, + { + "id": 21, + "name": { + "en": "daxue", + "ja": ["大雪", "taisetsu"], + "ja2": ["たいせつ", "taisetsu"], + "vi": ["đại tuyết", "đại tuyết"], + "zh_cn": ["大雪", "dàxuě"], + "zh_tw": ["大雪", "dàxuě"] + }, + "angle": 255 + }, + { + "id": 22, + "name": { + "en": "dongzhi", + "ja": ["冬至", "touji"], + "ja2": ["とうじ", "touji"], + "vi": ["Đông chí", "Đông chí"], + "zh_cn": ["冬至", "dōngzhì"], + "zh_tw": ["冬至", "dōngzhì"] + }, + "angle": 270 + }, + { + "id": 23, + "name": { + "en": "xiaohan", + "ja": ["小寒", "shoukan"], + "ja2": ["しょうかん", "shoukan"], + "vi": ["tiểu hàn", "tiểu hàn"], + "zh_cn": ["小寒", "xiǎohán"], + "zh_tw": ["小寒", "xiǎohán"] + }, + "angle": 285 + }, + { + "id": 24, + "name": { + "en": "dahan", + "ja": ["大寒", "daikan"], + "ja2": ["だいかん", "daikan"], + "vi": ["Đại hàn", "Đại hàn"], + "zh_cn": ["大寒", "dàhán"], + "zh_tw": ["大寒", "dàhán"] + }, + "angle": 300 + } +] diff --git a/src/constants.rs b/src/constants.rs index 7308838..6243b9b 100644 --- a/src/constants.rs +++ b/src/constants.rs @@ -1,322 +1,61 @@ -use crate::language::{ Language, LanguageDetails }; -use crate::ganzhi::{ Stem, Branch }; +use serde::{Deserialize, Serialize}; + +use crate::ganzhi::{Branch, Stem}; +use crate::language::{Language, LanguageDetails}; use crate::solar_terms::SolarTerm; +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct LanguageData { + pub en: String, + pub ja: Vec, + pub ja2: Vec, + pub vi: Vec, + pub zh_cn: Vec, + pub zh_tw: Vec, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct SolarTermData { + pub id: u8, + pub name: LanguageData, + pub angle: u16, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct StemData { + pub no: u8, + pub name: LanguageData, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct BranchData { + pub no: u8, + pub name: LanguageData, +} + lazy_static! { - pub static ref SOLAR_TERMS: Vec = vec![ - // 立春 (lichun) - SolarTerm { - id: 1, - name: Language { - en: "lichun".into(), - ja: LanguageDetails::new("立春", "risshun"), - ja2: LanguageDetails::new("りっしゅん", "risshun"), - vi: LanguageDetails::new("lập xuân", "lập xuân"), - zh_cn: LanguageDetails::new("立春", "lìchūn"), - zh_tw: LanguageDetails::new("立春", "lìchūn"), - }, - angle: 315, - }, - // 雨水 (yushui) - SolarTerm { - id: 2, - name: Language { - en: "yushui".into(), - ja: LanguageDetails::new("雨水", "usui"), - ja2: LanguageDetails::new("うすい", "usui"), - vi: LanguageDetails::new("vũ thủy", "vũ thủy"), - zh_cn: LanguageDetails::new("雨水", "yǔshuǐ"), - zh_tw: LanguageDetails::new("雨水", "yǔshuǐ"), - }, - angle: 330, - }, - // 驚蟄 (啓蟄) (jingzhe) - SolarTerm { - id: 3, - name: Language { - en: "jingzhe".into(), - ja: LanguageDetails::new("啓蟄", "keichitsu"), - ja2: LanguageDetails::new("けいちつ", "keichitsu"), - vi: LanguageDetails::new("kinh trập", "kinh trập"), - zh_cn: LanguageDetails::new("驚蟄", "jīngzhé"), - zh_tw: LanguageDetails::new("驚蟄", "jīngzhé"), - }, - angle: 345, - }, - // 春分 (chunfen) - SolarTerm { - id: 4, - name: Language { - en: "chunfen".into(), - ja: LanguageDetails::new("春分", "shunbun"), - ja2: LanguageDetails::new("しゅんぶん", "shunbun"), - vi: LanguageDetails::new("xuân phân", "xuân phân"), - zh_cn: LanguageDetails::new("春分", "chūnfēn"), - zh_tw: LanguageDetails::new("春分", "chūnfēn"), - }, - angle: 0, - }, - // 清明 (qingming) - SolarTerm { - id: 5, - name: Language { - en: "qingming".into(), - ja: LanguageDetails::new("清明", "seimei"), - ja2: LanguageDetails::new("せいめい", "seimei"), - vi: LanguageDetails::new("thanh minh", "thanh minh"), - zh_cn: LanguageDetails::new("清明", "qīngmíng"), - zh_tw: LanguageDetails::new("清明", "qīngmíng"), - }, - angle: 15, - }, - // 穀雨 (guyu) - SolarTerm { - id: 6, - name: Language { - en: "guyu".into(), - ja: LanguageDetails::new("穀雨", "kokuu"), - ja2: LanguageDetails::new("こくう", "kokuu"), - vi: LanguageDetails::new("cốc vũ", "cốc vũ"), - zh_cn: LanguageDetails::new("穀雨", "gǔyǔ"), - zh_tw: LanguageDetails::new("穀雨", "gǔyǔ"), - }, - angle: 30, - }, - // 立夏 (lixia) - SolarTerm { - id: 7, - name: Language { - en: "lixia".into(), - ja: LanguageDetails::new("立夏", "rikka"), - ja2: LanguageDetails::new("りっか", "rikka"), - vi: LanguageDetails::new("lập hạ", "lập hạ"), - zh_cn: LanguageDetails::new("立夏", "lìxià"), - zh_tw: LanguageDetails::new("立夏", "lìxià"), - }, - angle: 45, - }, - // 小滿 (xiaoman) - SolarTerm { - id: 8, - name: Language { - en: "xiaoman".into(), - ja: LanguageDetails::new("小満", "shouman"), - ja2: LanguageDetails::new("しょうまん", "shouman"), - vi: LanguageDetails::new("tiểu mãn", "tiểu mãn"), - zh_cn: LanguageDetails::new("小滿", "xiǎomǎn"), - zh_tw: LanguageDetails::new("小滿", "xiǎomǎn"), - }, - angle: 60, - }, - // 芒種 (mangzhong) - SolarTerm { - id: 9, - name: Language { - en: "mangzhong".into(), - ja: LanguageDetails::new("芒種", "boushu"), - ja2: LanguageDetails::new("ぼうしゅ", "boushu"), - vi: LanguageDetails::new("mang chủng", "mang chủng"), - zh_cn: LanguageDetails::new("芒種", "mángzhòng"), - zh_tw: LanguageDetails::new("芒種", "mángzhòng"), - }, - angle: 75, - }, - // 夏至 (xiazhi) - SolarTerm { - id: 10, - name: Language { - en: "xiazhi".into(), - ja: LanguageDetails::new("夏至", "geshi"), - ja2: LanguageDetails::new("げし", "geshi"), - vi: LanguageDetails::new("hạ chí", "hạ chí"), - zh_cn: LanguageDetails::new("夏至", "xiàzhì"), - zh_tw: LanguageDetails::new("夏至", "xiàzhì"), - }, - angle: 90, - }, - // 小暑 (xiaoshu) - SolarTerm { - id: 11, - name: Language { - en: "xiaoshu".into(), - ja: LanguageDetails::new("小暑", "shousho"), - ja2: LanguageDetails::new("しょうしょ", "shousho"), - vi: LanguageDetails::new("tiểu thử", "tiểu thử"), - zh_cn: LanguageDetails::new("小暑", "xiǎoshǔ"), - zh_tw: LanguageDetails::new("小暑", "xiǎoshǔ"), - }, - angle: 105, - }, - // 大暑 (dashu) - SolarTerm { - id: 12, - name: Language { - en: "dashu".into(), - ja: LanguageDetails::new("大暑", "taisho"), - ja2: LanguageDetails::new("たいしょ", "taisho"), - vi: LanguageDetails::new("đại thử", "đại thử"), - zh_cn: LanguageDetails::new("大暑", "dàshǔ"), - zh_tw: LanguageDetails::new("大暑", "dàshǔ"), - }, - angle: 120, - }, - // 立秋 (liqiu) - SolarTerm { - id: 13, - name: Language { - en: "liqiu".into(), - ja: LanguageDetails::new("立秋", "risshuu"), - ja2: LanguageDetails::new("りっしゅう", "risshuu"), - vi: LanguageDetails::new("lập thu", "lập thu"), - zh_cn: LanguageDetails::new("立秋", "lìqiū"), - zh_tw: LanguageDetails::new("立秋", "lìqiū"), - }, - angle: 135, - }, - // 處暑 (chushu) - SolarTerm { - id: 14, - name: Language { - en: "chushu".into(), - ja: LanguageDetails::new("処暑", "shosho"), - ja2: LanguageDetails::new("しょしょ", "shosho"), - vi: LanguageDetails::new("xử thử", "xử thử"), - zh_cn: LanguageDetails::new("處暑", "chǔshǔ"), - zh_tw: LanguageDetails::new("處暑", "chǔshǔ"), - }, - angle: 150, - }, - // 白露 (bailu) - SolarTerm { - id: 15, - name: Language { - en: "bailu".into(), - ja: LanguageDetails::new("白露", "hakuro"), - ja2: LanguageDetails::new("はくろ", "hakuro"), - vi: LanguageDetails::new("bạch lộ", "bạch lộ"), - zh_cn: LanguageDetails::new("白露", "báilù"), - zh_tw: LanguageDetails::new("白露", "báilù"), - }, - angle: 165, - }, - // 秋分 (qiufen) - SolarTerm { - id: 16, - name: Language { - en: "qiufen".into(), - ja: LanguageDetails::new("秋分", "shubun"), - ja2: LanguageDetails::new("しゅうぶん", "shubun"), - vi: LanguageDetails::new("thu phân", "thu phân"), - zh_cn: LanguageDetails::new("秋分", "qiūfēn"), - zh_tw: LanguageDetails::new("秋分", "qiūfēn"), - }, - angle: 180, - }, - // 寒露 (hanlu) - SolarTerm { - id: 17, - name: Language { - en: "hanlu".into(), - ja: LanguageDetails::new("寒露", "kanro"), - ja2: LanguageDetails::new("かんろ", "kanro"), - vi: LanguageDetails::new("hàn lộ", "hàn lộ"), - zh_cn: LanguageDetails::new("寒露", "hánlù"), - zh_tw: LanguageDetails::new("寒露", "hánlù"), - }, - angle: 195, - }, - // 霜降 (shuangjiang) - SolarTerm { - id: 18, - name: Language { - en: "shuanjiang".into(), - ja: LanguageDetails::new("霜降", "soukou"), - ja2: LanguageDetails::new("そうこう", "soukou"), - vi: LanguageDetails::new("sương giáng", "sương giáng"), - zh_cn: LanguageDetails::new("霜降", "shuāngjiàng"), - zh_tw: LanguageDetails::new("", ""), - }, - angle: 210, - }, - // 立冬 (lidong) - SolarTerm { - id: 19, - name: Language { - en: "lidong".into(), - ja: LanguageDetails::new("立冬", "rittou"), - ja2: LanguageDetails::new("りっとう", "rittou"), - vi: LanguageDetails::new("lập đông", "lập đông"), - zh_cn: LanguageDetails::new("立冬", "lìdōng"), - zh_tw: LanguageDetails::new("立冬", "lìdōng"), - }, - angle: 225, - }, - // 小雪 (xiaoxue) - SolarTerm { - id: 20, - name: Language { - en: "xiaoxue".into(), - ja: LanguageDetails::new("小雪", "shousetsu"), - ja2: LanguageDetails::new("しょうせつ", "shousetsu"), - vi: LanguageDetails::new("tiểu tuyết", "tiểu tuyết"), - zh_cn: LanguageDetails::new("小雪", "xiǎoxuě"), - zh_tw: LanguageDetails::new("小雪", "xiǎoxuě"), - }, - angle: 240, - }, - // 大雪 (daxue) - SolarTerm { - id: 21, - name: Language { - en: "daxue".into(), - ja: LanguageDetails::new("大雪", "taisetsu"), - ja2: LanguageDetails::new("たいせつ", "taisetsu"), - vi: LanguageDetails::new("đại tuyết", "đại tuyết"), - zh_cn: LanguageDetails::new("大雪", "dàxuě"), - zh_tw: LanguageDetails::new("大雪", "dàxuě"), - }, - angle: 255, - }, - // 冬至 (dongzhi) - SolarTerm { - id: 22, - name: Language { - en: "dongzhi".into(), - ja: LanguageDetails::new("冬至", "touji"), - ja2: LanguageDetails::new("とうじ", "touji"), - vi: LanguageDetails::new("Đông chí", "Đông chí"), - zh_cn: LanguageDetails::new("冬至", "dōngzhì"), - zh_tw: LanguageDetails::new("冬至", "dōngzhì"), - }, - angle: 270, - }, - // 小寒 (xiaohan) - SolarTerm { - id: 23, - name: Language { - en: "xiaohan".into(), - ja: LanguageDetails::new("小寒", "shoukan"), - ja2: LanguageDetails::new("しょうかん", "shoukan"), - vi: LanguageDetails::new("tiểu hàn", "tiểu hàn"), - zh_cn: LanguageDetails::new("小寒", "xiǎohán"), - zh_tw: LanguageDetails::new("小寒", "xiǎohán"), - }, - angle: 285, - }, - // 大寒 (dahan) - SolarTerm { - id: 24, - name: Language { - en: "dahan".into(), - ja: LanguageDetails::new("大寒", "daikan"), - ja2: LanguageDetails::new("だいかん", "daikan"), - vi: LanguageDetails::new("Đại hàn", "Đại hàn"), - zh_cn: LanguageDetails::new("大寒", "dàhán"), - zh_tw: LanguageDetails::new("大寒", "dàhán"), - }, - angle: 300, - }, - ]; + pub static ref SOLAR_TERMS: Vec = { + let json = &include_str!("../json/solar_terms.json"); + let data: Vec = match serde_json::from_str(json) { + Ok(json) => json, + Err(err) => panic!("Error: {}", err), + }; + data.iter().map(|item| { + let item = item.clone(); + SolarTerm { + id: item.id, + name: Language { + en: item.name.en, + ja: LanguageDetails::new(&item.name.ja[0], &item.name.ja[1]), + ja2: LanguageDetails::new(&item.name.ja2[0], &item.name.ja2[1]), + vi: LanguageDetails::new(&item.name.vi[0], &item.name.vi[1]), + zh_cn: LanguageDetails::new(&item.name.zh_cn[0], &item.name.zh_cn[1]), + zh_tw: LanguageDetails::new(&item.name.zh_tw[0], &item.name.zh_tw[1]), + }, + angle: item.angle, + } + }).collect() + }; // Combination of Stems (10) and Branches (12) which makes 60 patterns. pub static ref GANZHI_SEXAGESIMAL: Vec<(usize, usize)> = { @@ -329,275 +68,50 @@ lazy_static! { v }; - pub static ref STEMS: Vec = vec![ - // 甲 (jia) - Stem { - no: 1, - name: Language { - en: "jia".into(), - ja: LanguageDetails::new("きのえ", "kinoe"), - ja2: LanguageDetails::new("コウ", "kou"), - vi: LanguageDetails::new("giáp", "giap"), - zh_cn: LanguageDetails::new("甲", "jiǎ"), - zh_tw: LanguageDetails::new("甲", "jiǎ"), - }, - }, - // 乙 (yi) - Stem { - no: 2, - name: Language { - en: "yi".into(), - ja: LanguageDetails::new("きのと", "kinoto"), - ja2: LanguageDetails::new("オツ", "otsu"), - vi: LanguageDetails::new("ất", "ất"), - zh_cn: LanguageDetails::new("乙", "yǐ"), - zh_tw: LanguageDetails::new("乙", "yǐ"), - }, - }, - // 丙 (bing) - Stem { - no: 3, - name: Language { - en: "bing".into(), - ja: LanguageDetails::new("ひのえ", "hinoe"), - ja2: LanguageDetails::new("ヘイ", "hei"), - vi: LanguageDetails::new("bính", "bính"), - zh_cn: LanguageDetails::new("丙", "bǐng"), - zh_tw: LanguageDetails::new("丙", "bǐng"), - }, - }, - // 丁 (ding) - Stem { - no: 4, - name: Language { - en: "ding".into(), - ja: LanguageDetails::new("ひのと", "hinoto"), - ja2: LanguageDetails::new("テイ", "tei"), - vi: LanguageDetails::new("đinh", "đinh"), - zh_cn: LanguageDetails::new("丁", "dīng"), - zh_tw: LanguageDetails::new("丁", "dīng"), - }, - }, - // 戊 (wu) - Stem { - no: 5, - name: Language { - en: "wu".into(), - ja: LanguageDetails::new("つちのえ", "tsuchinoe"), - ja2: LanguageDetails::new("ボ", "bo"), - vi: LanguageDetails::new("mậu", "mậu"), - zh_cn: LanguageDetails::new("戊", "wù"), - zh_tw: LanguageDetails::new("戊", "wù"), - }, - }, - // 己 (ji) - Stem { - no: 6, - name: Language { - en: "ji".into(), - ja: LanguageDetails::new("つちのと", "tsuchinoe"), - ja2: LanguageDetails::new("キ", "ki"), - vi: LanguageDetails::new("kỷ", "kỷ"), - zh_cn: LanguageDetails::new("己", "jǐ"), - zh_tw: LanguageDetails::new("己", "jǐ"), - }, - }, - // 庚 (geng) - Stem { - no: 7, - name: Language { - en: "geng".into(), - ja: LanguageDetails::new("かのえ", "kanoe"), - ja2: LanguageDetails::new("コウ", "kou"), - vi: LanguageDetails::new("canh", "canh"), - zh_cn: LanguageDetails::new("庚", "gēng"), - zh_tw: LanguageDetails::new("庚", "gēng"), - }, - }, - // 辛 (xin) - Stem { - no: 8, - name: Language { - en: "xin".into(), - ja: LanguageDetails::new("かのと", "kanoto"), - ja2: LanguageDetails::new("シン", "shin"), - vi: LanguageDetails::new("tân", "tân"), - zh_cn: LanguageDetails::new("辛", "xīn"), - zh_tw: LanguageDetails::new("辛", "xīn"), - }, - }, - // 壬 (ren) - Stem { - no: 9, - name: Language { - en: "ren".into(), - ja: LanguageDetails::new("みずのえ", "mizunoe"), - ja2: LanguageDetails::new("ジン", "jin"), - vi: LanguageDetails::new("nhâm", "nhâm"), - zh_cn: LanguageDetails::new("壬", "rén"), - zh_tw: LanguageDetails::new("壬", "rén"), - }, - }, - // 癸 (gui) - Stem { - no: 10, - name: Language { - en: "gui".into(), - ja: LanguageDetails::new("みずのと", "mizunoto"), - ja2: LanguageDetails::new("キ", "ki"), - vi: LanguageDetails::new("quý", "quý"), - zh_cn: LanguageDetails::new("癸", "guǐ"), - zh_tw: LanguageDetails::new("癸", "guǐ"), - }, - }, - ]; + pub static ref STEMS: Vec = { + let json = &include_str!("../json/ganzhi_stems.json"); + let data: Vec = match serde_json::from_str(json) { + Ok(json) => json, + Err(err) => panic!("Error: {}", err), + }; + data.iter().map(|item| { + let item = item.clone(); + Stem { + no: item.no, + name: Language { + en: item.name.en, + ja: LanguageDetails::new(&item.name.ja[0], &item.name.ja[1]), + ja2: LanguageDetails::new(&item.name.ja2[0], &item.name.ja2[1]), + vi: LanguageDetails::new(&item.name.vi[0], &item.name.vi[1]), + zh_cn: LanguageDetails::new(&item.name.zh_cn[0], &item.name.zh_cn[1]), + zh_tw: LanguageDetails::new(&item.name.zh_tw[0], &item.name.zh_tw[1]), + }, + } + }).collect() + }; - pub static ref BRANCHES: Vec = vec![ - // 子 (zi) - Branch { - no: 1, - name: Language { - en: "zi".into(), - ja: LanguageDetails::new("ね", "ne"), - ja2: LanguageDetails::new("し", "shi"), - vi: LanguageDetails::new("tí", "tí"), - zh_cn: LanguageDetails::new("子", "zǐ"), - zh_tw: LanguageDetails::new("子", "zǐ"), - }, - }, - // 丑 (chou) - Branch { - no: 2, - name: Language { - en: "chou".into(), - ja: LanguageDetails::new("うし", "ushi"), - ja2: LanguageDetails::new("ちゅう", "chu"), - vi: LanguageDetails::new("sửu", "sửu"), - zh_cn: LanguageDetails::new("丑", "chǒu"), - zh_tw: LanguageDetails::new("丑", "chǒu"), - }, - }, - // 寅 (yin) - Branch { - no: 3, - name: Language { - en: "".into(), - ja: LanguageDetails::new("とら", "tora"), - ja2: LanguageDetails::new("いん", "in"), - vi: LanguageDetails::new("dần", "dần"), - zh_cn: LanguageDetails::new("寅", "yín"), - zh_tw: LanguageDetails::new("寅", "yín"), - }, - }, - // 卯 (mao) - Branch { - no: 4, - name: Language { - en: "mao".into(), - ja: LanguageDetails::new("う", "u"), - ja2: LanguageDetails::new("ぼう", "bou"), - vi: LanguageDetails::new("mão", "mão"), - zh_cn: LanguageDetails::new("卯", "mǎo"), - zh_tw: LanguageDetails::new("卯", "mǎo"), - }, - }, - // 辰 (chen) - Branch { - no: 5, - name: Language { - en: "".into(), - ja: LanguageDetails::new("たつ", "tatsu"), - ja2: LanguageDetails::new("しん", "shin"), - vi: LanguageDetails::new("thần", "thần"), - zh_cn: LanguageDetails::new("辰", "chén"), - zh_tw: LanguageDetails::new("辰", "chén"), - }, - }, - // 巳 (si) - Branch { - no: 6, - name: Language { - en: "si".into(), - ja: LanguageDetails::new("み", "mi"), - ja2: LanguageDetails::new("し", "shi"), - vi: LanguageDetails::new("tị", "tị"), - zh_cn: LanguageDetails::new("巳", "sì"), - zh_tw: LanguageDetails::new("巳", "sì"), - }, - }, - // 午 (wu) - Branch { - no: 7, - name: Language { - en: "wu".into(), - ja: LanguageDetails::new("うま", "uma"), - ja2: LanguageDetails::new("ご", "go"), - vi: LanguageDetails::new("ngọ", "ngọ"), - zh_cn: LanguageDetails::new("午", "wǔ"), - zh_tw: LanguageDetails::new("午", "wǔ"), - }, - }, - // 未 (wei) - Branch { - no: 8, - name: Language { - en: "wei".into(), - ja: LanguageDetails::new("ひつじ", "hitsuji"), - ja2: LanguageDetails::new("び", "bi"), - vi: LanguageDetails::new("vị", "vị"), - zh_cn: LanguageDetails::new("未", "wèi"), - zh_tw: LanguageDetails::new("未", "wèi"), - }, - }, - // 申 (shen) - Branch { - no: 9, - name: Language { - en: "shen".into(), - ja: LanguageDetails::new("さる", "saru"), - ja2: LanguageDetails::new("しん", "shin"), - vi: LanguageDetails::new("thân", "thân"), - zh_cn: LanguageDetails::new("申", "shēn"), - zh_tw: LanguageDetails::new("申", "shēn"), - }, - }, - // 酉 (you) - Branch { - no: 10, - name: Language { - en: "you".into(), - ja: LanguageDetails::new("とり", "tori"), - ja2: LanguageDetails::new("ゆう", "yuu"), - vi: LanguageDetails::new("dậu", "dậu"), - zh_cn: LanguageDetails::new("酉", "yǒu"), - zh_tw: LanguageDetails::new("酉", "yǒu"), - }, - }, - // 戌 (xu) - Branch { - no: 11, - name: Language { - en: "xu".into(), - ja: LanguageDetails::new("いぬ", "inu"), - ja2: LanguageDetails::new("じゅつ", "jutsu"), - vi: LanguageDetails::new("tuất", "tuất"), - zh_cn: LanguageDetails::new("戌", "xū"), - zh_tw: LanguageDetails::new("戌", "xū"), - }, - }, - // 亥 (hai) - Branch { - no: 12, - name: Language { - en: "hai".into(), - ja: LanguageDetails::new("い", "i"), - ja2: LanguageDetails::new("がい", "gai"), - vi: LanguageDetails::new("hợi", "hợi"), - zh_cn: LanguageDetails::new("亥", "hài"), - zh_tw: LanguageDetails::new("亥", "hài"), - }, - }, - ]; + pub static ref BRANCHES: Vec = { + let json = &include_str!("../json/ganzhi_branches.json"); + let data: Vec = match serde_json::from_str(json) { + Ok(json) => json, + Err(err) => panic!("Error: {}", err), + }; + + data.iter().map(|item| { + let item = item.clone(); + Branch { + no: item.no, + name: Language { + en: item.name.en, + ja: LanguageDetails::new(&item.name.ja[0], &item.name.ja[1]), + ja2: LanguageDetails::new(&item.name.ja2[0], &item.name.ja2[1]), + vi: LanguageDetails::new(&item.name.vi[0], &item.name.vi[1]), + zh_cn: LanguageDetails::new(&item.name.zh_cn[0], &item.name.zh_cn[1]), + zh_tw: LanguageDetails::new(&item.name.zh_tw[0], &item.name.zh_tw[1]), + }, + } + }).collect() + }; /// This is a table used when finding Hour Stem. /// Columns represents Day Stem groups, and there are 5 groups. diff --git a/src/ganzhi.rs b/src/ganzhi.rs index ec5b0f5..bdf766b 100644 --- a/src/ganzhi.rs +++ b/src/ganzhi.rs @@ -1,23 +1,13 @@ #[cfg(test)] use sowngwala::time::Month; -use serde::{ Deserialize, Serialize }; +use serde::{Deserialize, Serialize}; use sowngwala::time::{ - Date, - Time, - DateTime, - julian_day, - julian_day_from_ut, - modified_julian_day_from_ut, + julian_day, julian_day_from_ut, modified_julian_day_from_ut, Date, DateTime, Time, }; -use crate::constants::{ - HOUR_STEM_TABLE, - GANZHI_SEXAGESIMAL, - STEMS, - BRANCHES, -}; -use crate::language::{ Language, LanguageTrait }; +use crate::constants::{BRANCHES, GANZHI_SEXAGESIMAL, HOUR_STEM_TABLE, STEMS}; +use crate::language::{Language, LanguageTrait}; use crate::solar_terms::get_lichun; use crate::time::ut_from_local; use crate::utils::longitude_of_the_sun_from_date; @@ -64,41 +54,24 @@ impl GanZhi<'_> { /// Concatenate Stem & Branch (for Chinese characters) #[allow(dead_code)] fn alphabet(&self) -> String { - format!( - "{}{}", - self.stem.alphabet(), - self.branch.alphabet() - ) + format!("{}{}", self.stem.alphabet(), self.branch.alphabet()) } /// Concatenate Stem & Branch (for Chinese phonetics) #[allow(dead_code)] fn phonetic(&self) -> String { - format!( - "{} {}", - self.stem.phonetic(), - self.branch.phonetic() - ) + format!("{} {}", self.stem.phonetic(), self.branch.phonetic()) } /// Concatenate Stem & Branch (for Japanese characters) #[allow(dead_code)] fn alphabet_ja(&self) -> String { - format!( - "{}・{}", - self.stem.alphabet_ja(), - self.branch.alphabet_ja() - ) + format!("{}・{}", self.stem.alphabet_ja(), self.branch.alphabet_ja()) } } impl<'a> Bazi<'a> { - fn new( - year: GanZhi<'a>, - month: GanZhi<'a>, - day: GanZhi<'a>, - hour: GanZhi<'a> - ) -> Self { + fn new(year: GanZhi<'a>, month: GanZhi<'a>, day: GanZhi<'a>, hour: GanZhi<'a>) -> Self { Bazi { year, month, @@ -224,7 +197,7 @@ fn _month_ganzhi(ut: Box, year_stem_no: u8) -> GanZhi<'static> { fn _day_ganzhi(ut: Box) -> GanZhi<'static> { let mjd: f64 = modified_julian_day_from_ut(&*ut); let index = ((mjd - 10.0) % 60.0).floor() as usize; - + let (stem_id, branch_id) = GANZHI_SEXAGESIMAL[index]; GanZhi { diff --git a/src/language.rs b/src/language.rs index 0e5e025..85c5983 100644 --- a/src/language.rs +++ b/src/language.rs @@ -1,4 +1,4 @@ -use serde::{ Deserialize, Serialize }; +use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, Serialize, Deserialize)] pub struct LanguageDetails { diff --git a/src/solar_terms.rs b/src/solar_terms.rs index 4a47a0a..f4c555d 100644 --- a/src/solar_terms.rs +++ b/src/solar_terms.rs @@ -1,6 +1,6 @@ -use sowngwala::time::{ Month, Date, add_date }; +use sowngwala::time::{add_date, Date, Month}; -use crate::language::{ Language, LanguageTrait }; +use crate::language::{Language, LanguageTrait}; use crate::utils::longitude_of_the_sun_from_date; #[derive(Debug)] @@ -48,7 +48,11 @@ pub fn get_last_term(date: &Date) -> (f64, Date) { /// * `date` - &Date #[allow(clippy::many_single_char_names)] pub fn get_lichun(year: i16) -> Date { - let d: Date = Date { year, month: Month::Feb, day: 6.0 }; + let d: Date = Date { + year, + month: Month::Feb, + day: 6.0, + }; let (_lng, lichun) = get_last_term(&d); lichun } diff --git a/src/time.rs b/src/time.rs index 132af18..3ec79a5 100644 --- a/src/time.rs +++ b/src/time.rs @@ -1,13 +1,8 @@ #[cfg(test)] extern crate approx_eq; -pub use sowngwala::time::{ - Month, - Date, - Time, - DateTime, -}; use sowngwala::time::eot_fortified_ut_from_local; +pub use sowngwala::time::{Date, DateTime, Month, Time}; pub fn ut_from_local(&dt: &DateTime, zone: i8) -> DateTime { eot_fortified_ut_from_local(&dt, zone) @@ -41,8 +36,7 @@ mod tests { assert_eq!(ut.min, 57); assert_approx_eq!( ut.sec, // 17.137797474861145, - 17.13779, - 1e-6 + 17.13779, 1e-6 ); } } diff --git a/src/utils.rs b/src/utils.rs index 04641c5..6e892bb 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -1,5 +1,5 @@ -use sowngwala::time::Date; use sowngwala::sun::ecliptic_position_of_the_sun_from_date; +use sowngwala::time::Date; pub fn longitude_of_the_sun_from_date(date: &Date) -> f64 { ecliptic_position_of_the_sun_from_date(&date).lng