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; }