X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=src%2Fslip.rs;h=a38239254df59350d42a8691e4cd33ffbe2453cb;hb=a636bf27a51f2ed6f079a91b862835d3708202d3;hp=3903636602f0166b32ba05d7ece8977963f757fd;hpb=c4628289c1dc0f321515b0104d2c47219ed32c9b;p=hippotat.git diff --git a/src/slip.rs b/src/slip.rs index 3903636..a382392 100644 --- a/src/slip.rs +++ b/src/slip.rs @@ -36,7 +36,7 @@ pub fn checkn( mut out: OUT, mut error_handler: EH ) where AC: Fn(&[u8]) -> Result<(), PacketError> + Copy, - OUT: FnMut(Box<[u8]>), + OUT: FnMut(Box<[u8]>) -> Result<(), PacketError>, EH: FnMut(PacketError), { // eprintln!("before: {:?}", DumpHex(data)); @@ -44,10 +44,15 @@ pub fn checkn( let mut ok = false; let mut err = false; for packet in data.split(|&c| c == SLIP_END) { - match check1(mime, mtu, packet, addr_chk) { - Err(PacketError::Empty) => { } + match (||{ + let packet = check1(mime, mtu, packet, addr_chk); + if matches!(packet, Err(PacketError::Empty)) { return Ok::<_,PE>(()) } + out(packet?)?; + ok = true; + Ok::<_,PE>(()) + })() { + Ok(()) => { }, Err(e) => { err=true; error_handler(e); }, - Ok(packet) => { ok=true; out(packet); }, } } // eprintln!(" after: {:?}", DumpHex(data));