#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use crate::fp::LegPerformance;
use crate::measurements::{Duration, Length};
use super::{Leg, LegFuel};
#[derive(Copy, Clone, Eq, PartialEq, Debug)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct TotalsToLeg {
dist: Length,
ete: Option<Duration>,
fuel: Option<LegFuel>,
}
impl TotalsToLeg {
pub fn new(leg: &Leg, perf: Option<&LegPerformance>) -> Self {
Self {
dist: *leg.dist(),
ete: leg.ete().cloned(),
fuel: perf.and_then(|p| leg.fuel(p)),
}
}
pub fn accumulate(&self, leg: &Leg, perf: Option<&LegPerformance>) -> Self {
let ete = match (self.ete, leg.ete()) {
(Some(a), Some(b)) => Some(a + *b),
_ => None,
};
let fuel = match (self.fuel, perf) {
(Some(a), Some(perf)) => leg.fuel(perf).map(|b| a + b),
_ => None,
};
Self {
dist: self.dist + *leg.dist(),
ete,
fuel,
}
}
pub fn dist(&self) -> &Length {
&self.dist
}
pub fn ete(&self) -> Option<&Duration> {
self.ete.as_ref()
}
pub fn fuel(&self) -> Option<&LegFuel> {
self.fuel.as_ref()
}
}