tstorage 0.1.0

Embedded time-series database
Documentation
use std::{
    cmp::min,
    io::{Read, Result, Seek, Write},
};

#[derive(Debug)]
pub struct FakeFile {
    pub(crate) buf: Vec<u8>,
    pub(crate) pos: u64,
}

impl Seek for FakeFile {
    fn seek(&mut self, seek_from: std::io::SeekFrom) -> Result<u64> {
        match seek_from {
            std::io::SeekFrom::Start(p) => self.pos = p,
            std::io::SeekFrom::End(p) => {
                let len: u64 = self.buf.len().try_into().unwrap();
                let delta: u64 = p.try_into().unwrap();
                self.pos = len - delta
            }
            std::io::SeekFrom::Current(_) => {}
        }
        Ok(self.pos)
    }
}

impl Write for FakeFile {
    fn write(&mut self, buf: &[u8]) -> Result<usize> {
        let num_bytes: usize = buf.len();
        self.pos += TryInto::<u64>::try_into(num_bytes).unwrap();
        self.buf.append(&mut buf.to_vec());
        Ok(num_bytes)
    }

    fn flush(&mut self) -> Result<()> {
        Ok(())
    }
}

impl Read for FakeFile {
    fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
        let curr_pos: usize = self.pos.try_into().unwrap();
        let count = min(buf.len(), self.buf.len() - curr_pos);
        for i in 0..count {
            buf[i] = self.buf[curr_pos + i];
        }
        self.pos = (curr_pos + count).try_into().unwrap();
        Ok(count)
    }
}