feat: Reading JSON files for data

This commit is contained in:
minagawah
2022-01-22 20:30:34 +09:00
parent fa53a1ed50
commit cace42b8ac
12 changed files with 665 additions and 634 deletions

2
.gitignore vendored
View File

@@ -8,3 +8,5 @@ Cargo.lock
# These are backup files generated by rustfmt
**/*.rs.bk
src/resources

View File

@@ -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]

View File

@@ -109,6 +109,11 @@ println!("時: {} ({})", hour.alphabet(), hour.alphabet_ja());
// 時: 癸未 (みずのと・ひつじ)
```
## Test
```
RUST_BACKTRACE=1 cargo test -vv -- --nocapture
```
## Dislaimer

134
json/ganzhi_branches.json Normal file
View File

@@ -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"]
}
}
]

112
json/ganzhi_stems.json Normal file
View File

@@ -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ǐ"]
}
}
]

290
json/solar_terms.json Normal file
View File

@@ -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
}
]

View File

@@ -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<String>,
pub ja2: Vec<String>,
pub vi: Vec<String>,
pub zh_cn: Vec<String>,
pub zh_tw: Vec<String>,
}
#[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<SolarTerm> = 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<SolarTerm> = {
let json = &include_str!("../json/solar_terms.json");
let data: Vec<SolarTermData> = 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<Stem> = 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("", ""),
zh_tw: LanguageDetails::new("", ""),
},
},
// 丙 (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("", ""),
zh_tw: LanguageDetails::new("", ""),
},
},
// 己 (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("", ""),
zh_tw: LanguageDetails::new("", ""),
},
},
// 庚 (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<Stem> = {
let json = &include_str!("../json/ganzhi_stems.json");
let data: Vec<StemData> = 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<Branch> = vec![
// 子 (zi)
Branch {
no: 1,
name: Language {
en: "zi".into(),
ja: LanguageDetails::new("", "ne"),
ja2: LanguageDetails::new("", "shi"),
vi: LanguageDetails::new("", ""),
zh_cn: LanguageDetails::new("", ""),
zh_tw: LanguageDetails::new("", ""),
},
},
// 丑 (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("", ""),
zh_tw: LanguageDetails::new("", ""),
},
},
// 午 (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("", ""),
zh_tw: LanguageDetails::new("", ""),
},
},
// 未 (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("", ""),
zh_tw: LanguageDetails::new("", ""),
},
},
// 亥 (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<Branch> = {
let json = &include_str!("../json/ganzhi_branches.json");
let data: Vec<BranchData> = 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.

View File

@@ -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<DateTime>, year_stem_no: u8) -> GanZhi<'static> {
fn _day_ganzhi(ut: Box<DateTime>) -> 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 {

View File

@@ -1,4 +1,4 @@
use serde::{ Deserialize, Serialize };
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LanguageDetails {

View File

@@ -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
}

View File

@@ -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
);
}
}

View File

@@ -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