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),
))
}