数据表

枚举与它们的方法、排盘配置、星耀基础信息、天干地支信息与顺序常量。

x_iztro::data 收着两类东西:贯穿全库的枚举(星盘字段与几乎所有函数参数的类型), 以及排盘算法的输入表。两者都与输出语言无关——它们是算法的输入而非结果。

常用枚举都在 crate 根重导出,use x_iztro::*; 即可用。


枚举

十九个枚举 + StarKey。所有枚举都实现 DebugCloneCopyPartialEqEq 与 serde 的 Serialize / Deserialize,可以直接比较、直接放进集合。

语言无关标识:as_key / from_key

绝大多数枚举带一对互逆的方法,把变体与 iztro i18n key 字符串来回换。 这套 key 就是 DTO 里 *Key 字段的取值,也是 Python 枚举与 Go 常量的值—— 三侧写同一个字符串,判断结果一致。

枚举变体数取标识由标识还原key 举例
StarKey162as_key()from_key(&str)ziweiMajyunlu
Palace12as_key()from_key(&str)soulPalacewealthPalace
HeavenlyStem10as_key()from_key(&str)jiaHeavenly
EarthlyBranch12as_key()from_key(&str)ziEarthly
Mutagen4as_key()from_key(&str)sihuaLu
Brightness7as_key()from_key(&str)miao
FiveElementsClass5as_key()from_key(&str)water2nd
StarType8as_key()majorlucun
Scope6as_key()from_key(&str)origindecadal
YearDivide2as_key()from_key(&str)normal / exact
HoroscopeDivide2as_key()from_key(&str)normal / exact
AgeDivide2as_key()from_key(&str)normal / birthday
DayDivide2as_key()from_key(&str)forward / current
Algorithm2as_key()from_key(&str)default / zhongzhou
AstroType3as_key()from_key(&str)heaven / earth / human
LeapMonth3as_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)

其余方法

枚举方法说明
HeavenlyStemindex() -> usize / from_index(usize)天干序号,甲 = 0 … 癸 = 9
EarthlyBranchindex() -> usize / from_index(usize)地支序号,子 = 0 … 亥 = 11。不是宫位索引,换算用 earthly_branch_to_palace_index
Palaceindex() -> usize / from_index(usize)宫名在 PALACES 里的序号,命宫 = 0、父母 = 1 …… 兄弟 = 11。不是盘上位置from_index 对 12 取模、不返回 Option
FiveElementsClassvalue() -> usize局数:水二局 2、木三局 3、金四局 4、土五局 5、火六局 6
Genderyin_yang() -> YinYang男为阳、女为阴,决定大限与长生十二神的顺逆
Languageas_code() -> &'static str / from_code(&str)语言代码 zh-CN 等;from_code 大小写不敏感,连字符与下划线等价(zh_cn 也接受)
YinYangas_str() -> &'static str「阳」/「阴」,不参与国际化
FiveElementsas_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 一一对应。

枚举变体
YinYangYang Yin
FiveElementsWood Metal Water Fire Earth
FiveElementsClassWater2nd Wood3rd Metal4th Earth5th Fire6th
MutagenLu Quan Ke Ji
BrightnessMiao Wang De Li Ping Bu Xian
StarTypeMajor Soft Tough Adjective Flower Helper Lucun Tianma
ScopeOrigin Decadal Yearly Monthly Daily Hourly
HoroscopeNameDecadal Childhood Age Yearly Monthly Daily Hourly
GenderMale Female
LanguageZhCN ZhTW EnUS JaJP KoKR ViVN
LeapMonthNotLeap Leap LeapFixed——by_lunar 的闰月处理方式;另有 from_flags(is_leap_month, fix_leap)is_leap_month()fix_leap() 与 iztro 风格的两个布尔互换
Palaceindex() 序:Soul Parents Spirit Property Career Friends Surface Health Wealth Children Spouse Siblings
PalaceTargetIndex(usize) Name(Palace) Body Original

五个枚举是 #[non_exhaustive] 的

IztroErrorStarTypeScopeAlgorithmAstroType 标了 #[non_exhaustive], crate 外的 match 必须带兜底分支。将来新增变体因此不是破坏性变更。

ScopeHoroscopeName 少一个 Childhood:童限不是独立的查询层级, 它只是大限的显示名——未起运时 h.decadal.name 显示「童限」,Scope::Decadal 照常用。

TimeIndexu8 的类型别名,仅作可读性标注,没有额外校验。


Config

排盘配置:六个开关加两张可选的自定义表。Config::default() 与 JS iztro 的默认配置一致。

字段类型默认值说明
year_divideYearDivideNormal年干支按正月初一还是立春换年
horoscope_divideHoroscopeDivideNormal运限干支与月柱按初一还是节气推
age_divideAgeDivideNormal虚岁按自然农历年还是生日进位
day_divideDayDivideForward晚子时归次日还是归当天
algorithmAlgorithmDefault派别:默认或中州派
astro_typeAstroTypeHeaven排盘视角:天盘 / 地盘 / 人盘
overridesOption<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>

参数

参数类型必填默认说明
keyStarKey星耀标识

返回值 Option<StarInfo>。只有二十颗星有记录,其余返回 None

StarInfo 的字段:

字段类型说明
brightness[Option<Brightness>; 12]十二宫亮度,索引 0 为寅宫;该宫无亮度则为 None
five_elementsOption<FiveElements>五行
yin_yangOption<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_yangYinYang阴阳
five_elementsFiveElements五行
crashOption<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)
["廉贞", "破军", "武曲", "太阳"]
戊干对冲 None

get_earthly_branch_info

用途 取地支的阴阳、五行、对冲地支、命主身主与身体对应。

签名

pub fn get_earthly_branch_info(branch: EarthlyBranch) -> EarthlyBranchInfo

返回值 EarthlyBranchInfo,字段:

字段类型说明
yin_yangYinYang阴阳,决定大限与长生十二神的顺逆
five_elementsFiveElements五行
crashEarthlyBranch对冲地支
soulStarKey命主星(按命宫地支查)
bodyStarKey身主星(按生年地支查)
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_RULERAT_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_STARS162全部星耀标识,顺序与 StarKey 声明一致
STARS_WITH_INFO20StarInfo 记录的那二十颗

示例

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 与本函数取值相同,只是顺带给出五行与阴阳。

本页目录