use astrodyn::simulation_builder::SimulationBuilder;
use crate::Simulation;
impl Simulation {
pub fn from_builder(
builder: SimulationBuilder,
) -> Result<Self, Vec<astrodyn::ValidationError>> {
let SimulationBuilder {
time,
dt,
atmosphere,
atmosphere_planet_source,
ephemeris,
polar_motion,
sun_source,
moon_source,
sources,
source_ephem_bodies,
bodies,
mass_tree_names,
mass_tree_attachments,
} = builder;
let mut sim = Simulation::new(time, dt);
sim.atmosphere = atmosphere;
sim.atmosphere_planet_source = atmosphere_planet_source;
sim.ephemeris = ephemeris;
sim.polar_motion = polar_motion;
sim.sun_source = sun_source;
sim.moon_source = moon_source;
for (i, (name, source)) in sources.into_iter().enumerate() {
sim.add_source(name, source);
if let Some(Some((target, observer))) = source_ephem_bodies.get(i) {
sim.set_source_ephemeris(i, *target, *observer);
}
}
for body in bodies {
sim.add_body(body);
}
let has_tree = mass_tree_names.iter().any(|n| n.is_some());
if has_tree {
for (idx, name) in mass_tree_names.into_iter().enumerate() {
if let Some(name) = name {
sim.add_body_to_tree(idx, name);
}
}
for att in mass_tree_attachments {
sim.attach_preserving_initial_state(
att.child_idx,
att.parent_idx,
att.offset,
att.t_parent_child,
);
}
}
sim.validate()?;
Ok(sim)
}
}
pub trait SimulationBuilderExt: Sized {
fn build(self) -> Result<Simulation, Vec<astrodyn::ValidationError>>;
}
impl SimulationBuilderExt for SimulationBuilder {
fn build(self) -> Result<Simulation, Vec<astrodyn::ValidationError>> {
Simulation::from_builder(self)
}
}