use std::time::Duration;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use crate::{
self as nmea0183_parser, NmeaParse,
nmea_content::{
Location, Quality,
parse::{location, with_unit},
},
};
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serde", serde(rename_all = "camelCase"))]
#[derive(Debug, Default, Clone, PartialEq, NmeaParse)]
pub struct GGA {
pub fix_time: Option<time::Time>,
#[nmea(parser(location))]
pub location: Option<Location>,
pub fix_quality: Quality,
pub satellite_count: Option<u8>,
pub hdop: Option<f32>,
#[nmea(parser(with_unit('M')))]
pub altitude: Option<f32>,
#[nmea(parser(with_unit('M')))]
pub geoidal_separation: Option<f32>,
#[nmea(map(|value| value.map(|sec| Duration::from_millis((sec * 1000.0) as u64))), parse_as(Option<f32>))]
pub age_of_dgps: Option<Duration>,
pub ref_station_id: Option<u16>,
}
#[cfg(test)]
mod tests {
use super::*;
use crate::IResult;
#[test]
fn test_gga_parsing() {
let cases = [",,", ",42.0,", ",,69", ",42.0,69"];
for &input in &cases {
let i = format!(
"001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M{}",
input
);
let result: IResult<_, _> = GGA::parse(i.as_str());
assert!(result.is_ok(), "Failed: {input:?}\n\t{result:?}");
}
let cases = ["", ",", ",42.0", "42.0"];
for &input in &cases {
let i = format!(
"001043.00,4404.14036,N,12118.85961,W,1,12,0.98,1113.0,M,-21.3,M{}",
input
);
let result: IResult<_, _> = GGA::parse(i.as_str());
assert!(result.is_err(), "Failed: {input:?}\n\t{result:?}");
}
}
}