versatile-data 0.116.0

A library for databases that has convenient datasets that group together commonly used fields and gives you the flexibility to create your own fields.
Documentation
use idx_binary::{AvltrieeUpdate, IdxFile};
use std::{num::NonZeroU32, path::PathBuf};

use crate::RowFragment;

pub(crate) struct SerialNumber {
    serial: IdxFile<u32>,
    fragment: RowFragment,
}

impl std::ops::Deref for SerialNumber {
    type Target = IdxFile<u32>;
    fn deref(&self) -> &Self::Target {
        &self.serial
    }
}

impl SerialNumber {
    pub fn new(path: PathBuf, reserve_unit: u32) -> Self {
        let file_name = path.file_name().map_or("".into(), |f| f.to_string_lossy());
        SerialNumber {
            serial: IdxFile::new(
                {
                    let mut path = path.clone();
                    path.set_file_name(&(file_name.to_string() + ".i"));
                    path
                },
                reserve_unit,
            ),
            fragment: RowFragment::new({
                let mut path = path.clone();
                path.set_file_name(&(file_name.into_owned() + ".f"));
                path
            }),
        }
    }

    pub fn delete(&mut self, row: NonZeroU32) {
        self.serial.delete(row);
        self.fragment.insert_blank(row);
    }

    pub fn next_row(&mut self) -> NonZeroU32 {
        let v = self.fragment.serial_increment().get();
        if let Some(row) = self.fragment.pop() {
            self.serial.update(row, &v);
            row
        } else {
            self.serial.insert(&v)
        }
    }
}