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}