use async_trait::async_trait;
use hashtree_core::Cid;
use thiserror::Error;
use tokio::sync::mpsc;
#[derive(Error, Debug)]
pub enum ResolverError {
#[error("Invalid key format: {0}")]
InvalidKey(String),
#[error("Network error: {0}")]
Network(String),
#[error("Not authorized to publish")]
NotAuthorized,
#[error("Resolver stopped")]
Stopped,
#[error("Other error: {0}")]
Other(String),
}
#[derive(Debug, Clone)]
pub struct ResolverEntry {
pub key: String,
pub cid: Cid,
}
#[async_trait]
pub trait RootResolver: Send + Sync {
async fn resolve(&self, key: &str) -> Result<Option<Cid>, ResolverError>;
async fn resolve_shared(
&self,
key: &str,
share_secret: &[u8; 32],
) -> Result<Option<Cid>, ResolverError> {
let _ = share_secret;
self.resolve(key).await
}
async fn subscribe(&self, key: &str) -> Result<mpsc::Receiver<Option<Cid>>, ResolverError>;
async fn publish(&self, key: &str, cid: &Cid) -> Result<bool, ResolverError> {
let _ = (key, cid);
Err(ResolverError::NotAuthorized)
}
async fn publish_shared(
&self,
key: &str,
cid: &Cid,
share_secret: &[u8; 32],
) -> Result<bool, ResolverError> {
let _ = (key, cid, share_secret);
Err(ResolverError::NotAuthorized)
}
async fn list(&self, prefix: &str) -> Result<Vec<ResolverEntry>, ResolverError> {
let _ = prefix;
Ok(vec![])
}
async fn subscribe_list(
&self,
prefix: &str,
) -> Result<mpsc::Receiver<Vec<ResolverEntry>>, ResolverError> {
let _ = prefix;
Err(ResolverError::Other("Not implemented".into()))
}
async fn stop(&self) -> Result<(), ResolverError> {
Ok(())
}
}