Skip to main content

nmea_kit/
lib.rs

1#![cfg_attr(
2    not(test),
3    deny(
4        clippy::panic,
5        clippy::expect_used,
6        clippy::todo,
7        clippy::unimplemented,
8        clippy::unreachable
9    )
10)]
11//! # nmea-kit
12//!
13//! Bidirectional NMEA 0183 parser/encoder with AIS decoding and transponder-message encoding.
14//!
15//! ## Architecture
16//!
17//! ```text
18//! raw line ──→ parse_frame() ──→ NmeaFrame { prefix, talker, sentence_type, fields }
19//!                                     │
20//!                      ┌──────────────┼──────────────┐
21//!                      ▼              ▼               ▼
22//!                $ + known      $ + unknown     ! AIVDM/AIVDO     AIS app sentences
23//!                      │              │               │              │
24//!                      ▼              ▼               ▼              ▼
25//!               Typed struct    Raw fields      AisMessage enum   AIS sentence struct
26//! ```
27//!
28//! ## Public API
29//!
30//! - [`parse_frame`] / [`encode_frame`] — frame layer (always available)
31//! - [`NmeaSentence`] — dispatch enum for all typed NMEA sentences
32//! - [`NmeaEncodable`] — trait for encoding NMEA sentences to wire format
33//! - [`ais`] — AIS decoder, transponder-message encoder, and `!`-prefixed AIS application sentences
34//!
35//! ## Features
36//!
37//! - `nmea` (default) — all 80 NMEA sentence types
38//! - `ais` (default) — decoding for all numeric AIS Types 1-27, encoder support for Types 1/2/3, 4, 5, 9, 11, 12, 14, 18, 19, 21, 24 and 27, plus ABM/BBM application sentences
39//! - `dbs`, `dbt`, `dpt`, … — individual sentence types
40
41mod error;
42mod frame;
43
44// Single source of truth for the "any NMEA sentence feature is active" predicate.
45// Add new sentence feature names here when wiring a new type.
46macro_rules! nmea_item {
47    ($item:item) => {
48        #[cfg(any(
49            feature = "nmea",
50            feature = "aam",
51            feature = "ack",
52            feature = "acn",
53            feature = "ala",
54            feature = "alc",
55            feature = "alf",
56            feature = "alr",
57            feature = "arc",
58            feature = "apb",
59            feature = "bec",
60            feature = "bod",
61            feature = "bwc",
62            feature = "bwr",
63            feature = "bww",
64            feature = "dbk",
65            feature = "dbs",
66            feature = "dbt",
67            feature = "dor",
68            feature = "dpt",
69            feature = "dsc",
70            feature = "dse",
71            feature = "dtm",
72            feature = "eve",
73            feature = "fir",
74            feature = "gbs",
75            feature = "gga",
76            feature = "gll",
77            feature = "gns",
78            feature = "gsa",
79            feature = "gsv",
80            feature = "gst",
81            feature = "hbt",
82            feature = "hdg",
83            feature = "hdm",
84            feature = "hdt",
85            feature = "hsc",
86            feature = "mda",
87            feature = "mta",
88            feature = "mtw",
89            feature = "mwd",
90            feature = "mwv",
91            feature = "osd",
92            feature = "pashr",
93            feature = "pcdin",
94            feature = "pgrme",
95            feature = "pgrmt",
96            feature = "phtro",
97            feature = "pklid",
98            feature = "pklds",
99            feature = "pklsh",
100            feature = "pknds",
101            feature = "prdid",
102            feature = "pskpdpt",
103            feature = "rmb",
104            feature = "rmc",
105            feature = "rot",
106            feature = "rpm",
107            feature = "rsa",
108            feature = "rsd",
109            feature = "rte",
110            feature = "ths",
111            feature = "tll",
112            feature = "tlb",
113            feature = "ttd",
114            feature = "ttm",
115            feature = "txt",
116            feature = "vbw",
117            feature = "vdr",
118            feature = "vhw",
119            feature = "vlw",
120            feature = "vpw",
121            feature = "vtg",
122            feature = "vwr",
123            feature = "vwt",
124            feature = "vsd",
125            feature = "wcv",
126            feature = "wpl",
127            feature = "xdr",
128            feature = "xte",
129            feature = "zda",
130        ))]
131        $item
132    };
133}
134
135nmea_item! { pub mod nmea; }
136
137#[cfg(any(feature = "ais", feature = "abm", feature = "bbm"))]
138pub mod ais;
139
140pub use error::*;
141pub use frame::*;
142
143nmea_item! { pub use nmea::NmeaSentence; }
144nmea_item! { pub use nmea::NmeaEncodable; }