soliddb 0.1.0

simple wrapper around RocksDB
Documentation
use ulid::Ulid;

use crate::{Error, IndexValue, Result};

pub fn key_prefix(table: u32, index: u8) -> Vec<u8> {
    let mut prefix = table.to_be_bytes().to_vec();
    prefix.push(index);
    prefix
}

pub fn primary_key(table: u32, id: Ulid) -> Vec<u8> {
    let mut key = key_prefix(table, 0);
    key.extend_from_slice(&id.as_bytes());
    key
}

pub fn unique_key(table: u32, index: u8, value: &[u8]) -> Vec<u8> {
    let mut key = key_prefix(table, index);
    key.extend_from_slice(value);
    key
}

pub fn non_unique_prefix(table: u32, index: u8, value: &[u8]) -> Vec<u8> {
    let mut prefix = key_prefix(table, index);
    prefix.extend_from_slice(value);
    prefix
}

pub fn non_unique_key(table: u32, index: u8, value: &[u8], id: Ulid) -> Vec<u8> {
    let mut key = non_unique_prefix(table, index, value);
    key.extend_from_slice(&id.as_bytes());
    key
}

pub fn id_from_primary_key(bytes: &[u8]) -> Result<Ulid> {
    let bytes = bytes[5..].try_into().map_err(|_| Error::MalformedKey)?;
    let num = u128::from_be_bytes(bytes);
    Ok(Ulid(num))
}

pub fn id_from_non_unique_key(bytes: &[u8]) -> Result<Ulid> {
    let bytes = &bytes[bytes.len() - 16..];
    let bytes = bytes.try_into().map_err(|_| Error::MalformedKey)?;
    let num = u128::from_be_bytes(bytes);
    Ok(Ulid(num))
}

pub fn id_from_slice(bytes: &[u8]) -> Result<Ulid> {
    let bytes = bytes.try_into().map_err(|_| Error::MalformedKey)?;
    let num = u128::from_be_bytes(bytes);
    Ok(Ulid(num))
}