cometsfactory 0.0.3

Comet factory — classify, build and catalogue comets of any type: short-period, long-period, Halley-type, sungrazer, interstellar, main-belt comet, centaur-transition, and extinct.
Documentation
use crate::types::{
    CentaurTransition, Extinct, GeneratedComet, HalleyType, Interstellar, LongPeriod,
    MainBeltComet, ShortPeriod, Sungrazer,
};

pub fn summary_line(comet: &GeneratedComet) -> String {
    match comet {
        GeneratedComet::ShortPeriod(c) => format!(
            "ShortPeriod  | R={:.0} m | a={:.2} AU | e={:.3} | q={:.2} AU | T_J={:.2}",
            c.nucleus_radius,
            c.semi_major_axis,
            c.eccentricity,
            c.perihelion(),
            c.tisserand_jupiter()
        ),
        GeneratedComet::LongPeriod(c) => format!(
            "LongPeriod   | R={:.0} m | a={:.0} AU | e={:.5} | q={:.2} AU | new={}",
            c.nucleus_radius,
            c.semi_major_axis,
            c.eccentricity,
            c.perihelion(),
            c.is_dynamically_new
        ),
        GeneratedComet::HalleyType(c) => format!(
            "HalleyType   | R={:.0} m | a={:.2} AU | e={:.3} | q={:.2} AU | retro={}",
            c.nucleus_radius,
            c.semi_major_axis,
            c.eccentricity,
            c.perihelion(),
            c.is_retrograde
        ),
        GeneratedComet::Sungrazer(c) => format!(
            "Sungrazer    | R={:.0} m | a={:.0} AU | e={:.5} | q={:.4} R☉ | group={:?}",
            c.nucleus_radius,
            c.semi_major_axis,
            c.eccentricity,
            c.perihelion_distance_solar_radii,
            c.group
        ),
        GeneratedComet::Interstellar(c) => format!(
            "Interstellar | R={:.0} m | e={:.3} | v∞={:.1} km/s | q={:.2} AU",
            c.nucleus_radius, c.eccentricity, c.excess_velocity, c.perihelion_distance
        ),
        GeneratedComet::MainBeltComet(c) => format!(
            "MainBeltComet| R={:.0} m | a={:.2} AU | e={:.3} | ice={:.1}%",
            c.nucleus_radius,
            c.semi_major_axis,
            c.eccentricity,
            c.ice_fraction * 100.0
        ),
        GeneratedComet::CentaurTransition(c) => format!(
            "CentaurTrans | R={:.0} m | a={:.1} AU | e={:.3} | CO={} | τ={:.0} Myr",
            c.nucleus_radius,
            c.semi_major_axis,
            c.eccentricity,
            c.co_driven,
            c.dynamical_lifetime_myr()
        ),
        GeneratedComet::Extinct(c) => format!(
            "Extinct      | R={:.0} m | a={:.2} AU | e={:.3} | mantle={:.1} m | state={:?}",
            c.nucleus_radius, c.semi_major_axis, c.eccentricity, c.mantle_thickness, c.state
        ),
    }
}

pub fn short_period_line(c: &ShortPeriod) -> String {
    summary_line(&GeneratedComet::ShortPeriod(
        ShortPeriod::new(c.nucleus_radius, c.semi_major_axis, c.eccentricity)
            .with_density(c.density)
            .with_albedo(c.albedo)
            .with_inclination(c.inclination)
            .with_dust_to_gas_ratio(c.dust_to_gas_ratio)
            .with_active_fraction(c.active_fraction),
    ))
}

pub fn long_period_line(c: &LongPeriod) -> String {
    summary_line(&GeneratedComet::LongPeriod(
        LongPeriod::new(c.nucleus_radius, c.semi_major_axis, c.eccentricity)
            .with_density(c.density)
            .with_inclination(c.inclination)
            .with_dynamically_new(c.is_dynamically_new),
    ))
}

pub fn halley_type_line(c: &HalleyType) -> String {
    summary_line(&GeneratedComet::HalleyType(
        HalleyType::new(c.nucleus_radius, c.semi_major_axis, c.eccentricity)
            .with_density(c.density)
            .with_inclination(c.inclination),
    ))
}

pub fn sungrazer_line(c: &Sungrazer) -> String {
    summary_line(&GeneratedComet::Sungrazer(
        Sungrazer::new(c.nucleus_radius, c.semi_major_axis, c.eccentricity)
            .with_density(c.density)
            .with_group(c.group),
    ))
}

pub fn interstellar_line(c: &Interstellar) -> String {
    summary_line(&GeneratedComet::Interstellar(
        Interstellar::new(c.nucleus_radius, c.excess_velocity, c.perihelion_distance)
            .with_density(c.density),
    ))
}

pub fn main_belt_comet_line(c: &MainBeltComet) -> String {
    summary_line(&GeneratedComet::MainBeltComet(
        MainBeltComet::new(c.nucleus_radius, c.semi_major_axis, c.eccentricity)
            .with_density(c.density)
            .with_ice_fraction(c.ice_fraction),
    ))
}

pub fn centaur_transition_line(c: &CentaurTransition) -> String {
    summary_line(&GeneratedComet::CentaurTransition(
        CentaurTransition::new(c.nucleus_radius, c.semi_major_axis, c.eccentricity)
            .with_density(c.density)
            .with_co_driven(c.co_driven),
    ))
}

pub fn extinct_line(c: &Extinct) -> String {
    summary_line(&GeneratedComet::Extinct(
        Extinct::new(c.nucleus_radius, c.semi_major_axis, c.eccentricity)
            .with_density(c.density)
            .with_mantle_thickness(c.mantle_thickness)
            .with_residual_ice(c.residual_ice_fraction),
    ))
}