nmea_0183/messages/
gst.rs1use crate::fields::distance::*;
2use crate::fields::time::*;
3use chrono::naive::NaiveTime;
4use nom::sequence::tuple;
5use nom::IResult;
6
7#[derive(Debug, PartialEq)]
8pub struct GSTMessage {
10 pub time: Option<NaiveTime>,
12 pub range_rms: Option<Meter>,
14 pub std_major: Option<Meter>,
16 pub std_minor: Option<Meter>,
18 pub orient: Option<Degree>,
20 pub std_lat: Option<Meter>,
22 pub std_lon: Option<Meter>,
24 pub std_alt: Option<Meter>,
26}
27
28pub fn parse_gst(input: &str) -> IResult<&str, GSTMessage> {
29 let (remaining, (time, range_rms, std_major, std_minor, orient, std_lat, std_lon, std_alt)) =
30 tuple((
31 parse_time,
32 parse_meter,
33 parse_meter,
34 parse_meter,
35 parse_degree,
36 parse_meter,
37 parse_meter,
38 parse_meter,
39 ))(input)?;
40 Ok((
41 remaining,
42 GSTMessage {
43 time,
44 range_rms,
45 std_major,
46 std_minor,
47 orient,
48 std_lat,
49 std_lon,
50 std_alt,
51 },
52 ))
53}
54
55#[cfg(test)]
56mod tests {
57 use super::*;
58
59 #[test]
60 fn test_parse_gst() {
61 let input = "082356.00,1.8,,,,1.7,1.3,2.2";
62 let expected = Ok((
63 "",
64 GSTMessage {
65 time: Some(NaiveTime::from_hms(08, 23, 56)),
66 range_rms: Some(Meter(1.8)),
67 std_major: None,
68 std_minor: None,
69 orient: None,
70 std_lat: Some(Meter(1.7)),
71 std_lon: Some(Meter(1.3)),
72 std_alt: Some(Meter(2.2)),
73 },
74 ));
75
76 assert_eq!(expected, parse_gst(input));
77 }
78}