use super::*;
#[derive(Clone, Debug, PartialEq, Serialize)]
pub struct MwvData {
pub wind_angle: Option<f64>,
pub relative: Option<bool>,
pub wind_speed_knots: Option<f64>,
pub wind_speed_kmh: Option<f64>,
}
pub(crate) fn handle(sentence: &str) -> Result<ParsedMessage, ParseError> {
let split: Vec<&str> = sentence.split(',').collect();
Ok(ParsedMessage::Mwv(MwvData {
wind_angle: pick_number_field(&split, 1)?,
relative: match pick_string_field(&split, 2)
.ok_or(ParseError::CorruptedSentence(
"pick string for \"relative\" was None".to_string(),
))?
.as_str()
{
"R" => Some(true),
"T" => Some(false),
_ => None,
},
wind_speed_knots: match pick_string_field(&split, 4)
.ok_or(ParseError::CorruptedSentence(
"pick string for \"wind_speed_knots\" was None".to_string(),
))?
.as_str()
{
"N" => pick_number_field(&split, 3)?,
"M" => Some(
pick_number_field::<f64>(&split, 3)?.ok_or(ParseError::CorruptedSentence(
"pick string for \"wind_speed_knots M\" was None".to_string(),
))? * 1.943844,
),
"K" => Some(
pick_number_field::<f64>(&split, 3)?.ok_or(ParseError::CorruptedSentence(
"pick string for \"wind_speed_knots K\" was None".to_string(),
))? * 0.539957,
),
_ => None,
},
wind_speed_kmh: match pick_string_field(&split, 4)
.ok_or(ParseError::CorruptedSentence(
"pick string for \"wind_speed_kmh\" was None".to_string(),
))?
.as_str()
{
"N" => Some(
pick_number_field::<f64>(&split, 3)?.ok_or(ParseError::CorruptedSentence(
"pick string for \"wind_speed_kmh N\" was None".to_string(),
))? * 1.852,
),
"M" => Some(
pick_number_field::<f64>(&split, 3)?.ok_or(ParseError::CorruptedSentence(
"pick string for \"wind_speed_kmh M\" was None".to_string(),
))? * 3.6,
),
"K" => pick_number_field(&split, 3)?,
_ => None,
},
}))
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_parse_mwv() {
match NmeaParser::new().parse_sentence("$WIMWV,295.4,T,33.3,N,A*1C") {
Ok(ps) => match ps {
ParsedMessage::Mwv(mwv) => {
assert_eq!(mwv.wind_angle, Some(295.4));
assert_eq!(mwv.relative, Some(false));
assert_eq!(mwv.wind_speed_knots, Some(33.3));
assert_eq!(mwv.wind_speed_kmh, Some(33.3 * 1.852));
}
_ => {
assert!(false);
}
},
Err(e) => {
assert_eq!(e.to_string(), "OK");
}
}
}
}