Skip to main content

brec/packet/header/
write.rs

1use crate::*;
2
3/// Serializes a `PacketHeader` into the provided mutable buffer.
4///
5/// This function writes the following fields in order:
6/// - Signature: `[u8; 8]`
7/// - Size: `u64` (little-endian)
8/// - Blocks length: `u64` (little-endian)
9/// - Payload flag: `u8` (`1` if payload exists, `0` otherwise)
10/// - CRC: `u32` (little-endian)
11///
12/// # Arguments
13/// * `header` - Reference to the `PacketHeader` to serialize.
14/// * `buffer` - A mutable byte slice where the header will be written.
15///   Must be at least `PacketHeader::SIZE` bytes long.
16fn fill_buf(header: &PacketHeader, buffer: &mut [u8]) {
17    let mut offset = 0;
18    buffer[offset..offset + 8usize].copy_from_slice(&PACKET_SIG);
19    offset += 8usize;
20    buffer[offset..offset + 8usize].copy_from_slice(&header.size.to_le_bytes());
21    offset += 8usize;
22    buffer[offset..offset + 8usize].copy_from_slice(&header.blocks_len.to_le_bytes());
23    offset += 8usize;
24    buffer[offset..offset + 1usize].copy_from_slice(&[header.payload.into()]);
25    offset += 1;
26    buffer[offset..offset + 4usize].copy_from_slice(&header.crc.to_le_bytes());
27}
28
29impl WriteTo for PacketHeader {
30    /// Serializes and writes the `PacketHeader` into the given output stream.
31    ///
32    /// # Arguments
33    /// * `buf` - A writer implementing `std::io::Write`.
34    ///
35    /// # Returns
36    /// The number of bytes written (always `PacketHeader::SIZE`) on success.
37    ///
38    /// # Errors
39    /// Returns an `std::io::Error` if writing fails.
40    fn write<T: std::io::Write>(&self, buf: &mut T) -> std::io::Result<usize> {
41        let mut buffer = [0u8; PacketHeader::SIZE as usize];
42        fill_buf(self, &mut buffer);
43        buf.write(&buffer)
44    }
45
46    /// Writes the entire serialized `PacketHeader`, ensuring the full write completes.
47    ///
48    /// # Errors
49    /// Returns an `std::io::Error` if writing fails.
50    fn write_all<T: std::io::Write>(&self, buf: &mut T) -> std::io::Result<()> {
51        let mut buffer = [0u8; PacketHeader::SIZE as usize];
52        fill_buf(self, &mut buffer);
53        buf.write_all(&buffer)
54    }
55}