Skip to main content

nmea_kit/
lib.rs

1//! # nmea-kit
2//!
3//! Bidirectional NMEA 0183 parser/encoder with AIS message decoding.
4//!
5//! ## Architecture
6//!
7//! ```text
8//! raw line ──→ parse_frame() ──→ NmeaFrame { prefix, talker, sentence_type, fields }
9//!                                     │
10//!                      ┌──────────────┼──────────────┐
11//!                      ▼              ▼               ▼
12//!                $ + known      $ + unknown     ! (AIVDM/AIVDO)
13//!                      │              │               │
14//!                      ▼              ▼               ▼
15//!               Typed struct    Raw fields      AisMessage enum
16//! ```
17//!
18//! ## Public API
19//!
20//! - [`parse_frame`] / [`encode_frame`] — frame layer (always available)
21//! - [`NmeaSentence`] — dispatch enum for all typed NMEA sentences
22//! - [`NmeaEncodable`] — trait for encoding NMEA sentences to wire format
23//! - [`ais`] — AIS decoder (behind `ais` feature)
24//!
25//! ## Features
26//!
27//! - `nmea` (default) — all 44 NMEA sentence types
28//! - `ais` (default) — 16 AIS message types (read-only decode)
29//! - `dbs`, `dbt`, `dpt`, … — individual sentence types
30
31mod error;
32mod frame;
33
34// Single source of truth for the "any NMEA sentence feature is active" predicate.
35// Add new sentence feature names here when wiring a new type.
36macro_rules! nmea_item {
37    ($item:item) => {
38        #[cfg(any(
39            feature = "nmea",
40            feature = "aam",
41            feature = "apb",
42            feature = "bod",
43            feature = "bwc",
44            feature = "bwr",
45            feature = "bww",
46            feature = "dbk",
47            feature = "dbs",
48            feature = "dbt",
49            feature = "dpt",
50            feature = "dtm",
51            feature = "gbs",
52            feature = "gga",
53            feature = "gll",
54            feature = "gns",
55            feature = "gsa",
56            feature = "gsv",
57            feature = "gst",
58            feature = "hdg",
59            feature = "hdm",
60            feature = "hdt",
61            feature = "mda",
62            feature = "mtw",
63            feature = "mwd",
64            feature = "mwv",
65            feature = "pashr",
66            feature = "pgrme",
67            feature = "pskpdpt",
68            feature = "rmb",
69            feature = "rmc",
70            feature = "rot",
71            feature = "rpm",
72            feature = "rsa",
73            feature = "rsd",
74            feature = "ths",
75            feature = "tll",
76            feature = "ttm",
77            feature = "txt",
78            feature = "vbw",
79            feature = "vdr",
80            feature = "vhw",
81            feature = "vlw",
82            feature = "vtg",
83            feature = "vwr",
84            feature = "vwt",
85            feature = "wcv",
86            feature = "wpl",
87            feature = "xdr",
88            feature = "xte",
89            feature = "zda",
90        ))]
91        $item
92    };
93}
94
95nmea_item! { pub mod nmea; }
96
97#[cfg(feature = "ais")]
98pub mod ais;
99
100pub use error::*;
101pub use frame::*;
102
103nmea_item! { pub use nmea::NmeaSentence; }
104nmea_item! { pub use nmea::NmeaEncodable; }