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}