libaprs-engine 2.6.0

Protocol-first APRS engine core primitives
Documentation
use libaprs_engine::{
    parse_packet,
    service::{
        DuplicateDecision, DuplicateWindow, PacketRateBudget, RateLimitDecision, SemanticBlocklist,
        SemanticFamily,
    },
    Engine,
};

fn main() -> Result<(), libaprs_engine::ParseError> {
    let mut engine = Engine::default();
    let mut duplicates = DuplicateWindow::new(128);
    let mut rate = PacketRateBudget::new(100);
    let blocked = SemanticBlocklist::new(&[SemanticFamily::Unsupported, SemanticFamily::Malformed]);

    for packet_bytes in [b"N0CALL>APRS:>service".as_slice()] {
        if rate.try_consume() == RateLimitDecision::Limited {
            continue;
        }
        if duplicates.observe(packet_bytes) == DuplicateDecision::Duplicate {
            continue;
        }

        let packet = parse_packet(packet_bytes)?;
        if blocked.rejects(&packet.aprs_data()) {
            continue;
        }

        let _event = engine.process_event(packet.raw().as_bytes());
    }

    Ok(())
}