use super::{Field, FieldError, Latitude, Longitude};
use std::str::FromStr;
#[derive(Debug, PartialEq)]
pub enum MagVar<const I: usize, const J: usize, const K: usize> {
East(u8, u8),
West(u8, u8),
OrientedToTrueNorth,
WMM(Latitude<J>, Longitude<K>),
}
impl<const I: usize, const J: usize, const K: usize> Field for MagVar<I, J, K> {}
impl<const I: usize, const J: usize, const K: usize> FromStr for MagVar<I, J, K> {
type Err = FieldError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
let first_column = &s[I..I + 1];
match first_column {
"E" | "W" => {
let degree: u8 = s[I + 1..I + 4]
.parse()
.map_err(|_| FieldError::NotANumber)?;
let centidegree: u8 = s[I + 4..I + 5]
.parse()
.map_err(|_| FieldError::NotANumber)?;
if first_column == "E" {
Ok(Self::East(degree, centidegree))
} else {
Ok(Self::West(degree, centidegree))
}
}
"T" => Ok(Self::OrientedToTrueNorth),
" " => Ok(Self::WMM(s.parse()?, s.parse()?)), _ => Err(FieldError::UnexpectedChar(
"expected E, W or T as variation direction",
)),
}
}
}