fn decode_frame()

in netbench/src/multiplex/frame.rs [103:171]


    fn decode_frame<B: Buf>(&mut self, buf: &mut B, tag: Tag) -> Result<Option<Frame>> {
        match tag {
            Tag::StreamOpen => {
                if buf.remaining() < (size_of::<u64>() + size_of::<u8>()) {
                    self.tag = Some(tag);
                    return Ok(None);
                }

                let id = buf.get_u64();
                let bidirectional = buf.get_u8() != 0;

                Ok(Some(Frame::StreamOpen { id, bidirectional }))
            }
            Tag::StreamData => {
                if buf.remaining() < (size_of::<u64>() + size_of::<u8>() + size_of::<u32>()) {
                    self.tag = Some(tag);
                    return Ok(None);
                }

                let id = buf.get_u64();
                let owner = Self::decode_owner(buf)?;
                let len = buf.get_u32();
                self.decode_stream(buf, id, owner, len as _)
            }
            Tag::StreamFinish => {
                if buf.remaining() < (size_of::<u64>() + size_of::<u8>()) {
                    self.tag = Some(tag);
                    return Ok(None);
                }

                let id = buf.get_u64();
                let owner = Self::decode_owner(buf)?;

                Ok(Some(Frame::StreamFinish { id, owner }))
            }
            Tag::MaxStreams => {
                if buf.remaining() < size_of::<u64>() {
                    self.tag = Some(tag);
                    return Ok(None);
                }

                let up_to = buf.get_u64();

                Ok(Some(Frame::MaxStreams { up_to }))
            }
            Tag::MaxStreamData => {
                if buf.remaining() < (size_of::<u64>() + size_of::<u8>() + size_of::<u64>()) {
                    self.tag = Some(tag);
                    return Ok(None);
                }

                let id = buf.get_u64();
                let owner = Self::decode_owner(buf)?;
                let up_to = buf.get_u64();

                Ok(Some(Frame::MaxStreamData { id, owner, up_to }))
            }
            Tag::InitialMaxStreamData => {
                if buf.remaining() < (size_of::<u64>()) {
                    self.tag = Some(tag);
                    return Ok(None);
                }

                let up_to = buf.get_u64();

                Ok(Some(Frame::InitialMaxStreamData { up_to }))
            }
        }
    }