use alloc::vec::Vec;
use binrw::io::Write;
use hex::FromHex;
use crate::error::Result;
#[derive(Default)]
pub struct BeaconPack {
buffer: Vec<u8>,
size: u32,
}
impl BeaconPack {
pub fn getbuffer(&self) -> Result<Vec<u8>> {
let mut buf = Vec::with_capacity(4 + self.buffer.len());
buf.extend_from_slice(&self.size.to_le_bytes());
buf.extend_from_slice(&self.buffer);
Ok(buf)
}
pub fn get_buffer_hex(&self) -> Result<Vec<u8>> {
let buf = self.getbuffer()?;
Ok(Vec::from_hex(hex::encode(&buf))?)
}
pub fn addshort(&mut self, short: i16) {
self.write_i16(short);
self.size += 2;
}
pub fn addint(&mut self, int: i32) {
self.write_i32(int);
self.size += 4;
}
pub fn addstr(&mut self, s: &str) -> Result<()> {
let s_bytes = s.as_bytes();
let length = s_bytes.len() as u32 + 1;
self.write_u32(length);
self.buffer.write_all(s_bytes)?;
self.write_u8(0);
self.size += 4 + s_bytes.len() as u32 + 1;
Ok(())
}
pub fn addwstr(&mut self, s: &str) {
let s_wide: Vec<u16> = s.encode_utf16().collect();
let length = (s_wide.len() as u32 * 2) + 2;
self.write_u32(length);
for wchar in s_wide {
self.write_u16(wchar);
}
self.write_u16(0);
self.size += 4 + length;
}
pub fn addbin(&mut self, data: &[u8]) -> Result<()> {
let length = data.len() as u32;
self.write_u32(length);
self.buffer.write_all(data)?;
self.size += 4 + length;
Ok(())
}
pub fn reset(&mut self) {
self.buffer.clear();
self.size = 0;
}
}
impl BeaconPack {
fn write_u8(&mut self, value: u8) {
self.buffer.extend_from_slice(&value.to_le_bytes());
}
fn write_u16(&mut self, value: u16) {
self.buffer.extend_from_slice(&value.to_le_bytes());
}
fn write_i16(&mut self, value: i16) {
self.buffer.extend_from_slice(&value.to_le_bytes());
}
fn write_u32(&mut self, value: u32) {
self.buffer.extend_from_slice(&value.to_le_bytes());
}
fn write_i32(&mut self, value: i32) {
self.buffer.extend_from_slice(&value.to_le_bytes());
}
}