use serde::{Deserialize, Serialize};
use crate::gpx::extensions::{PowerExtension, TrackExtension, TrackPointExtension};
#[derive(Debug, Clone, PartialEq, Default, Deserialize, Serialize)]
pub struct Extensions {
#[serde(rename = "TrackPointExtension", default, skip_serializing_if = "Option::is_none")]
pub track_point: Option<TrackPointExtension>,
#[serde(rename = "power", default, skip_serializing_if = "Option::is_none")]
pub power: Option<u16>,
#[serde(rename = "PowerExtension", default, skip_serializing_if = "Option::is_none")]
pub power_extension: Option<PowerExtension>,
#[serde(rename = "TrackExtension", default, skip_serializing_if = "Option::is_none")]
pub track: Option<TrackExtension>,
#[serde(default, rename = "$value", skip_serializing_if = "String::is_empty")]
pub inner_xml: String,
}
impl Extensions {
pub fn heart_rate(&self) -> Option<u8> {
self.track_point.as_ref()?.hr
}
pub fn cadence(&self) -> Option<u8> {
self.track_point.as_ref()?.cad
}
pub fn power_watts(&self) -> Option<u16> {
self.power
.or_else(|| self.power_extension.as_ref()?.power_in_watts)
}
pub fn is_empty(&self) -> bool {
self.track_point.is_none()
&& self.power.is_none()
&& self.power_extension.is_none()
&& self.track.is_none()
&& self.inner_xml.is_empty()
}
}