use std::{
io::{self, Read, Write},
sync::atomic::{AtomicI32, Ordering},
};
use crate::error::Result;
use lazy_static::lazy_static;
pub(crate) fn next_request_id() -> i32 {
lazy_static! {
static ref REQUEST_ID: AtomicI32 = AtomicI32::new(0);
}
REQUEST_ID.fetch_add(1, Ordering::SeqCst)
}
pub(super) fn write_cstring<W: Write>(writer: &mut W, string: &str) -> Result<()> {
writer.write_all(string.as_bytes())?;
writer.write_all(&[0])?;
Ok(())
}
pub(super) struct CountReader<'a, R: 'a + Read> {
reader: &'a mut R,
bytes_read: usize,
}
impl<'a, R: 'a + Read> CountReader<'a, R> {
pub(super) fn new(reader: &'a mut R) -> Self {
CountReader {
reader,
bytes_read: 0,
}
}
pub(super) fn bytes_read(&self) -> usize {
self.bytes_read
}
}
impl<'a, R: 'a + Read> Read for CountReader<'a, R> {
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
let size = self.reader.read(buf)?;
self.bytes_read += size;
Ok(size)
}
}