use crate::core::error::ChartError;
use crate::core::model::chart::Chart;
use crate::core::placement::natal::input::{
NatalChartInput, NatalChartWithMajorStarsInput, NatalChartWithSupportedStarsInput,
};
use crate::core::placement::natal::major::{
DeterministicMajorStarPlacer, MajorStarPlacementInput, MajorStarPlacer,
};
use crate::core::placement::natal::minimal::build_minimal_natal_chart;
use crate::core::placement::natal::strategy::{
DeterministicNatalStarPlacementStrategy, NatalStarPlacementStrategy,
};
pub fn build_natal_chart_with_major_stars(
input: NatalChartWithMajorStarsInput,
) -> Result<Chart, ChartError> {
build_natal_chart_with_major_stars_using(input, &DeterministicMajorStarPlacer)
}
pub fn build_natal_chart_with_major_stars_using<P>(
input: NatalChartWithMajorStarsInput,
placer: &P,
) -> Result<Chart, ChartError>
where
P: MajorStarPlacer + ?Sized,
{
let chart = build_minimal_natal_chart(NatalChartInput::new(
input.birth_context().clone(),
input.method_profile().clone(),
input.lunar_month(),
input.birth_year_stem(),
input.birth_year_branch(),
))?;
let five_element_bureau = chart
.five_element_bureau()
.expect("minimal natal chart should derive a five-element bureau");
placer.place_major_stars(
chart,
MajorStarPlacementInput::new(
input.lunar_day(),
five_element_bureau,
input.birth_year_stem(),
),
)
}
pub fn build_natal_chart_with_supported_stars(
input: NatalChartWithSupportedStarsInput,
) -> Result<Chart, ChartError> {
build_natal_chart_with_supported_stars_using(
input,
&DeterministicNatalStarPlacementStrategy::default(),
)
}
pub fn build_natal_chart_with_supported_stars_using<S>(
input: NatalChartWithSupportedStarsInput,
strategy: &S,
) -> Result<Chart, ChartError>
where
S: NatalStarPlacementStrategy + ?Sized,
{
let chart = build_minimal_natal_chart(NatalChartInput::new(
input.birth_context().clone(),
input.method_profile().clone(),
input.lunar_month(),
input.birth_year_stem(),
input.birth_year_branch(),
))?;
strategy.place_supported_stars(chart, &input)
}