From f498cc8a84a7db10d17d14c01c2488dcbe908d7c Mon Sep 17 00:00:00 2001 From: minagawah Date: Thu, 10 Feb 2022 20:02:25 +0900 Subject: [PATCH] feat: Importing other Feng-Shui related JSON data --- Cargo.toml | 2 +- json/bagua.json | 110 ++++++++++++++++++++++++++++++++++++++ json/jiuxing.json | 128 +++++++++++++++++++++++++++++++++++++++++++++ json/planet.json | 79 ++++++++++++++++++++++++++++ json/wuxing.json | 37 +++++++++++++ src/bagua.rs | 17 ++++++ src/constants.rs | 92 ++++++++++---------------------- src/ganzhi.rs | 26 ++++++++- src/jiuxing.rs | 18 +++++++ src/language.rs | 23 ++++++++ src/lib.rs | 1 + src/planet.rs | 18 +++++++ src/solar_terms.rs | 16 +++++- src/wuxing.rs | 27 ++++++++++ 14 files changed, 527 insertions(+), 67 deletions(-) create mode 100644 json/bagua.json create mode 100644 json/jiuxing.json create mode 100644 json/planet.json create mode 100644 json/wuxing.json create mode 100644 src/bagua.rs create mode 100644 src/jiuxing.rs create mode 100644 src/planet.rs create mode 100644 src/wuxing.rs diff --git a/Cargo.toml b/Cargo.toml index d5cb6f2..34cff55 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mikaboshi" -version = "0.4.0" +version = "0.4.1" edition = "2018" [dependencies] diff --git a/json/bagua.json b/json/bagua.json new file mode 100644 index 0000000..e18b62e --- /dev/null +++ b/json/bagua.json @@ -0,0 +1,110 @@ +[ + { + "num": 1, + "name": { + "en": "kan", + "zh_cn": ["坎", "kǎn"], + "zh_cn": ["坎", "kǎn"], + "ja": ["かん", "kan"], + "vi": [] + }, + "direction": "n", + "element": 4 + }, + { + "num": 2, + "name": { + "en": "kun", + "zh_cn": ["坤", "kūn"], + "zh_tw": ["坤", "kūn"], + "ja": ["こん", "kon"], + "vi": [] + }, + "direction": "sw", + "element": 2 + }, + { + "num": 3, + "name": { + "en": "zhen", + "zh_cn": ["震", "zhèn"], + "zh_tw": ["震", "zhèn"], + "ja": ["しん", "shin"], + "vi": [] + }, + "direction": "e", + "element": 0 + }, + { + "num": 4, + "name": { + "en": "xun", + "zh_cn": ["巽", "xùn"], + "zh_tw": ["巽", "xùn"], + "ja": ["そん", "son"], + "vi": [] + }, + "direction": "se", + "element": 0 + }, + { + "num": 5, + "name": { + "en": "zhong", + "zh_cn": ["中", "zhōng"], + "zh_tw": ["中", "zhōng"], + "ja": ["中", "chu"], + "vi": [] + }, + "direction": "", + "element": 2 + }, + { + "num": 6, + "name": { + "en": "qian", + "zh_cn": ["乾", "qián"], + "zh_tw": ["乾", "qián"], + "ja": ["けん", "ken"], + "vi": [] + }, + "direction": "nw", + "element": 3 + }, + { + "num": 7, + "name": { + "en": "dui", + "zh_cn": ["兌", "duì"], + "zh_tw": ["兌", "duì"], + "ja": ["だ", "da"], + "vi": [] + }, + "direction": "e", + "element": 3 + }, + { + "num": 8, + "name": { + "en": "gen", + "zh_cn": ["艮", "gèn"], + "zh_tw": ["艮", "gèn"], + "ja": ["ごん", "gon"], + "vi": [] + }, + "direction": "ne", + "element": 2 + }, + { + "num": 9, + "name": { + "en": "li", + "zh_cn": ["離", "lí"], + "zh_tw": ["離", "lí"], + "ja": ["り", "ri"], + "vi": [] + }, + "direction": "s", + "element": 1 + } +] diff --git a/json/jiuxing.json b/json/jiuxing.json new file mode 100644 index 0000000..9462947 --- /dev/null +++ b/json/jiuxing.json @@ -0,0 +1,128 @@ +[ + { + "num": 1, + "direction": "n", + "name": { + "en": "1 White", + "zh_cn": ["一白水星", "yī bái shuǐ xīng"], + "zh_tw": ["一白水星", "yī bái shuǐ xīng"], + "ja": ["いっぱくすいせい", "ippaku suisei"], + "vi": [] + }, + "color": "white", + "element": 4, + "planet": 2 + }, + { + "num": 2, + "direction": "sw", + "name": { + "en": "2 Black", + "zh_cn": ["二黒土星", "èr hēi tǔ xīng"], + "zh_tw": ["二黒土星", "èr hēi tǔ xīng"], + "ja": ["じこくどせい", "jikoku dosei"], + "vi": [] + }, + "color": "black", + "element": 2, + "planet": 7 + }, + { + "num": 3, + "direction": "e", + "name": { + "en": "3 Jade", + "zh_cn": ["三碧木星", "sān bì mù xīng"], + "zh_tw": ["三碧木星", "sān bì mù xīng"], + "ja": ["さんぺきもくせい", "sanpeki mokusei"], + "vi": [] + }, + "color": "jade", + "element": 0, + "planet": 6 + }, + { + "num": 4, + "direction": "se", + "name": { + "en": "4 Green", + "zh_cn": ["四緑木星", "sì lǜ mù xīng"], + "zh_tw": ["四緑木星", "sì lǜ mù xīng"], + "ja": ["しろくもくせい", "shiroku mokusei"], + "vi": [] + }, + "color": "jade", + "element": 0, + "planet": 6 + }, + { + "num": 5, + "direction": null, + "name": { + "en": "5 Green", + "zh_cn": ["五黄土星", "wǔ huáng tǔ xīng"], + "zh_tw": ["五黄土星", "wǔ huáng tǔ xīng"], + "ja": ["ごおうどせい", "go-ou dosei"], + "vi": [] + }, + "color": "yellow", + "element": 2, + "planet": 7 + }, + { + "num": 6, + "direction": "nw", + "name": { + "en": "6 White", + "zh_cn": ["六白金星", "liù bái jīn xīng"], + "zh_tw": ["六白金星", "liù bái jīn xīng"], + "ja": ["ろっぱくきんせい", "roppaku kinsei"], + "vi": [] + }, + "color": "white", + "element": 3, + "planet": 3 + }, + { + "num": 7, + "direction": "w", + "name": { + "en": "7 Red", + "zh_cn": ["七赤金星", "qī chì jīn xīng"], + "zh_tw": ["七赤金星", "qī chì jīn xīng"], + "ja": ["しちせききんせい", "shichiseki kinsei"], + "vi": [] + }, + "color": "red", + "element": 3, + "planet": 3 + }, + { + "num": 8, + "direction": "ne", + "name": { + "en": "8 White", + "zh_cn": ["八白土星", "bā bái tǔ xīng"], + "zh_tw": ["八白土星", "bā bái tǔ xīng"], + "ja": ["はっぱくどせい", "happaku dosei"], + "vi": [] + }, + "color": "white", + "element": 2, + "planet": 7 + }, + { + "num": 9, + "direction": "s", + "name": { + "en": "9 Purple", + "zh_cn": ["九紫火星", "Jiǔ Zǐ"], + "zh_tw": ["九紫火星", "Jiǔ Zǐ"], + "ja": ["きゅうしかせい", "kyushi kasei"], + "vi": [] + }, + "color": "purple", + "element": 1, + "planet": 5 + } +] diff --git a/json/planet.json b/json/planet.json new file mode 100644 index 0000000..e57d5b2 --- /dev/null +++ b/json/planet.json @@ -0,0 +1,79 @@ +[ + { + "en": "earth", + "zh_cn": ["地球", "dì qiú"], + "zh_tw": ["地球", "dì qiú"], + "ja": ["ちきゅう", "chikyu"], + "vi": [] + }, + { + "en": "moon", + "zh_cn": ["月", ""], + "zh_tw": ["月", ""], + "ja": ["つき", "tsuki"], + "vi": [] + }, + { + "en": "mercury" + "zh_cn": ["水星", "shuǐ xīng"], + "zh_tw": ["水星", "shuǐ xīng"], + "ja": ["すいせい", "suisei"], + "vi": [] + }, + { + "en": "venus", + "zh_cn": ["金星", "jīn xīng"], + "zh_tw": ["金星", "jīn xīng"], + "ja": ["きんせい", "kinsei"], + "vi": [] + }, + { + "en": "sun", + "zh_cn": ["太陽", ""], + "zh_tw": ["太陽", ""], + "ja": ["たいよう", "taiyo"], + "vi": [] + }, + { + "en": "mars", + "zh_cn": ["火星", "huǒ xīng"], + "zh_tw": ["火星", "huǒ xīng"], + "ja": ["かせい", "kasei"], + "vi": [] + }, + { + "en": "jupiter", + "zh_cn": ["木星", "mù xīng"], + "zh_tw": ["木星", "mù xīng"], + "ja": ["もくせい", "mokusei"], + "vi": [] + }, + { + "en": "saturn", + "zh_cn": ["土星", "tǔ xīng"], + "zh_tw": ["土星", "tǔ xīng"], + "ja": ["どせい", "dosei"], + "vi": [] + }, + { + "en": "uranus", + "zh_cn": ["天王星", "tiānwáng xīng"], + "zh_tw": ["天王星", "tiānwáng xīng"], + "ja": ["てんのうせい", ""], + "vi": [] + }, + { + "en": "neptune", + "zh_cn": ["海王星", "hǎiwáng xīng"], + "zh_tw": ["海王星", "hǎiwáng xīng"], + "ja": ["かいおうせい", "kaiosei"], + "vi": [] + }, + { + "en": "pluto", + "zh_cn": ["冥王星", "míngwáng xīng"], + "zh_tw": ["冥王星", "míngwáng xīng"], + "ja": ["めいおうせい", "meiosei"], + "vi": [] + } +] diff --git a/json/wuxing.json b/json/wuxing.json new file mode 100644 index 0000000..c29f618 --- /dev/null +++ b/json/wuxing.json @@ -0,0 +1,37 @@ +[ + { + "en": "wood", + "zh_cn": ["木", "mù"], + "zh_tw": ["木", "mù"], + "ja": ["もく", "moku", "ki"], + "vi": [] + }, + { + "en": "fire", + "zh_cn": ["火", "huǒ"], + "zh_tw": ["火", "huǒ"], + "ja": ["か", "ka", "hi"], + "vi": [] + }, + { + "en": "earth", + "zh_cn": ["土", "tǔ"], + "zh_tw": ["土", "tǔ"], + "ja": ["ど", "do"], + "vi": [] + }, + { + "en": "metal", + "zh_cn": ["金", "jīn"], + "zh_tw": ["金", "jīn"], + "ja": ["ごん", "gon"], + "vi": [] + }, + { + "en": "water", + "zh_cn": ["水", "shuǐ"], + "zh_tw": ["水", "shuǐ"], + "ja": ["すい", "sui"], + "vi": [] + } +] diff --git a/src/bagua.rs b/src/bagua.rs new file mode 100644 index 0000000..31c31ab --- /dev/null +++ b/src/bagua.rs @@ -0,0 +1,17 @@ +use serde::{Deserialize, Serialize}; + +use crate::language::{Language, LanguageTrait}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Bagua { + pub num: u8, + pub name: Language, + pub direction: String, + pub element: u8, +} + +impl LanguageTrait for Bagua { + fn name(&self) -> Box { + Box::new(self.name.clone()) + } +} diff --git a/src/constants.rs b/src/constants.rs index 9955978..1c723d1 100644 --- a/src/constants.rs +++ b/src/constants.rs @@ -1,55 +1,26 @@ -use serde::{Deserialize, Serialize}; +use serde::{Deserialize}; -use crate::ganzhi::{Branch, Stem}; -use crate::language::{Language, LanguageDetails}; -use crate::solar_terms::SolarTerm; +use crate::ganzhi::{Stem, Branch, StemData, BranchData}; +use crate::language::NameDataTrait; +use crate::solar_terms::{SolarTerm, SolarTermData}; +use crate::wuxing::{WuXing, WuXingData}; -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct LanguageData { - pub en: String, - pub ja: 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, +fn get_json<'a, T: Deserialize<'a>>(json: &'a str) -> Vec { + match serde_json::from_str(json) { + Ok(json) => json, + Err(err) => panic!("Error: {}", err), + } } lazy_static! { 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), - }; + let data: Vec = get_json::(json); 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]), - 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]), - }, + name: item.language_from_data(), angle: item.angle, } }).collect() @@ -68,43 +39,36 @@ lazy_static! { 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), - }; + let data: Vec = get_json::(json); 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]), - 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]), - }, + name: item.language_from_data(), } }).collect() }; 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), - }; - + let data: Vec = get_json::(json); 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]), - 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]), - }, + name: item.language_from_data(), + } + }).collect() + }; + + pub static ref WUXING: Vec = { + let json = &include_str!("../json/wuxing.json"); + let data: Vec = get_json::(json); + data.iter().map(|item| { + let item = item.clone(); + WuXing { + no: item.no, + name: item.language_from_data(), } }).collect() }; diff --git a/src/ganzhi.rs b/src/ganzhi.rs index bdf766b..f19871d 100644 --- a/src/ganzhi.rs +++ b/src/ganzhi.rs @@ -7,7 +7,7 @@ use sowngwala::time::{ }; use crate::constants::{BRANCHES, GANZHI_SEXAGESIMAL, HOUR_STEM_TABLE, STEMS}; -use crate::language::{Language, LanguageTrait}; +use crate::language::{Language, LanguageData, LanguageTrait, NameDataTrait}; use crate::solar_terms::get_lichun; use crate::time::ut_from_local; use crate::utils::longitude_of_the_sun_from_date; @@ -24,6 +24,30 @@ pub struct Branch { pub name: Language, } +#[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, +} + +impl NameDataTrait for StemData { + fn name(&self) -> Box { + Box::new(self.name.clone()) + } +} + +impl NameDataTrait for BranchData { + fn name(&self) -> Box { + Box::new(self.name.clone()) + } +} + #[derive(Debug, Serialize)] pub struct GanZhi<'a> { pub stem: &'a Stem, diff --git a/src/jiuxing.rs b/src/jiuxing.rs new file mode 100644 index 0000000..91b4e29 --- /dev/null +++ b/src/jiuxing.rs @@ -0,0 +1,18 @@ +use serde::{Deserialize, Serialize}; + +use crate::language::{Language, LanguageTrait}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct JiuXing { + pub num: u8, + pub name: Language, + pub color: String, + pub element: u8, + pub planet: u8, +} + +impl LanguageTrait for JiuXing { + fn name(&self) -> Box { + Box::new(self.name.clone()) + } +} diff --git a/src/language.rs b/src/language.rs index 9718239..9fdfda8 100644 --- a/src/language.rs +++ b/src/language.rs @@ -15,6 +15,15 @@ pub struct Language { pub zh_tw: LanguageDetails, } +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct LanguageData { + pub en: String, + pub ja: Vec, + pub vi: Vec, + pub zh_cn: Vec, + pub zh_tw: Vec, +} + impl LanguageDetails { pub fn new(alphabet: &str, phonetic: &str) -> Self { LanguageDetails { @@ -42,3 +51,17 @@ pub trait LanguageTrait { self.name().ja.alphabet } } + +pub trait NameDataTrait { + fn name(&self) -> Box; + + fn language_from_data(&self) -> Language { + Language { + en: self.name().en, + ja: LanguageDetails::new(&self.name().ja[0], &self.name().ja[1]), + vi: LanguageDetails::new(&self.name().vi[0], &self.name().vi[1]), + zh_cn: LanguageDetails::new(&self.name().zh_cn[0], &self.name().zh_cn[1]), + zh_tw: LanguageDetails::new(&self.name().zh_tw[0], &self.name().zh_tw[1]), + } + } +} diff --git a/src/lib.rs b/src/lib.rs index 3680ecd..3544523 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -7,3 +7,4 @@ pub mod language; pub mod solar_terms; pub mod time; pub mod utils; +pub mod wuxing; diff --git a/src/planet.rs b/src/planet.rs new file mode 100644 index 0000000..e3afed1 --- /dev/null +++ b/src/planet.rs @@ -0,0 +1,18 @@ +use serde::{Deserialize, Serialize}; + +use crate::language::{Language, LanguageTrait}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Planet { + pub num: u8, + pub name: Language, + pub color: String, + pub element: u8, + pub planet: u8, +} + +impl LanguageTrait for Planet { + fn name(&self) -> Box { + Box::new(self.name.clone()) + } +} diff --git a/src/solar_terms.rs b/src/solar_terms.rs index 887c032..8979075 100644 --- a/src/solar_terms.rs +++ b/src/solar_terms.rs @@ -1,6 +1,7 @@ +use serde::{Deserialize, Serialize}; use sowngwala::time::{add_date, Date, Month}; -use crate::language::{Language, LanguageTrait}; +use crate::language::{Language, LanguageData, LanguageTrait, NameDataTrait}; use crate::utils::longitude_of_the_sun_from_date; #[derive(Debug)] @@ -10,12 +11,25 @@ pub struct SolarTerm { pub angle: u16, } +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct SolarTermData { + pub id: u8, + pub name: LanguageData, + pub angle: u16, +} + impl LanguageTrait for SolarTerm { fn name(&self) -> Box { Box::new(self.name.clone()) } } +impl NameDataTrait for SolarTermData { + fn name(&self) -> Box { + Box::new(self.name.clone()) + } +} + #[allow(clippy::many_single_char_names)] pub fn get_last_term(date: &Date) -> (f64, Date) { let lng_0: f64 = longitude_of_the_sun_from_date(&date); diff --git a/src/wuxing.rs b/src/wuxing.rs new file mode 100644 index 0000000..d9e4de4 --- /dev/null +++ b/src/wuxing.rs @@ -0,0 +1,27 @@ +use serde::{Deserialize, Serialize}; + +use crate::language::{Language, LanguageData, LanguageTrait, NameDataTrait}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct WuXing { + pub no: u8, + pub name: Language, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct WuXingData { + pub no: u8, + pub name: LanguageData, +} + +impl LanguageTrait for WuXing { + fn name(&self) -> Box { + Box::new(self.name.clone()) + } +} + +impl NameDataTrait for WuXingData { + fn name(&self) -> Box { + Box::new(self.name.clone()) + } +}