tiberius/tds/codec/
packet.rs

1use super::{Decode, Encode, PacketHeader, PacketStatus, HEADER_BYTES};
2use bytes::BytesMut;
3
4#[derive(Debug)]
5pub struct Packet {
6    pub(crate) header: PacketHeader,
7    pub(crate) payload: BytesMut,
8}
9
10impl Packet {
11    pub(crate) fn new(header: PacketHeader, payload: BytesMut) -> Self {
12        Self { header, payload }
13    }
14
15    pub(crate) fn is_last(&self) -> bool {
16        self.header.status() == PacketStatus::EndOfMessage
17    }
18
19    pub(crate) fn into_parts(self) -> (PacketHeader, BytesMut) {
20        (self.header, self.payload)
21    }
22}
23
24impl Encode<BytesMut> for Packet {
25    fn encode(self, dst: &mut BytesMut) -> crate::Result<()> {
26        let size = (self.payload.len() as u16 + HEADER_BYTES as u16).to_be_bytes();
27
28        self.header.encode(dst)?;
29        dst.extend(self.payload);
30
31        dst[2] = size[0];
32        dst[3] = size[1];
33
34        Ok(())
35    }
36}
37
38impl Decode<BytesMut> for Packet {
39    fn decode(src: &mut BytesMut) -> crate::Result<Self> {
40        Ok(Self {
41            header: PacketHeader::decode(src)?,
42            payload: src.split(),
43        })
44    }
45}
46
47impl Extend<u8> for Packet {
48    fn extend<T: IntoIterator<Item = u8>>(&mut self, iter: T) {
49        self.payload.extend(iter)
50    }
51}
52
53impl<'a> Extend<&'a u8> for Packet {
54    fn extend<T: IntoIterator<Item = &'a u8>>(&mut self, iter: T) {
55        self.payload.extend(iter)
56    }
57}