(&mut self, src: &mut BytesMut)
| 507 | type Error = CodecError; |
| 508 | |
| 509 | fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> { |
| 510 | if self.remaining_bytes > src.len() { |
| 511 | return Ok(None); |
| 512 | } |
| 513 | |
| 514 | match parse_message(src) { |
| 515 | Ok((remaining, message)) => { |
| 516 | let message = str::from_utf8(message)?.to_string(); |
| 517 | let len = src.len() - remaining.len(); |
| 518 | src.advance(len); |
| 519 | self.remaining_bytes = 0; |
| 520 | // Ignore empty frame |
| 521 | if message.is_empty() { |
| 522 | Ok(None) |
| 523 | } else { |
| 524 | Ok(Some(message)) |
| 525 | } |
| 526 | } |
| 527 | |
| 528 | Err(nom::Err::Incomplete(nom::Needed::Size(needed))) => { |
| 529 | self.remaining_bytes = needed.get(); |
| 530 | Ok(None) |
| 531 | } |
| 532 | |
| 533 | Err(nom::Err::Incomplete(nom::Needed::Unknown)) => Ok(None), |
| 534 | |
| 535 | Err(nom::Err::Error(err)) | Err(nom::Err::Failure(err)) => { |
| 536 | let code = err.code; |
| 537 | let parsed_bytes = src.len() - err.input.len(); |
| 538 | src.advance(parsed_bytes); |
| 539 | match find_next_message(src) { |
| 540 | Ok((_, position)) => src.advance(position), |
| 541 | Err(_) => src.advance(src.len()), |
| 542 | } |
| 543 | match code { |
| 544 | nom::error::ErrorKind::Digit | nom::error::ErrorKind::MapRes => { |
| 545 | Err(CodecError::InvalidLength) |
| 546 | } |
| 547 | nom::error::ErrorKind::Char | nom::error::ErrorKind::IsNot => { |
| 548 | Err(CodecError::InvalidType) |
| 549 | } |
| 550 | _ => Err(CodecError::MissingHeader), |
| 551 | } |
| 552 | } |
| 553 | } |
| 554 | } |
| 555 | } |
| 556 | |
| 557 | #[inline] |
nothing calls this directly
no test coverage detected