1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
//! [APRS] message parser for [Rust]
//!
//! [APRS]: http://www.aprs.org/
//! [Rust]: https://www.rust-lang.org/
//!
//! # Usage
//!
//! ```rust
//! extern crate aprs_parser;
//!
//! use aprs_parser::{AprsCst, AprsData, AprsPacket, AprsPosition, Callsign, Latitude, Longitude, Timestamp};
//!
//! fn main() {
//! let result = aprs_parser::parse(
//! br"ICA3D17F2>APRS,qAS,dl4mea:/074849h4821.61N\01224.49E^322/103/A=003054"
//! );
//!
//! assert_eq!(
//! result,
//! Ok(
//! AprsPacket {
//! from: Callsign {
//! call: "ICA3D17F2".to_string(),
//! ssid: None
//! },
//! to: Callsign {
//! call: "APRS".to_string(),
//! ssid: None
//! },
//! via: vec![
//! Callsign {
//! call: "qAS".to_string(),
//! ssid: None
//! },
//! Callsign {
//! call: "dl4mea".to_string(),
//! ssid: None
//! }
//! ],
//! data: AprsData::Position(
//! AprsPosition {
//! timestamp: Some(
//! Timestamp::HHMMSS(
//! 7,
//! 48,
//! 49
//! )
//! ),
//! messaging_supported: false,
//! latitude: Latitude::new(48.36016666666667).unwrap(),
//! longitude: Longitude::new(12.408166666666666).unwrap(),
//! symbol_table: '\\',
//! symbol_code: '^',
//! comment: b"322/103/A=003054".to_vec(),
//! cst: AprsCst::Uncompressed,
//! }
//! )
//! }
//! )
//! );
//! }
//! ```
// `!(-90. ..=90.).contains(&value)` seems worse than `value > 90. || value < -90.`
#![allow(clippy::manual_range_contains)]
extern crate thiserror;
#[cfg(test)]
#[macro_use]
extern crate approx;
mod base91;
mod bytes;
mod callsign;
mod compressed_cs;
mod compression_type;
mod error;
mod lonlat;
mod message;
mod packet;
mod position;
mod timestamp;
use std::convert::TryFrom;
pub use callsign::Callsign;
pub use compressed_cs::{AprsAltitude, AprsCompressedCs, AprsCourseSpeed, AprsRadioRange};
pub use compression_type::AprsCompressionType;
pub use error::{AprsError, EncodeError};
pub use lonlat::{Latitude, Longitude};
pub use message::AprsMessage;
pub use packet::{AprsData, AprsPacket};
pub use position::{AprsCst, AprsPosition};
pub use timestamp::Timestamp;
pub fn parse(b: &[u8]) -> Result<AprsPacket, AprsError> {
AprsPacket::try_from(b)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn overall() {
let original =
&b"ICA3D17F2>Aprs,qAS,dl4mea::DEST :Hello World! This msg has a : colon {3a2B975"[..];
let mut buf = vec![];
parse(original).unwrap().encode(&mut buf).unwrap();
assert_eq!(original, &buf);
}
}