wedb_embed 0.1.0

Embedded Kvrocks-compatible storage engine for WeDb
Documentation
use crate::meta::{KeyMeta, RedisType};
use serde::{Deserialize, Serialize};

/// 位图结构元数据(对标 Apache Kvrocks BitmapMetadata)
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub struct BitmapMeta {
    pub base: KeyMeta,
}

impl BitmapMeta {
    pub const ENCODED_SIZE: usize = KeyMeta::ENCODED_SIZE;

    #[inline]
    pub fn new(expire_at: u64, version: u64, size: u64) -> Self {
        Self {
            base: KeyMeta::new(RedisType::Bitmap, expire_at, version, size),
        }
    }

    #[inline]
    pub fn new_with_version(expire_at: u64, size: u64) -> Self {
        Self {
            base: KeyMeta::new_with_version(RedisType::Bitmap, expire_at, size),
        }
    }

    #[inline]
    pub fn size(&self) -> u64 {
        self.base.size
    }

    #[inline]
    pub fn is_empty(&self) -> bool {
        self.base.size == 0
    }

    #[inline]
    pub fn is_expired(&self, now_ms: u64) -> bool {
        self.base.is_expired(now_ms)
    }

    #[inline]
    pub fn encode(&self) -> [u8; Self::ENCODED_SIZE] {
        self.base.encode()
    }

    #[inline]
    pub fn decode(bytes: &[u8]) -> Option<Self> {
        let base = KeyMeta::decode(bytes)?;
        if base.rtype == RedisType::Bitmap {
            Some(Self { base })
        } else {
            None
        }
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_bitmap_meta_roundtrip() {
        let meta = BitmapMeta::new_with_version(1000, 2048);
        assert_eq!(meta.size(), 2048);
        assert!(!meta.is_empty());
        assert!(!meta.is_expired(500));
        assert!(meta.is_expired(1500));

        let encoded = meta.encode();
        let decoded = BitmapMeta::decode(&encoded).expect("decode failed");
        assert_eq!(decoded.size(), 2048);
        assert_eq!(decoded.base.rtype, RedisType::Bitmap);
        assert_eq!(decoded.base.expire_at, 1000);
    }
}