use uom::{
si::f64::{Length, Ratio},
ConstZero,
};
use crate::model::{
state::{StateModel, StateModelError, StateVariable},
traversal::default::fieldname,
unit::UnitError,
};
#[derive(Clone, Debug)]
pub struct ElevationChange {
elevation: Length,
}
impl ElevationChange {
pub fn new(distance: Length, grade: Ratio) -> Result<ElevationChange, UnitError> {
let elevation = distance * grade;
Ok(ElevationChange { elevation })
}
pub fn add_elevation_to_state(
&self,
state: &mut [StateVariable],
state_model: &StateModel,
) -> Result<(), StateModelError> {
if self.elevation == Length::ZERO {
return Ok(());
}
let feature_name = if self.elevation < Length::ZERO {
fieldname::TRIP_ELEVATION_LOSS
} else {
fieldname::TRIP_ELEVATION_GAIN
};
state_model.add_distance(state, feature_name, &self.elevation)
}
}