Skip to main content

lib_compression/
shard.rs

1//! Shard data structures
2
3use serde::{Deserialize, Serialize};
4
5/// Unique shard identifier (BLAKE3 hash).
6pub type ShardId = [u8; 32];
7
8/// A compressed shard with metadata.
9#[derive(Debug, Clone, Serialize, Deserialize)]
10pub struct Shard {
11    pub id: ShardId,
12    pub data: Vec<u8>,
13    pub metadata: ShardMetadata,
14}
15
16/// Shard metadata.
17#[derive(Debug, Clone, Serialize, Deserialize)]
18pub struct ShardMetadata {
19    pub original_size: usize,
20    pub compressed_size: usize,
21    pub compression_ratio: f32,
22}
23
24/// Manages shard storage and retrieval.
25pub struct ShardManager {
26    dht: Box<dyn crate::traits::DhtStorage>,
27}
28
29impl ShardManager {
30    pub fn new(dht: Box<dyn crate::traits::DhtStorage>) -> Self {
31        Self { dht }
32    }
33
34    pub fn with_default_dht() -> Self {
35        Self::new(Box::new(crate::traits::MemoryDht::new()))
36    }
37
38    pub fn store(&self, shard: &Shard) -> crate::Result<()> {
39        self.dht.store(&shard.id, &shard.data)
40    }
41
42    pub fn retrieve(&self, id: &ShardId) -> crate::Result<Option<Shard>> {
43        match self.dht.retrieve(id)? {
44            Some(data) => Ok(Some(Shard {
45                id: *id,
46                data: data.clone(),
47                metadata: ShardMetadata {
48                    original_size: data.len(),
49                    compressed_size: data.len(),
50                    compression_ratio: 1.0,
51                },
52            })),
53            None => Ok(None),
54        }
55    }
56}