1#![cfg_attr(not(feature = "wasm"), forbid(unsafe_code))]
19#![warn(missing_docs)]
20#![doc = include_str!("../README.md")]
21
22#[cfg(feature = "ballistics")]
23pub mod ballistics;
24#[cfg(any(feature = "cli", feature = "wasm"))]
25pub mod command;
26mod error;
27mod flight;
28mod guidance;
29mod motor;
30#[cfg(feature = "wasm")]
31pub mod wasm;
32
33pub use error::{Error, Result};
34pub use flight::{
35 AltitudeSwitch, CentralGravity, FlightState, ForceModel, IntegratorSettings, Simulator,
36 StepResult, UniformGravity, EARTH_MU_M3_S2,
37};
38pub use guidance::{ControlInput, FixedDirection, Guidance, GuidanceContext};
39pub use motor::{
40 Motor, MotorPhase, MotorSample, Rocket, RocketSample, Stage, ThrustCurve, ThrustPoint,
41};
42
43pub type Vec3 = nalgebra::Vector3<f64>;
45
46pub(crate) fn finite_vec(value: &Vec3) -> bool {
47 value.iter().all(|x| x.is_finite())
48}
49
50pub(crate) fn nonnegative(value: f64, field: &'static str) -> Result<()> {
51 if !value.is_finite() || value < 0.0 {
52 return Err(Error::invalid(field, "must be finite and nonnegative"));
53 }
54 Ok(())
55}
56
57pub(crate) fn positive(value: f64, field: &'static str) -> Result<()> {
58 if !value.is_finite() || value <= 0.0 {
59 return Err(Error::invalid(field, "must be finite and positive"));
60 }
61 Ok(())
62}