lib-compression 0.1.0

Universal lossless compression via network-wide deduplication
Documentation
//! Shard data structures

use serde::{Deserialize, Serialize};

/// Unique shard identifier (BLAKE3 hash).
pub type ShardId = [u8; 32];

/// A compressed shard with metadata.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Shard {
    pub id: ShardId,
    pub data: Vec<u8>,
    pub metadata: ShardMetadata,
}

/// Shard metadata.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ShardMetadata {
    pub original_size: usize,
    pub compressed_size: usize,
    pub compression_ratio: f32,
}

/// Manages shard storage and retrieval.
pub struct ShardManager {
    dht: Box<dyn crate::traits::DhtStorage>,
}

impl ShardManager {
    pub fn new(dht: Box<dyn crate::traits::DhtStorage>) -> Self {
        Self { dht }
    }

    pub fn with_default_dht() -> Self {
        Self::new(Box::new(crate::traits::MemoryDht::new()))
    }

    pub fn store(&self, shard: &Shard) -> crate::Result<()> {
        self.dht.store(&shard.id, &shard.data)
    }

    pub fn retrieve(&self, id: &ShardId) -> crate::Result<Option<Shard>> {
        match self.dht.retrieve(id)? {
            Some(data) => Ok(Some(Shard {
                id: *id,
                data: data.clone(),
                metadata: ShardMetadata {
                    original_size: data.len(),
                    compressed_size: data.len(),
                    compression_ratio: 1.0,
                },
            })),
            None => Ok(None),
        }
    }
}