rsbx 2.0.0

Enhanced implementation of SeqBox in Rust
Documentation
#![allow(dead_code)]

pub const SBX_LARGEST_BLOCK_SIZE   : usize = 4096;

pub const SBX_FIRST_DATA_SEQ_NUM   : u32   = 1;

pub const SBX_LAST_SEQ_NUM         : u32   = u32::max_value();

pub const SBX_METADATA_BLOCK_COUNT : usize = 1;

pub const SBX_SCAN_BLOCK_SIZE      : usize = 128;

pub const SBX_FILE_UID_LEN         : usize = common_params::FILE_UID_LEN;

pub const SBX_SIGNATURE            : &[u8] = common_params::SIGNATURE;

pub const SBX_HEADER_SIZE          : usize = common_params::HEADER_SIZE;

pub const SBX_MAX_DATA_BLOCK_COUNT : u32   =
    u32::max_value() - SBX_METADATA_BLOCK_COUNT as u32;

pub const SBX_MAX_BURST_ERR_RESISTANCE : usize = 1000;

#[derive(Clone, Copy, Debug, PartialEq)]
pub enum Version {
    V1,
    V2,
    V3,
    V17,
    V18,
    V19,
}

mod common_params {
    use std::u32;

    pub const FILE_UID_LEN  : usize = 6;
    pub const SIGNATURE     : &[u8] = b"SBx";
    pub const HEADER_SIZE   : usize = 16;
    pub const MAX_BLOCK_NUM : u64   = u32::MAX as u64;
}

mod params_for_v1 {
    use super::common_params;

    pub const BLOCK_SIZE : usize = 512;
    pub const DATA_SIZE  : usize = BLOCK_SIZE - common_params::HEADER_SIZE;
}

mod params_for_v2 {
    use super::common_params;

    pub const BLOCK_SIZE : usize = 128;
    pub const DATA_SIZE  : usize = BLOCK_SIZE - common_params::HEADER_SIZE;
}

mod params_for_v3 {
    use super::common_params;

    pub const BLOCK_SIZE : usize = 4096;
    pub const DATA_SIZE  : usize = BLOCK_SIZE - common_params::HEADER_SIZE;
}

mod params_for_v17 {
    use super::params_for_v1;

    pub const BLOCK_SIZE : usize = params_for_v1::BLOCK_SIZE;
    pub const DATA_SIZE  : usize = params_for_v1::DATA_SIZE;
}

mod params_for_v18 {
    use super::params_for_v2;

    pub const BLOCK_SIZE : usize = params_for_v2::BLOCK_SIZE;
    pub const DATA_SIZE  : usize = params_for_v2::DATA_SIZE;
}

mod params_for_v19 {
    use super::params_for_v3;

    pub const BLOCK_SIZE : usize = params_for_v3::BLOCK_SIZE;
    pub const DATA_SIZE  : usize = params_for_v3::DATA_SIZE;
}

pub fn ver_to_usize(version : Version) -> usize {
    use self::Version::*;
    match version {
        V1  => 1,
        V2  => 2,
        V3  => 3,
        V17 => 17,
        V18 => 18,
        V19 => 19,
    }
}

pub fn string_to_ver(string : &str) -> Result<Version, ()> {
    use self::Version::*;
    match string {
        "1"  => Ok(V1),
        "2"  => Ok(V2),
        "3"  => Ok(V3),
        "17" => Ok(V17),
        "18" => Ok(V18),
        "19" => Ok(V19),
        _    => Err(()),
    }
}

pub fn ver_to_block_size(version : Version) -> usize {
    use self::Version::*;
    match version {
        V1  => params_for_v1::BLOCK_SIZE,
        V2  => params_for_v2::BLOCK_SIZE,
        V3  => params_for_v3::BLOCK_SIZE,
        V17 => params_for_v17::BLOCK_SIZE,
        V18 => params_for_v18::BLOCK_SIZE,
        V19 => params_for_v19::BLOCK_SIZE,
    }
}

pub fn ver_to_data_size(version : Version) -> usize {
    use self::Version::*;
    match version {
        V1  => params_for_v1::DATA_SIZE,
        V2  => params_for_v2::DATA_SIZE,
        V3  => params_for_v3::DATA_SIZE,
        V17 => params_for_v17::DATA_SIZE,
        V18 => params_for_v18::DATA_SIZE,
        V19 => params_for_v19::DATA_SIZE,
    }
}

pub fn ver_uses_rs(version : Version) -> bool {
    use self::Version::*;
    match version {
        V1  | V2  | V3  => false,
        V17 | V18 | V19 => true,
    }
}

pub fn ver_forces_meta_enabled(version : Version) -> bool {
    use self::Version::*;
    match version {
        V1  | V2  | V3  => false,
        V17 | V18 | V19 => true,
    }
}

pub fn ver_to_max_data_file_size(version : Version) -> u64 {
    let data_block_size =
        ver_to_data_size(version) as u64;

    SBX_MAX_DATA_BLOCK_COUNT as u64 * data_block_size
}