pub struct LineTransport<'a> { /* private fields */ }Expand description
Line-oriented packet source for file/stdin style transports.
Implementations§
Source§impl<'a> LineTransport<'a>
impl<'a> LineTransport<'a>
Sourcepub fn new(input: &'a [u8]) -> Self
pub fn new(input: &'a [u8]) -> Self
Creates a transport over newline-separated packet bytes.
Examples found in repository?
examples/process_file.rs (line 16)
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}More examples
examples/service_ingest.rs (line 9)
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}Sourcepub fn packets(&self) -> Vec<&'a [u8]>
pub fn packets(&self) -> Vec<&'a [u8]>
Iterates packet lines without trailing CR/LF bytes.
Examples found in repository?
examples/process_file.rs (line 16)
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}Sourcepub fn packets_with_limit(&self, max_packet_len: usize) -> Result<Vec<&'a [u8]>>
pub fn packets_with_limit(&self, max_packet_len: usize) -> Result<Vec<&'a [u8]>>
Iterates packet lines while enforcing a per-packet byte limit.
The limit is applied after removing one trailing carriage return from CRLF-framed lines and before allocating owned packet copies.
Examples found in repository?
examples/service_ingest.rs (line 9)
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}Trait Implementations§
Source§impl<'a> Clone for LineTransport<'a>
impl<'a> Clone for LineTransport<'a>
Source§fn clone(&self) -> LineTransport<'a>
fn clone(&self) -> LineTransport<'a>
Returns a duplicate of the value. Read more
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreSource§impl<'a> Debug for LineTransport<'a>
impl<'a> Debug for LineTransport<'a>
Source§impl PacketSource for LineTransport<'_>
impl PacketSource for LineTransport<'_>
Source§impl<'a> PartialEq for LineTransport<'a>
impl<'a> PartialEq for LineTransport<'a>
impl<'a> Eq for LineTransport<'a>
impl<'a> StructuralPartialEq for LineTransport<'a>
Auto Trait Implementations§
impl<'a> Freeze for LineTransport<'a>
impl<'a> RefUnwindSafe for LineTransport<'a>
impl<'a> Send for LineTransport<'a>
impl<'a> Sync for LineTransport<'a>
impl<'a> Unpin for LineTransport<'a>
impl<'a> UnsafeUnpin for LineTransport<'a>
impl<'a> UnwindSafe for LineTransport<'a>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more