use crate::{Error, FixedField};
#[derive(Clone, Copy, PartialEq, PartialOrd, Debug)]
pub enum MagVar {
East(f32),
West(f32),
OrientedToTrueNorth,
}
impl FixedField<'_> for MagVar {
const LENGTH: usize = 5;
fn from_bytes(bytes: &'_ [u8]) -> Result<Self, Error> {
let code = bytes[0];
let deg = || -> Result<f32, Error> {
Ok(parse_numeric!(4, u32, &bytes[1..5])? as f32 / 100.0) };
match code {
b'E' => Ok(Self::East(deg()?)),
b'W' => Ok(Self::West(deg()?)),
b'T' => Ok(Self::OrientedToTrueNorth),
_ => Err(Error::InvalidCharacter {
field: "Magnetic Variation",
byte: code,
expected: "E, W or T as variation direction",
}),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn parses_mag_var() {
let mag_var = MagVar::from_bytes(b"E0140");
assert_eq!(mag_var, Ok(MagVar::East(1.4)));
let mag_var = MagVar::from_bytes(b"W0410");
assert_eq!(mag_var, Ok(MagVar::West(4.1)));
let mag_var = MagVar::from_bytes(b"T0000");
assert_eq!(mag_var, Ok(MagVar::OrientedToTrueNorth));
}
}