use std::io::Write;
#[derive(Debug, Clone)]
pub struct BinWriter {
buffer: Vec<u8>,
}
impl BinWriter {
pub fn new() -> Self {
Self {
buffer: Vec::new(),
}
}
pub fn with_capacity(capacity: usize) -> Self {
Self {
buffer: Vec::with_capacity(capacity),
}
}
pub fn len(&self) -> usize {
self.buffer.len()
}
pub fn is_empty(&self) -> bool {
self.buffer.is_empty()
}
pub fn capacity(&self) -> usize {
self.buffer.capacity()
}
pub fn reserve(&mut self, additional: usize) {
self.buffer.reserve(additional);
}
pub fn clear(&mut self) {
self.buffer.clear();
}
#[inline]
pub fn write_byte(&mut self, byte: u8) {
self.buffer.push(byte);
}
#[inline]
pub fn write_bytes(&mut self, bytes: &[u8]) {
self.buffer.extend_from_slice(bytes);
}
#[inline]
pub fn write_str(&mut self, s: &str) {
self.buffer.extend_from_slice(s.as_bytes());
}
pub fn as_bytes(&self) -> &[u8] {
&self.buffer
}
pub fn as_bytes_mut(&mut self) -> &mut Vec<u8> {
&mut self.buffer
}
pub fn as_str(&self) -> &str {
std::str::from_utf8(&self.buffer).expect("BinWriter buffer contains invalid UTF-8")
}
pub fn into_vec(self) -> Vec<u8> {
self.buffer
}
pub fn into_string(self) -> Result<String, std::string::FromUtf8Error> {
String::from_utf8(self.buffer)
}
pub fn flush<W: Write>(&mut self, writer: &mut W) -> std::io::Result<()> {
writer.write_all(&self.buffer)?;
self.buffer.clear();
Ok(())
}
pub fn write_to<W: Write>(&self, writer: &mut W) -> std::io::Result<()> {
writer.write_all(&self.buffer)
}
}
impl Default for BinWriter {
fn default() -> Self {
Self::new()
}
}
impl From<BinWriter> for Vec<u8> {
fn from(writer: BinWriter) -> Self {
writer.into_vec()
}
}
impl AsRef<[u8]> for BinWriter {
fn as_ref(&self) -> &[u8] {
self.as_bytes()
}
}