use bytes::{Bytes, BytesMut};
pub struct FixedBuffer {
buffer: BytesMut,
capacity: usize,
truncated: bool,
}
impl FixedBuffer {
pub fn new(capacity: usize) -> Self {
FixedBuffer {
buffer: BytesMut::new(),
capacity,
truncated: false,
}
}
pub fn write_to_buffer(&mut self, data: &Bytes) {
if self.truncated {
return;
}
if self.buffer.len() + data.len() <= self.capacity {
self.buffer.extend_from_slice(data);
} else {
self.buffer = BytesMut::new();
self.truncated = true;
}
}
pub fn clear(&mut self) {
self.truncated = false;
self.buffer.clear();
}
pub fn is_empty(&self) -> bool {
self.buffer.len() == 0
}
pub fn is_truncated(&self) -> bool {
self.truncated
}
pub fn get_buffer(&self) -> Option<Bytes> {
if !self.is_empty() {
Some(self.buffer.clone().freeze())
} else {
None
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn releases_storage_when_truncated() {
let mut buffer = FixedBuffer::new(4);
buffer.write_to_buffer(&Bytes::from_static(b"1234"));
assert!(buffer.buffer.capacity() >= 4);
buffer.write_to_buffer(&Bytes::from_static(b"5"));
assert!(buffer.is_truncated());
assert_eq!(buffer.buffer.capacity(), 0);
assert!(buffer.get_buffer().is_none());
}
}