use crate::{Error, FixedField};
#[derive(Clone, Copy, PartialEq, PartialOrd, Debug)]
pub enum RwyBrg {
MagneticNorth(f32),
TrueNorth(u32),
}
impl FixedField<'_> for RwyBrg {
const LENGTH: usize = 4;
fn from_bytes(bytes: &'_ [u8]) -> Result<Self, Error> {
match bytes[3] {
b'T' => {
let deg = parse_numeric!(3, u32, bytes[0..3])?;
Ok(Self::TrueNorth(deg))
}
_ => {
let deg = parse_numeric!(4, u32, bytes[0..4])? as f32 / 10.0;
Ok(Self::MagneticNorth(deg))
}
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn parse_true_north() {
assert_eq!(RwyBrg::from_bytes(b"347T"), Ok(RwyBrg::TrueNorth(347)));
}
#[test]
fn parse_magnetic_north() {
assert_eq!(
RwyBrg::from_bytes(b"2302"),
Ok(RwyBrg::MagneticNorth(230.2))
);
}
}