use crate::{data_file::DataFile, error::Error};
use std::io::SeekFrom;
use tokio::io::{AsyncReadExt, AsyncSeekExt, AsyncWriteExt};
impl DataFile {
pub async fn seek(&mut self, offset: usize) -> Result<(), Error> {
self.file.seek(SeekFrom::Start(offset as u64)).await?;
Ok(())
}
pub async fn flush(&mut self) -> Result<(), Error> {
self.file.flush().await?;
Ok(())
}
pub async fn truncate(&mut self, length: usize) -> Result<(), Error> {
self.file.set_len(length as u64).await?;
Ok(())
}
pub async fn read_chunk(&mut self, offset: usize, padding: usize) -> Result<Vec<u8>, Error> {
self.seek(offset).await?;
let mut buffer = vec![0; self.options_store.chunk_size() - padding];
self.file.read_exact(&mut buffer).await?;
Ok(buffer)
}
pub async fn read_chunk_with_padding(&mut self, offset: usize) -> Result<Vec<u8>, Error> {
self.seek(offset).await?;
let mut buffer = vec![0; self.options_store.chunk_size()];
self.file.read_exact(&mut buffer).await?;
Ok(buffer)
}
pub async fn write_chunk(&mut self, offset: usize, chunk: &[u8]) -> Result<(), Error> {
self.seek(offset).await?;
self.file.write_all(chunk).await?;
Ok(())
}
}