use crate::{Error, FixedField};
#[derive(Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
pub enum LowerUpperLimit {
Altitude(u32),
FlightLevel(u16),
NotSpecified,
Unlimited,
Ground,
MeanSeaLevel,
NOTAM,
}
impl FixedField<'_> for LowerUpperLimit {
const LENGTH: usize = 5;
fn from_bytes(bytes: &'_ [u8]) -> Result<Self, Error> {
match &bytes[..Self::LENGTH] {
[b'F', b'L', d @ ..] if d.iter().all(u8::is_ascii_digit) => {
let fl = parse_numeric!(3, u16, d)?;
Ok(Self::FlightLevel(fl))
}
digits if digits.iter().all(u8::is_ascii_digit) => {
let alt = parse_numeric!(5, u32, digits)?;
Ok(Self::Altitude(alt))
}
b"NOTSP" => Ok(Self::NotSpecified),
b"UNLTD" => Ok(Self::Unlimited),
b"GND " => Ok(Self::Ground),
b"MSL " => Ok(Self::MeanSeaLevel),
b"NOTAM" => Ok(Self::NOTAM),
bytes => Err(Error::InvalidVariant {
field: "Lower/Upper Limit",
bytes: bytes.to_vec(),
expected: "according to ARINC 424-23 5.121",
}),
}
}
}