sciforge-hub 0.0.4

Central hub orchestrating Sciforge subsystems (api, engine, tools).
Documentation
//! Dispatch handler for orbital mechanics functions.

use super::super::params::*;
use crate::domain::astronomy as astro;
use crate::domain::common::errors::{HubError, HubResult};
use crate::engine::experience::runner::RunOutput;

pub(super) fn dispatch(func: &str, p: &Params) -> HubResult<RunOutput> {
    match func {
        "kepler_period" => Ok(RunOutput::Scalar(astro::orbits::kepler_period(
            get_f(p, "a")?,
            get_f(p, "mu")?,
        ))),
        "kepler_velocity" => Ok(RunOutput::Scalar(astro::orbits::kepler_velocity(
            get_f(p, "mu")?,
            get_f(p, "r")?,
            get_f(p, "a")?,
        ))),
        "circular_velocity" => Ok(RunOutput::Scalar(astro::orbits::circular_velocity(
            get_f(p, "mu")?,
            get_f(p, "r")?,
        ))),
        "escape_velocity" => Ok(RunOutput::Scalar(astro::orbits::escape_velocity(
            get_f(p, "mu")?,
            get_f(p, "r")?,
        ))),
        "vis_viva" => Ok(RunOutput::Scalar(astro::orbits::vis_viva(
            get_f(p, "mu")?,
            get_f(p, "r")?,
            get_f(p, "a")?,
        ))),
        "orbital_energy" => Ok(RunOutput::Scalar(astro::orbits::orbital_energy(
            get_f(p, "mu")?,
            get_f(p, "a")?,
        ))),
        "angular_momentum" => Ok(RunOutput::Scalar(astro::orbits::angular_momentum(
            get_f(p, "mu")?,
            get_f(p, "a")?,
            get_f(p, "e")?,
        ))),
        "periapsis" => Ok(RunOutput::Scalar(astro::orbits::periapsis(
            get_f(p, "a")?,
            get_f(p, "e")?,
        ))),
        "apoapsis" => Ok(RunOutput::Scalar(astro::orbits::apoapsis(
            get_f(p, "a")?,
            get_f(p, "e")?,
        ))),
        "true_anomaly_to_radius" => Ok(RunOutput::Scalar(astro::orbits::true_anomaly_to_radius(
            get_f(p, "a")?,
            get_f(p, "e")?,
            get_f(p, "theta")?,
        ))),
        "hohmann_delta_v" => Ok(RunOutput::Scalar(astro::orbits::hohmann_delta_v(
            get_f(p, "mu")?,
            get_f(p, "r1")?,
            get_f(p, "r2")?,
        ))),
        "sphere_of_influence" => Ok(RunOutput::Scalar(astro::orbits::sphere_of_influence(
            get_f(p, "a")?,
            get_f(p, "m_planet")?,
            get_f(p, "m_star")?,
        ))),
        "roche_limit" => Ok(RunOutput::Scalar(astro::orbits::roche_limit(
            get_f(p, "r_primary")?,
            get_f(p, "rho_primary")?,
            get_f(p, "rho_secondary")?,
        ))),
        "solve_kepler" => Ok(RunOutput::Scalar(astro::orbits::solve_kepler(
            get_f(p, "m")?,
            get_f(p, "e")?,
            get_f(p, "tol")?,
        ))),
        "gr_perihelion_precession" => {
            Ok(RunOutput::Scalar(astro::orbits::gr_perihelion_precession(
                get_f(p, "mass")?,
                get_f(p, "a")?,
                get_f(p, "e")?,
            )))
        }
        _ => Err(HubError::InvalidInput(format!("unknown function: {func}"))),
    }
}