#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use super::*;
use geo::Point;
pub type Waypoints = Vec<Waypoint>;
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum WaypointUsage {
VFROnly,
Unknown,
}
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum Region {
Enroute,
TerminalArea([u8; 4]),
}
#[derive(Clone, PartialEq, Debug)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Waypoint {
pub(crate) fix_ident: String,
pub(crate) desc: String,
pub(crate) usage: WaypointUsage,
pub(crate) coordinate: Point<f64>,
pub(crate) mag_var: Option<MagneticVariation>,
pub(crate) region: Region,
pub(crate) location: Option<LocationIndicator>,
pub(crate) cycle: Option<AiracCycle>,
}
impl Waypoint {
pub(crate) fn terminal_area(&self) -> Option<&str> {
match self.region {
Region::TerminalArea(ref ident) => {
Some(str::from_utf8(ident).expect("ident should be valid UTF-8"))
}
_ => None,
}
}
}
impl Fix for Waypoint {
fn ident(&self) -> String {
self.fix_ident.clone()
}
fn coordinate(&self) -> Point<f64> {
self.coordinate
}
}