Skip to main content

ParsedPacket

Struct ParsedPacket 

Source
pub struct ParsedPacket { /* private fields */ }
Expand description

Structured packet view backed by the preserved raw packet bytes.

Implementations§

Source§

impl ParsedPacket

Source

pub fn raw(&self) -> &RawPacket

Returns the preserved raw packet.

Source

pub fn source(&self) -> &[u8]

Returns the source callsign bytes before the > separator.

Examples found in repository?
examples/parse_packet.rs (line 6)
3fn main() -> Result<(), libaprs_engine::ParseError> {
4    let packet = parse_packet(b"N0CALL>APRS:>hello")?;
5
6    println!("source={}", String::from_utf8_lossy(packet.source()));
7    println!(
8        "destination={}",
9        String::from_utf8_lossy(packet.destination())
10    );
11
12    if let AprsData::Status { text } = packet.aprs_data() {
13        println!("status={}", String::from_utf8_lossy(text));
14    }
15
16    Ok(())
17}
Source

pub fn path(&self) -> &[u8]

Returns the destination/path bytes between > and :.

Source

pub fn destination(&self) -> &[u8]

Returns the destination bytes, which are the first path component.

Examples found in repository?
examples/parse_packet.rs (line 9)
3fn main() -> Result<(), libaprs_engine::ParseError> {
4    let packet = parse_packet(b"N0CALL>APRS:>hello")?;
5
6    println!("source={}", String::from_utf8_lossy(packet.source()));
7    println!(
8        "destination={}",
9        String::from_utf8_lossy(packet.destination())
10    );
11
12    if let AprsData::Status { text } = packet.aprs_data() {
13        println!("status={}", String::from_utf8_lossy(text));
14    }
15
16    Ok(())
17}
Source

pub fn digipeaters(&self) -> Vec<&[u8]>

Returns digipeater path component byte views after the destination.

Source

pub fn path_components(&self) -> Vec<&[u8]>

Returns all path component byte views, including destination first.

Source

pub fn payload(&self) -> &[u8]

Returns the payload bytes after the : separator.

Source

pub fn data_type_identifier(&self) -> DataTypeIdentifier

Returns the APRS data type identifier from the first payload byte.

Source

pub fn information(&self) -> &[u8]

Returns payload bytes after the data type identifier.

Source

pub fn aprs_data(&self) -> AprsData<'_>

Returns a semantic view of the APRS information field.

Examples found in repository?
examples/parse_packet.rs (line 12)
3fn main() -> Result<(), libaprs_engine::ParseError> {
4    let packet = parse_packet(b"N0CALL>APRS:>hello")?;
5
6    println!("source={}", String::from_utf8_lossy(packet.source()));
7    println!(
8        "destination={}",
9        String::from_utf8_lossy(packet.destination())
10    );
11
12    if let AprsData::Status { text } = packet.aprs_data() {
13        println!("status={}", String::from_utf8_lossy(text));
14    }
15
16    Ok(())
17}
Source

pub fn summary(&self) -> PacketSummary<'_>

Returns a structured diagnostic summary for observability.

Examples found in repository?
examples/service_ingest.rs (line 17)
5fn main() -> Result<(), std::io::Error> {
6    let input = b"N0CALL>APRS:>service online\nN1CALL>APRS:~opaque\nbad packet\n";
7    let mut engine = Engine::new(Policy::strict());
8
9    let packets = LineTransport::new(input).packets_with_limit(MAX_PACKET_LEN)?;
10
11    for packet in packets {
12        match engine.process_event(packet) {
13            EngineEvent::Accepted(event) => {
14                println!(
15                    "event={} semantic={}",
16                    event.kind().code(),
17                    event.packet.summary().semantic
18                );
19            }
20            EngineEvent::Rejected(event) => {
21                println!(
22                    "event={} code={} remediation={}",
23                    event.kind().code(),
24                    event.diagnostic.code,
25                    event.diagnostic.remediation
26                );
27            }
28            EngineEvent::Malformed(event) => {
29                println!(
30                    "event={} code={} raw_len={} raw_truncated={} remediation={}",
31                    event.kind().code(),
32                    event.diagnostic.code,
33                    event.raw.len(),
34                    event.raw_truncated,
35                    event.diagnostic.remediation
36                );
37            }
38        }
39    }
40
41    let counters = engine.counters();
42    println!(
43        "summary accepted={} rejected={} malformed={}",
44        counters.accepted, counters.rejected, counters.malformed
45    );
46
47    Ok(())
48}
Source

pub fn to_json(&self) -> String

Serializes the parsed packet into a compact JSON diagnostic string.

Examples found in repository?
examples/process_file.rs (line 18)
7fn main() -> std::io::Result<()> {
8    let Some(path) = std::env::args().nth(1) else {
9        eprintln!("usage: process_file <packets.aprs>");
10        std::process::exit(2);
11    };
12
13    let input = read_all_with_limit(File::open(path)?, DEFAULT_TRANSPORT_READ_LIMIT)?;
14    let mut engine = Engine::new(Policy::strict());
15
16    for packet_bytes in LineTransport::new(&input).packets() {
17        match engine.process(packet_bytes) {
18            EngineResult::Accepted { packet } => println!("{}", packet.to_json()),
19            EngineResult::Rejected { reason, .. } => eprintln!("rejected: {}", reason.code()),
20            EngineResult::ParseError(error) => eprintln!("malformed: {}", error.code()),
21        }
22    }
23
24    Ok(())
25}

Trait Implementations§

Source§

impl Clone for ParsedPacket

Source§

fn clone(&self) -> ParsedPacket

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ParsedPacket

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for ParsedPacket

Source§

fn eq(&self, other: &ParsedPacket) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Eq for ParsedPacket

Source§

impl StructuralPartialEq for ParsedPacket

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.