use std::convert::TryFrom;
use std::fmt;
use std::hash::{Hash, Hasher};
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use crate::error::Error;
use crate::measurements::{Angle, Length};
use crate::VerticalDistance;
#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum RunwaySurface {
Asphalt,
Concrete,
Grass,
}
#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum RunwayConditionCode {
Six,
Five,
Four,
Three,
Two,
One,
Zero,
}
impl TryFrom<u8> for RunwayConditionCode {
type Error = Error;
fn try_from(value: u8) -> Result<RunwayConditionCode, Self::Error> {
match value {
6 => Ok(RunwayConditionCode::Six),
5 => Ok(RunwayConditionCode::Five),
4 => Ok(RunwayConditionCode::Four),
3 => Ok(RunwayConditionCode::Three),
2 => Ok(RunwayConditionCode::Two),
1 => Ok(RunwayConditionCode::One),
0 => Ok(RunwayConditionCode::Zero),
_ => Err(Error::InvalidRWYCC),
}
}
}
#[derive(Clone, PartialEq, Debug)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Runway {
pub designator: String,
pub bearing: Angle,
pub length: Length,
pub tora: Length,
pub toda: Length,
pub lda: Length,
pub surface: RunwaySurface,
pub slope: f32,
pub elev: VerticalDistance,
}
impl Hash for Runway {
fn hash<H: Hasher>(&self, state: &mut H) {
self.designator.hash(state);
self.bearing.hash(state);
self.length.hash(state);
self.tora.hash(state);
self.toda.hash(state);
self.lda.hash(state);
self.surface.hash(state);
self.slope.to_bits().hash(state);
self.elev.hash(state);
}
}
impl fmt::Display for Runway {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.designator)
}
}