watermelon_proto/proto/decoder/
framed.rs

1use bytes::Bytes;
2
3use crate::proto::ServerOp;
4
5use super::{DecoderError, DecoderStatus};
6
7/// Decodes a frame of bytes into a [`ServerOp`].
8///
9/// # Errors
10///
11/// It returns an error in case the frame is incomplete or if a decoding error occurs.
12pub fn decode_frame(frame: &mut Bytes) -> Result<ServerOp, FrameDecoderError> {
13    let mut status = DecoderStatus::ControlLine { last_bytes_read: 0 };
14    match super::decode(&mut status, frame) {
15        Ok(Some(server_op)) => Ok(server_op),
16        Ok(None) => Err(FrameDecoderError::IncompleteFrame),
17        Err(err) => Err(FrameDecoderError::Decoder(err)),
18    }
19}
20
21#[derive(Debug, thiserror::Error)]
22pub enum FrameDecoderError {
23    #[error("incomplete frame")]
24    IncompleteFrame,
25    #[error("decoder error")]
26    Decoder(#[source] DecoderError),
27}