dochy_fs 0.10.1

A file system which composes chlonological diff files efficiently.
use std::io::Write;
use dochy_compaction::kval_enum::KVal;
use dochy_compaction::basic_compaction::comp_int;
use crate::error::FsResult;
use dochy_compaction::enc_dec::decode_from_slice::decode_from_slice;
use dochy_compaction::enc_dec::encode::encode                                                                                                                                                                                                                                                                       ;
use with_capacity_safe::vec_with_capacity_safe;

#[derive(Debug)]
pub(crate) struct SdDiff{
    vec : Vec<SdDiffItem>
}

impl SdDiff{
    pub(crate) fn new(vec : Vec<SdDiffItem>) -> SdDiff{
        SdDiff{ vec }
    }

    pub(crate) fn get(&self, index : usize) -> &SdDiffItem{
        &self.vec[index]
    }
    pub(crate) fn len(&self) -> usize{ self.vec.len() }
    pub(crate) fn iter(&self) -> impl Iterator<Item=&SdDiffItem>{
        self.vec.iter()
    }

    pub(crate) fn encode<W : Write>(&self, write : &mut W) -> FsResult<()>{
        let mut vec : Vec<KVal> = vec![];

        vec.push(comp_int(self.len() as i64));
        for item in self.iter(){
            item.write(&mut vec);
        }

        encode(&vec, write)?;
        Ok(())
    }

    pub(crate) fn decode(bytes : &[u8]) -> FsResult<Self>{
        let (vec,_) = decode_from_slice(bytes)?;
        Self::decode_kvals(&vec)
    }

    pub(crate) fn decode_kvals(kvals : &[KVal]) -> FsResult<SdDiff>{
        let mut iter = kvals.iter();
        let len = iter.next()?.as_i64()? as usize;
        let mut vec : Vec<SdDiffItem> = vec_with_capacity_safe(len)?;

        for _ in 0..len{
            vec.push(SdDiffItem::read(&mut iter)?)
        }

        Ok(SdDiff::new(vec))
    }
}

#[derive(Debug)]
pub(crate) struct SdDiffItem{
    index : usize,
    value : u8,
}

impl SdDiffItem{
    pub(crate) fn new(index : usize, value : u8) -> SdDiffItem{
        SdDiffItem{ index, value }
    }

    pub(crate) fn index(&self) -> usize{ self.index }
    pub(crate) fn value(&self) -> u8{ self.value }

    pub(crate) fn write(&self, vec : &mut Vec<KVal>){
        vec.push(comp_int(self.index as i64));
        vec.push(comp_int(self.value as i64));
    }
    pub(crate) fn read<'a>(iter : &mut impl Iterator<Item=&'a KVal>) -> FsResult<SdDiffItem>{
        let index = iter.next()?.as_i64()? as usize;
        let value = iter.next()?.as_i64()? as u8;

        Ok(SdDiffItem{ index, value })
    }
}