1use serde::{Deserialize, Serialize};
4
5pub type ShardId = [u8; 32];
7
8#[derive(Debug, Clone, Serialize, Deserialize)]
10pub struct Shard {
11 pub id: ShardId,
12 pub data: Vec<u8>,
13 pub metadata: ShardMetadata,
14}
15
16#[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
24pub 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}