thesix 0.3.0

Policy-driven six-tier cache orchestration for Rust
Documentation
use std::hash::Hash;

use crate::error::CacheError;

#[derive(Debug, Clone, Copy)]
pub struct KeyRef<'a>(pub &'a [u8]);

impl PartialEq for KeyRef<'_> {
    fn eq(&self, other: &Self) -> bool {
        self.0 == other.0
    }
}

impl Eq for KeyRef<'_> {}

impl std::hash::Hash for KeyRef<'_> {
    fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
        self.0.hash(state);
    }
}

impl<'a> From<&'a [u8]> for KeyRef<'a> {
    fn from(bytes: &'a [u8]) -> Self {
        KeyRef(bytes)
    }
}

impl<'a> From<&'a Vec<u8>> for KeyRef<'a> {
    fn from(bytes: &'a Vec<u8>) -> Self {
        KeyRef(bytes.as_slice())
    }
}

pub trait Key: Hash + Eq + Clone + Send + Sync + std::fmt::Debug {
    fn encode(&self, buf: &mut [u8]) -> Result<usize, CacheError>;
    fn encoded_len(&self) -> usize;
}

impl Key for String {
    fn encode(&self, buf: &mut [u8]) -> Result<usize, CacheError> {
        let bytes = self.as_bytes();
        if buf.len() < bytes.len() {
            return Err(CacheError::ConfigurationError);
        }
        buf[..bytes.len()].copy_from_slice(bytes);
        Ok(bytes.len())
    }

    fn encoded_len(&self) -> usize {
        self.as_bytes().len()
    }
}

impl Key for &str {
    fn encode(&self, buf: &mut [u8]) -> Result<usize, CacheError> {
        let bytes = self.as_bytes();
        if buf.len() < bytes.len() {
            return Err(CacheError::ConfigurationError);
        }
        buf[..bytes.len()].copy_from_slice(bytes);
        Ok(bytes.len())
    }

    fn encoded_len(&self) -> usize {
        self.as_bytes().len()
    }
}

impl Key for Vec<u8> {
    fn encode(&self, buf: &mut [u8]) -> Result<usize, CacheError> {
        if buf.len() < self.len() {
            return Err(CacheError::ConfigurationError);
        }
        buf[..self.len()].copy_from_slice(self);
        Ok(self.len())
    }

    fn encoded_len(&self) -> usize {
        self.len()
    }
}

impl<K> Key for &K
where
    K: Key,
{
    fn encode(&self, buf: &mut [u8]) -> Result<usize, CacheError> {
        (*self).encode(buf)
    }

    fn encoded_len(&self) -> usize {
        (*self).encoded_len()
    }
}

impl<T> Key for std::sync::Arc<T>
where
    T: Key,
{
    fn encode(&self, buf: &mut [u8]) -> Result<usize, CacheError> {
        self.as_ref().encode(buf)
    }

    fn encoded_len(&self) -> usize {
        self.as_ref().encoded_len()
    }
}