1use anyhow::Result;
2use super::types::{Block, Cid};
3
4#[async_trait::async_trait]
7pub trait StorageEngine: Send + Sync {
8 async fn put(&mut self, key: &[u8], value: &[u8]) -> Result<()>;
10
11 async fn get(&self, key: &[u8]) -> Result<Option<Vec<u8>>>;
13
14 async fn delete(&mut self, key: &[u8]) -> Result<()>;
16
17 async fn scan(&self, prefix: &[u8]) -> Result<Vec<(Vec<u8>, Vec<u8>)>>;
19}
20
21impl dyn StorageEngine {
22 pub async fn put_block(&mut self, block: &Block) -> Result<Cid> {
25 let cid = block.cid()?;
26 let bytes = block.to_bytes()?;
27 self.put(&cid, &bytes).await?;
28 Ok(cid)
29 }
30
31 pub async fn get_block(&self, cid: &Cid) -> Result<Option<Block>> {
33 match self.get(cid).await? {
34 Some(bytes) => {
35 let block = Block::from_bytes(&bytes)?;
36 Ok(Some(block))
37 }
38 None => Ok(None),
39 }
40 }
41}