use std::fmt::{Display, Formatter, Result};
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use crate::VerticalDistance;
#[repr(C)]
#[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum AirspaceClassification {
A,
B,
C,
D,
E,
F,
G,
}
#[repr(C)]
#[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum AirspaceType {
CTA,
CTR,
TMA,
Restricted,
Danger,
Prohibited,
TMZ,
RMZ,
RadarZone,
}
#[derive(Clone, PartialEq, Debug)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Airspace {
pub name: String,
pub airspace_type: AirspaceType,
pub classification: Option<AirspaceClassification>,
pub ceiling: VerticalDistance,
pub floor: VerticalDistance,
pub polygon: geo::Polygon<f64>,
}
impl Display for AirspaceClassification {
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
match self {
AirspaceClassification::A => write!(f, "A"),
AirspaceClassification::B => write!(f, "B"),
AirspaceClassification::C => write!(f, "C"),
AirspaceClassification::D => write!(f, "D"),
AirspaceClassification::E => write!(f, "E"),
AirspaceClassification::F => write!(f, "F"),
AirspaceClassification::G => write!(f, "G"),
}
}
}
impl Display for AirspaceType {
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
match self {
AirspaceType::CTA => write!(f, "CTA"),
AirspaceType::CTR => write!(f, "CTR"),
AirspaceType::TMA => write!(f, "TMA"),
AirspaceType::Restricted => write!(f, "Restricted"),
AirspaceType::Danger => write!(f, "Danger"),
AirspaceType::Prohibited => write!(f, "Prohibited"),
AirspaceType::TMZ => write!(f, "TMZ"),
AirspaceType::RMZ => write!(f, "RMZ"),
AirspaceType::RadarZone => write!(f, "Radar Zone"),
}
}
}
impl Display for Airspace {
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
match &self.classification {
Some(class) => write!(
f,
"{}: {} (Class {}) | {}/{}",
self.name, self.airspace_type, class, self.ceiling, self.floor
),
None => write!(
f,
"{}: {} | {}/{}",
self.name, self.airspace_type, self.ceiling, self.floor
),
}
}
}