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(packet) {
13 EngineResult::Accepted { packet } => {
14 println!("accepted semantic={}", packet.summary().semantic);
15 }
16 EngineResult::Rejected { reason, .. } => {
17 let diagnostic = reason.diagnostic();
18 println!(
19 "rejected code={} remediation={}",
20 diagnostic.code, diagnostic.remediation
21 );
22 }
23 EngineResult::ParseError(error) => {
24 let diagnostic = error.diagnostic();
25 println!(
26 "malformed code={} remediation={}",
27 diagnostic.code, diagnostic.remediation
28 );
29 }
30 }
31 }
32
33 let counters = engine.counters();
34 println!(
35 "summary accepted={} rejected={} malformed={}",
36 counters.accepted, counters.rejected, counters.malformed
37 );
38
39 Ok(())
40}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(packet) {
13 EngineResult::Accepted { packet } => {
14 println!("accepted semantic={}", packet.summary().semantic);
15 }
16 EngineResult::Rejected { reason, .. } => {
17 let diagnostic = reason.diagnostic();
18 println!(
19 "rejected code={} remediation={}",
20 diagnostic.code, diagnostic.remediation
21 );
22 }
23 EngineResult::ParseError(error) => {
24 let diagnostic = error.diagnostic();
25 println!(
26 "malformed code={} remediation={}",
27 diagnostic.code, diagnostic.remediation
28 );
29 }
30 }
31 }
32
33 let counters = engine.counters();
34 println!(
35 "summary accepted={} rejected={} malformed={}",
36 counters.accepted, counters.rejected, counters.malformed
37 );
38
39 Ok(())
40}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