use serde::{Deserialize, Serialize};
pub type ShardId = [u8; 32];
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Shard {
pub id: ShardId,
pub data: Vec<u8>,
pub metadata: ShardMetadata,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ShardMetadata {
pub original_size: usize,
pub compressed_size: usize,
pub compression_ratio: f32,
}
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),
}
}
}