use crate::data::heavenly_stems::get_heavenly_stem_info;
use crate::data::stars::{StarKey, get_brightness_table};
use crate::data::types::*;
use crate::i18n::translate_star;
use crate::models::star::Star;
use crate::utils::fix_index;
fn make_star(
key: StarKey,
star_type: StarType,
scope: Scope,
palace_index: usize,
yearly_stem: Option<HeavenlyStem>,
lang: Language,
) -> Star {
let brightness = get_brightness_table(key).and_then(|table| table[palace_index]);
let mutagen = yearly_stem.and_then(|stem| {
let info = get_heavenly_stem_info(stem);
info.mutagen
.iter()
.position(|&k| k == key)
.map(|i| [Mutagen::Lu, Mutagen::Quan, Mutagen::Ke, Mutagen::Ji][i])
});
Star {
key,
name: translate_star(key, lang).to_string(),
star_type,
scope,
brightness,
mutagen,
}
}
pub fn get_major_stars(
ziwei_index: usize,
tianfu_index: usize,
yearly_stem: HeavenlyStem,
lang: Language,
) -> [Vec<Star>; 12] {
let mut result: [Vec<Star>; 12] = Default::default();
let ziwei_group: [(usize, StarKey); 6] = [
(0, StarKey::ZiweiMaj),
(1, StarKey::TianjiMaj),
(3, StarKey::TaiyangMaj),
(4, StarKey::WuquMaj),
(5, StarKey::TiantongMaj),
(8, StarKey::LianzhenMaj),
];
for (offset, key) in ziwei_group {
let idx = fix_index(ziwei_index as i32 - offset as i32, 12);
let star = make_star(
key,
StarType::Major,
Scope::Origin,
idx,
Some(yearly_stem),
lang,
);
result[idx].push(star);
}
let tianfu_group: [(usize, StarKey); 8] = [
(0, StarKey::TianfuMaj),
(1, StarKey::TaiyinMaj),
(2, StarKey::TanlangMaj),
(3, StarKey::JumenMaj),
(4, StarKey::TianxiangMaj),
(5, StarKey::TianliangMaj),
(6, StarKey::QishaMaj),
(10, StarKey::PojunMaj),
];
for (offset, key) in tianfu_group {
let idx = fix_index(tianfu_index as i32 + offset as i32, 12);
let star = make_star(
key,
StarType::Major,
Scope::Origin,
idx,
Some(yearly_stem),
lang,
);
result[idx].push(star);
}
result
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_major_stars_count() {
let result = get_major_stars(0, 0, HeavenlyStem::Jia, Language::ZhCN);
let total: usize = result.iter().map(|v| v.len()).sum();
assert_eq!(total, 14);
}
#[test]
fn test_all_major_type() {
let result = get_major_stars(3, 9, HeavenlyStem::Yi, Language::ZhCN);
for palace in &result {
for star in palace {
assert_eq!(star.star_type, StarType::Major);
assert_eq!(star.scope, Scope::Origin);
}
}
}
}