mod field;
pub mod sentences;
pub use field::*;
pub use sentences::*;
use crate::NmeaFrame;
macro_rules! nmea_sentences {
(
standard: [ $( [$feat:literal, $variant:ident, $wire:literal] ),* $(,)? ],
proprietary: [ $( [$pfeat:literal, $pvariant:ident, $pwire:literal] ),* $(,)? ]
) => {
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq)]
pub enum NmeaSentence {
$(
#[cfg(feature = $feat)]
$variant(sentences::$variant),
)*
$(
#[cfg(feature = $pfeat)]
$pvariant(sentences::$pvariant),
)*
Unknown {
sentence_type: String,
fields: Vec<String>,
},
}
impl NmeaSentence {
pub fn parse(frame: &NmeaFrame<'_>) -> Self {
macro_rules! try_parse {
($parser:expr, $v:ident) => {
match $parser(&frame.fields) {
Some(v) => Self::$v(v),
None => unreachable!("parse() always returns Some for known sentence types"),
}
};
}
if frame.talker.is_empty() {
match frame.sentence_type {
$(
#[cfg(feature = $pfeat)]
$pwire => try_parse!(sentences::$pvariant::parse, $pvariant),
)*
_ => Self::from_frame(frame),
}
} else {
match frame.sentence_type {
$(
#[cfg(feature = $feat)]
$wire => try_parse!(sentences::$variant::parse, $variant),
)*
_ => Self::from_frame(frame),
}
}
}
fn from_frame(frame: &NmeaFrame<'_>) -> Self {
Self::Unknown {
sentence_type: frame.sentence_type.to_string(),
fields: frame.fields.iter().map(|f| f.to_string()).collect(),
}
}
}
};
}
nmea_sentences![
standard: [
["rmc", Rmc, "RMC"],
["gbs", Gbs, "GBS"],
["gsa", Gsa, "GSA"],
["gsv", Gsv, "GSV"],
["gst", Gst, "GST"],
["gga", Gga, "GGA"],
["gll", Gll, "GLL"],
["gns", Gns, "GNS"],
["mwd", Mwd, "MWD"],
["mwv", Mwv, "MWV"],
["hdt", Hdt, "HDT"],
["hdg", Hdg, "HDG"],
["hdm", Hdm, "HDM"],
["rot", Rot, "ROT"],
["ths", Ths, "THS"],
["apb", Apb, "APB"],
["bwc", Bwc, "BWC"],
["rmb", Rmb, "RMB"],
["xte", Xte, "XTE"],
["rsa", Rsa, "RSA"],
["vbw", Vbw, "VBW"],
["vlw", Vlw, "VLW"],
["vtg", Vtg, "VTG"],
["vhw", Vhw, "VHW"],
["rpm", Rpm, "RPM"],
["vdr", Vdr, "VDR"],
["dpt", Dpt, "DPT"],
["dbt", Dbt, "DBT"],
["dbs", Dbs, "DBS"],
["dbk", Dbk, "DBK"],
["mda", Mda, "MDA"],
["mtw", Mtw, "MTW"],
["xdr", Xdr, "XDR"],
["txt", Txt, "TXT"],
["zda", Zda, "ZDA"],
],
proprietary: [
["pashr", Pashr, "PASHR"],
["pgrme", Pgrme, "PGRME"],
["pskpdpt", Pskpdpt, "PSKPDPT"],
]
];