kundli-rs 0.2.0

A Rust library for calculating astrological kundli charts using the Swiss Ephemeris.
Documentation
use crate::kundli::astro::AstroResult;
use crate::kundli::error::DeriveError;
use crate::kundli::model::ChartResult;

use super::{HouseTransformOp, Materialize, ProjectionOp, ReferenceOp, SignTransformOp};

pub(crate) struct ChartPipeline<P, R, ST, HT>
where
    P: ProjectionOp,
    R: ReferenceOp<P::Output>,
    ST: SignTransformOp<R::Output>,
    HT: HouseTransformOp<ST::Output>,
    HT::Output: Materialize,
{
    projection: P,
    reference: R,
    sign_transform: ST,
    house_transform: HT,
}

impl<P, R, ST, HT> ChartPipeline<P, R, ST, HT>
where
    P: ProjectionOp,
    R: ReferenceOp<P::Output>,
    ST: SignTransformOp<R::Output>,
    HT: HouseTransformOp<ST::Output>,
    HT::Output: Materialize,
{
    pub(crate) fn new(
        projection: P,
        reference: R,
        sign_transform: ST,
        house_transform: HT,
    ) -> Self {
        Self {
            projection,
            reference,
            sign_transform,
            house_transform,
        }
    }

    pub(crate) fn execute(&self, input: AstroResult) -> Result<ChartResult, DeriveError> {
        let projected = self.projection.apply(input)?;
        let referenced = self.reference.apply(&projected)?;
        let signed = self.sign_transform.apply(&referenced)?;
        let housed = self.house_transform.apply(&signed)?;
        housed.materialize()
    }
}