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