dwarfplanetsfactory 0.0.3

Dwarf planet factory — classify, build and catalogue dwarf planets of any type: Kuiper belt, scattered disk, plutino, cold classical, detached, binary, Ceres-type, and sednoid.
Documentation
use crate::types::binary_dwarf::BinaryDwarf;
use crate::types::ceres_type::CeresType;
use crate::types::cold_classical::ColdClassical;
use crate::types::detached::Detached;
use crate::types::kuiper_belt::KuiperBelt;
use crate::types::plutino::Plutino;
use crate::types::scattered_disk::ScatteredDisk;
use crate::types::sednoid::Sednoid;

pub fn summary_kuiper_belt(body: &KuiperBelt) -> String {
    format!(
        "KuiperBelt | R={:.0} m | a={:.2} AU | e={:.3} | ρ={:.0} kg/m³",
        body.radius, body.semi_major_axis, body.eccentricity, body.density
    )
}

pub fn summary_scattered_disk(body: &ScatteredDisk) -> String {
    format!(
        "ScatteredDisk | R={:.0} m | a={:.2} AU | e={:.3} | q={:.2} AU",
        body.radius,
        body.semi_major_axis,
        body.eccentricity,
        body.semi_major_axis * (1.0 - body.eccentricity)
    )
}

pub fn summary_plutino(body: &Plutino) -> String {
    format!(
        "Plutino | R={:.0} m | a={:.2} AU | e={:.3} | 2:3 resonance",
        body.radius, body.semi_major_axis, body.eccentricity
    )
}

pub fn summary_cold_classical(body: &ColdClassical) -> String {
    format!(
        "ColdClassical | R={:.0} m | a={:.2} AU | e={:.4} | i={:.2}°",
        body.radius, body.semi_major_axis, body.eccentricity, body.inclination
    )
}

pub fn summary_detached(body: &Detached) -> String {
    format!(
        "Detached | R={:.0} m | a={:.2} AU | e={:.3} | q={:.2} AU",
        body.radius,
        body.semi_major_axis,
        body.eccentricity,
        body.semi_major_axis * (1.0 - body.eccentricity)
    )
}

pub fn summary_binary_dwarf(body: &BinaryDwarf) -> String {
    format!(
        "BinaryDwarf | R1={:.0} m | R2={:.0} m | a={:.2} AU | sep={:.0} m",
        body.primary_radius, body.secondary_radius, body.semi_major_axis, body.mutual_separation
    )
}

pub fn summary_ceres_type(body: &CeresType) -> String {
    format!(
        "CeresType | R={:.0} m | a={:.2} AU | e={:.4} | ice={:.1}%",
        body.radius,
        body.semi_major_axis,
        body.eccentricity,
        body.ice_mantle_fraction * 100.0
    )
}

pub fn summary_sednoid(body: &Sednoid) -> String {
    format!(
        "Sednoid | R={:.0} m | a={:.1} AU | e={:.3} | q={:.1} AU",
        body.radius,
        body.semi_major_axis,
        body.eccentricity,
        body.semi_major_axis * (1.0 - body.eccentricity)
    )
}