数据表
枚举与它们的方法、排盘配置、星耀基础信息、天干地支信息与顺序常量。
x_iztro::data 收着两类东西:贯穿全库的枚举(星盘字段与几乎所有函数参数的类型),
以及排盘算法的输入表。两者都与输出语言无关——它们是算法的输入而非结果。
常用枚举都在 crate 根重导出,use x_iztro::*; 即可用。
枚举
十九个枚举 + StarKey。所有枚举都实现 Debug、Clone、Copy、PartialEq、Eq
与 serde 的 Serialize / Deserialize,可以直接比较、直接放进集合。
语言无关标识:as_key / from_key
绝大多数枚举带一对互逆的方法,把变体与 iztro i18n key 字符串来回换。
这套 key 就是 DTO 里 *Key 字段的取值,也是 Python 枚举与 Go 常量的值——
三侧写同一个字符串,判断结果一致。
| 枚举 | 变体数 | 取标识 | 由标识还原 | key 举例 |
|---|---|---|---|---|
StarKey | 162 | as_key() | from_key(&str) | ziweiMaj、yunlu |
Palace | 12 | as_key() | from_key(&str) | soulPalace、wealthPalace |
HeavenlyStem | 10 | as_key() | from_key(&str) | jiaHeavenly |
EarthlyBranch | 12 | as_key() | from_key(&str) | ziEarthly |
Mutagen | 4 | as_key() | from_key(&str) | sihuaLu |
Brightness | 7 | as_key() | from_key(&str) | miao |
FiveElementsClass | 5 | as_key() | from_key(&str) | water2nd |
StarType | 8 | as_key() | — | major、lucun |
Scope | 6 | as_key() | from_key(&str) | origin、decadal |
YearDivide | 2 | as_key() | from_key(&str) | normal / exact |
HoroscopeDivide | 2 | as_key() | from_key(&str) | normal / exact |
AgeDivide | 2 | as_key() | from_key(&str) | normal / birthday |
DayDivide | 2 | as_key() | from_key(&str) | forward / current |
Algorithm | 2 | as_key() | from_key(&str) | default / zhongzhou |
AstroType | 3 | as_key() | from_key(&str) | heaven / earth / human |
LeapMonth | 3 | as_key() | from_key(&str) | notLeap / leap / leapFixed |
from_key 一律返回 Option,未知标识给 None——绑定层据此拒绝非法入参。
println!("{}", StarKey::ZiweiMaj.as_key());
println!("{:?}", StarKey::from_key("taiyinMaj"));
println!("{:?}", StarKey::from_key("nosuch"));
println!("{} {}", Palace::Soul.as_key(), AstroType::Earth.as_key());
println!("{:?}", DayDivide::from_key("current"));输出
ziweiMaj
Some(TaiyinMaj)
None
soulPalace earth
Some(Current)其余方法
| 枚举 | 方法 | 说明 |
|---|---|---|
HeavenlyStem | index() -> usize / from_index(usize) | 天干序号,甲 = 0 … 癸 = 9 |
EarthlyBranch | index() -> usize / from_index(usize) | 地支序号,子 = 0 … 亥 = 11。不是宫位索引,换算用 earthly_branch_to_palace_index |
Palace | index() -> usize / from_index(usize) | 宫名在 PALACES 里的序号,命宫 = 0、父母 = 1 …… 兄弟 = 11。不是盘上位置;from_index 对 12 取模、不返回 Option |
FiveElementsClass | value() -> usize | 局数:水二局 2、木三局 3、金四局 4、土五局 5、火六局 6 |
Gender | yin_yang() -> YinYang | 男为阳、女为阴,决定大限与长生十二神的顺逆 |
Language | as_code() -> &'static str / from_code(&str) | 语言代码 zh-CN 等;from_code 大小写不敏感,连字符与下划线等价(zh_cn 也接受) |
YinYang | as_str() -> &'static str | 「阳」/「阴」,不参与国际化 |
FiveElements | as_str() -> &'static str | 「木」「金」「水」「火」「土」,不参与国际化 |
println!("{} {}", HeavenlyStem::Gui.index(), EarthlyBranch::Hai.index());
println!("{:?}", Palace::from_index(4));
println!("{}", FiveElementsClass::Wood3rd.value());
println!("{:?} {}", Gender::Female.yin_yang(), Gender::Female.yin_yang().as_str());
println!("{} {:?}", Language::JaJP.as_code(), Language::from_code("ZH-cn"));输出
9 11
Career
3
Yin 阴
ja-JP Some(ZhCN)变体清单
只列非「一眼可推」的几个;干支、宫名、星耀的变体名与它们的 key 一一对应。
| 枚举 | 变体 |
|---|---|
YinYang | Yang Yin |
FiveElements | Wood Metal Water Fire Earth |
FiveElementsClass | Water2nd Wood3rd Metal4th Earth5th Fire6th |
Mutagen | Lu Quan Ke Ji |
Brightness | Miao Wang De Li Ping Bu Xian |
StarType | Major Soft Tough Adjective Flower Helper Lucun Tianma |
Scope | Origin Decadal Yearly Monthly Daily Hourly |
HoroscopeName | Decadal Childhood Age Yearly Monthly Daily Hourly |
Gender | Male Female |
Language | ZhCN ZhTW EnUS JaJP KoKR ViVN |
LeapMonth | NotLeap Leap LeapFixed——by_lunar 的闰月处理方式;另有 from_flags(is_leap_month, fix_leap)、is_leap_month()、fix_leap() 与 iztro 风格的两个布尔互换 |
Palace | 按 index() 序:Soul Parents Spirit Property Career Friends Surface Health Wealth Children Spouse Siblings |
PalaceTarget | Index(usize) Name(Palace) Body Original |
五个枚举是 #[non_exhaustive] 的
IztroError、StarType、Scope、Algorithm、AstroType 标了 #[non_exhaustive],
crate 外的 match 必须带兜底分支。将来新增变体因此不是破坏性变更。
Scope 比 HoroscopeName 少一个 Childhood:童限不是独立的查询层级,
它只是大限的显示名——未起运时 h.decadal.name 显示「童限」,Scope::Decadal 照常用。
TimeIndex 是 u8 的类型别名,仅作可读性标注,没有额外校验。
Config
排盘配置:六个开关加两张可选的自定义表。Config::default() 与 JS iztro 的默认配置一致。
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
year_divide | YearDivide | Normal | 年干支按正月初一还是立春换年 |
horoscope_divide | HoroscopeDivide | Normal | 运限干支与月柱按初一还是节气推 |
age_divide | AgeDivide | Normal | 虚岁按自然农历年还是生日进位 |
day_divide | DayDivide | Forward | 晚子时归次日还是归当天 |
algorithm | Algorithm | Default | 派别:默认或中州派 |
astro_type | AstroType | Heaven | 排盘视角:天盘 / 地盘 / 人盘 |
overrides | Option<Arc<TableOverrides>> | None | 自定义四化与亮度表 |
六个开关的取值语义与流派背景见 Config 详解。
overrides 不参与序列化
overrides 标了 #[serde(skip)]:它是排盘的输入而不是结果,
放进 DTO 会破坏与 JS iztro 的字段契约。因此 JSON 输出里的 config 对象只有六个开关,
自定义表不会回显。
构造方法
字段都是 pub,可以直接改;链式写法更省事:
| 方法 | 说明 |
|---|---|
with_astro_type(AstroType) -> Config | 指定排盘视角 |
with_mutagens(HeavenlyStem, [StarKey; 4]) -> Config | 覆盖某个天干的四化表,顺序为禄、权、科、忌 |
with_brightness(StarKey, [Option<Brightness>; 12]) -> Config | 覆盖某颗星的十二宫亮度表,索引 0 为寅宫 |
查表方法
| 方法 | 说明 |
|---|---|
mutagens_of(HeavenlyStem) -> [StarKey; 4] | 该天干实际生效的四化表:有覆盖用覆盖,否则用默认表 |
brightness_of(StarKey, usize) -> Option<Brightness> | 该星在该宫实际生效的亮度;宫位索引越界对 12 取模 |
示例
let cfg = Config::default()
.with_astro_type(AstroType::Earth)
.with_mutagens(HeavenlyStem::Geng, [
StarKey::TaiyangMaj, StarKey::WuquMaj, StarKey::TianfuMaj, StarKey::TiantongMaj,
]);
println!("{:?}", cfg.astro_type);
println!("{:?}", cfg.mutagens_of(HeavenlyStem::Geng)
.iter().map(|s| translate_star(*s, Language::ZhCN)).collect::<Vec<_>>());
println!("{:?}", cfg.mutagens_of(HeavenlyStem::Jia)
.iter().map(|s| translate_star(*s, Language::ZhCN)).collect::<Vec<_>>());
println!("{:?}", cfg.brightness_of(StarKey::ZiweiMaj, 4));
let chart = by_solar("2000-8-16", 2, Gender::Female, true, Language::ZhCN, cfg)?;
println!("{}", translate_five_elements_class(chart.five_elements_class, Language::ZhCN));输出
Earth
["太阳", "武曲", "天府", "天同"]
["廉贞", "破军", "武曲", "太阳"]
Some(Miao)
土五局庚干的四化被换成「太阳禄、武曲权、天府科、天同忌」(默认表是太阴化科), 甲干未被覆盖,仍走默认表。
边界与陷阱
TableOverrides
Config 里那两张表的载体,一般不必直接构造——用上面两个 with_* 即可。
需要一次塞多条时可以自己建:
| 方法 | 说明 |
|---|---|
set_mutagens(HeavenlyStem, [StarKey; 4]) | 写入某天干的四化表 |
set_brightness(StarKey, [Option<Brightness>; 12]) | 写入某星的亮度表 |
mutagens_of(HeavenlyStem) -> Option<&[StarKey; 4]> | 取被覆盖的四化表,未覆盖为 None |
brightness_of(StarKey) -> Option<&[Option<Brightness>; 12]> | 取被覆盖的亮度表 |
is_empty() -> bool | 是否一条覆盖都没有 |
注意与 Config 上同名方法的区别:TableOverrides::mutagens_of 只报告有没有被覆盖,
Config::mutagens_of 报告实际生效的表(未覆盖时回落到默认表)。
get_star_info
用途 取一颗星的亮度表、五行与阴阳。
签名
pub fn get_star_info(key: StarKey) -> Option<StarInfo>参数
| 参数 | 类型 | 必填 | 默认 | 说明 |
|---|---|---|---|---|
key | StarKey | 是 | — | 星耀标识 |
返回值 Option<StarInfo>。只有二十颗星有记录,其余返回 None。
StarInfo 的字段:
| 字段 | 类型 | 说明 |
|---|---|---|
brightness | [Option<Brightness>; 12] | 十二宫亮度,索引 0 为寅宫;该宫无亮度则为 None |
five_elements | Option<FiveElements> | 五行 |
yin_yang | Option<YinYang> | 阴阳 |
有记录的二十颗是十四主星加文昌、文曲、火星、铃星、擎羊、陀罗,
即 STARS_WITH_INFO 常量列出的那些。
示例
let info = data::stars::get_star_info(StarKey::ZiweiMaj).unwrap();
println!("五行 {:?} 阴阳 {:?}", info.five_elements, info.yin_yang);
println!("寅宫亮度 {:?}", info.brightness[0]);
println!("禄存有记录: {}", data::stars::get_star_info(StarKey::LucunMin).is_some());输出
五行 Some(Earth) 阴阳 Some(Yin)
寅宫亮度 Some(Wang)
禄存有记录: false边界与陷阱
五行与阴阳有空缺
表中部分星耀的五行或阴阳未填:太阳与七杀两项皆空,
贪狼、天相、天梁、破军的阴阳空,六颗辅星两项皆空。
读到 None 表示表里没有这项数据,不是算法产生的中间态。
get_heavenly_stem_info
用途 取天干的阴阳、五行、对冲天干与四化四星。
斗数含义 天干的四化表是四化系统的根:生年干决定生年四化, 宫干决定该宫飞出的四化,运限干决定该层级的四化。
签名
pub fn get_heavenly_stem_info(stem: HeavenlyStem) -> HeavenlyStemInfo返回值 HeavenlyStemInfo,字段:
| 字段 | 类型 | 说明 |
|---|---|---|
yin_yang | YinYang | 阴阳 |
five_elements | FiveElements | 五行 |
crash | Option<HeavenlyStem> | 对冲天干;戊、己无对冲,为 None |
mutagen | [StarKey; 4] | 四化四星,顺序为禄、权、科、忌 |
示例
let jia = data::heavenly_stems::get_heavenly_stem_info(HeavenlyStem::Jia);
println!("{:?} {:?} 对冲 {:?}", jia.yin_yang, jia.five_elements, jia.crash);
println!("{:?}", jia.mutagen.iter().map(|s| translate_star(*s, Language::ZhCN)).collect::<Vec<_>>());
println!("戊干对冲 {:?}", data::heavenly_stems::get_heavenly_stem_info(HeavenlyStem::Wu).crash);输出
Yang Wood 对冲 Some(Geng)
["廉贞", "破军", "武曲", "太阳"]
戊干对冲 Noneget_earthly_branch_info
用途 取地支的阴阳、五行、对冲地支、命主身主与身体对应。
签名
pub fn get_earthly_branch_info(branch: EarthlyBranch) -> EarthlyBranchInfo返回值 EarthlyBranchInfo,字段:
| 字段 | 类型 | 说明 |
|---|---|---|
yin_yang | YinYang | 阴阳,决定大限与长生十二神的顺逆 |
five_elements | FiveElements | 五行 |
crash | EarthlyBranch | 对冲地支 |
soul | StarKey | 命主星(按命宫地支查) |
body | StarKey | 身主星(按生年地支查) |
inside | &'static str | 对应脏腑 |
outside | &'static str | 对应身体部位 |
health_tip | &'static str | 健康提示 |
inside / outside / health_tip 三项只有中文一种写法,不参与国际化。
示例
let zi = data::earthly_branches::get_earthly_branch_info(EarthlyBranch::Zi);
println!("{:?} {:?} 对冲 {:?}", zi.yin_yang, zi.five_elements, zi.crash);
println!("命主 {} 身主 {}", translate_star(zi.soul, Language::ZhCN), translate_star(zi.body, Language::ZhCN));
println!("{} / {}", zi.inside, zi.outside);输出
Yang Water 对冲 Wu
命主 贪狼 身主 火星
胆 / 下体顺序常量
| 常量 | 类型 | 内容 |
|---|---|---|
HEAVENLY_STEMS | [HeavenlyStem; 10] | 天干顺序:甲乙丙丁戊己庚辛壬癸 |
EARTHLY_BRANCHES | [EarthlyBranch; 12] | 地支顺序:子丑寅卯辰巳午未申酉戌亥 |
PALACES | [Palace; 12] | 十二宫名,从命宫起逆时针排:命、父母、福德、田宅、官禄、仆役、迁移、疾厄、财帛、子女、夫妻、兄弟 |
LANGUAGES | [&str; 6] | 支持的语言代码 |
ZODIAC | [&str; 12] | 生肖标识,按地支顺序 |
SIGNS | [&str; 12] | 星座标识,按黄道顺序 |
CHINESE_TIME | [&str; 13] | 时辰标识,早子时起、晚子时止 |
TIME_RANGES | [&str; 13] | 时辰对应的钟点区间 |
TIGER_RULE | [HeavenlyStem; 10] | 五虎遁:年干推正月天干 |
RAT_RULE | [HeavenlyStem; 10] | 五鼠遁:日干推子时天干 |
MUTAGEN | [Mutagen; 4] | 四化顺序:禄、权、科、忌(在 data::stars 下) |
TIGER_RULE 与 RAT_RULE 按天干序号索引:TIGER_RULE[0] 是甲年的正月天干。
示例
use x_iztro::data::constants::*;
println!("{} {} {}", LANGUAGES[0], ZODIAC[0], CHINESE_TIME[12]);
println!("{}", TIME_RANGES[2]);
println!("甲年正月干 {}", translate_heavenly_stem(TIGER_RULE[0], Language::ZhCN));
println!("甲日子时干 {}", translate_heavenly_stem(RAT_RULE[0], Language::ZhCN));输出
en-US rat lateRatHour
03:00~05:00
甲年正月干 丙
甲日子时干 甲星耀枚举清单
| 常量 | 长度 | 内容 |
|---|---|---|
ALL_STARS | 162 | 全部星耀标识,顺序与 StarKey 声明一致 |
STARS_WITH_INFO | 20 | 有 StarInfo 记录的那二十颗 |
示例
println!("{} {}", data::stars::ALL_STARS.len(), data::stars::STARS_WITH_INFO.len());
// 列出所有有亮度表的星
for star in data::stars::STARS_WITH_INFO {
print!("{} ", translate_star(star, Language::ZhCN));
}输出
162 20
紫微 天机 太阳 武曲 天同 廉贞 天府 太阴 贪狼 巨门 天相 天梁 七杀 破军 文昌 文曲 火星 铃星 擎羊 陀罗get_brightness_table
用途 取一颗星的十二宫亮度表原文。
签名
pub fn get_brightness_table(key: StarKey) -> Option<[Option<Brightness>; 12]>返回值 定长十二项数组,索引 0 为寅宫;该宫无亮度的位置为 None。
没有亮度表的星耀返回外层 None。
示例
let t = data::stars::get_brightness_table(StarKey::ZiweiMaj).unwrap();
println!("{:?}", &t[..4]);
println!("{:?}", data::stars::get_brightness_table(StarKey::LucunMin).is_none());输出
[Some(Wang), Some(Wang), Some(De), Some(Wang)]
true边界与陷阱
与 get_brightness 的分工
get_brightness_table 给的是内置默认表,不看配置;
utils::get_brightness 收 &Config,
自定义亮度表会改变它的结果。要复核「这张盘上实际用了什么亮度」,用后者。
get_star_info(key).brightness 与本函数取值相同,只是顺带给出五行与阴阳。