use crate::PreimageKey;
use alloc::{boxed::Box, string::String, vec::Vec};
use anyhow::Result;
use async_trait::async_trait;
#[async_trait]
pub trait PreimageOracleClient {
async fn get(&self, key: PreimageKey) -> Result<Vec<u8>>;
async fn get_exact(&self, key: PreimageKey, buf: &mut [u8]) -> Result<()>;
}
#[async_trait]
pub trait HintWriterClient {
async fn write(&self, hint: &str) -> Result<()>;
}
pub trait CommsClient: PreimageOracleClient + Clone + HintWriterClient {}
impl<T: PreimageOracleClient + Clone + HintWriterClient> CommsClient for T {}
#[async_trait]
pub trait PreimageOracleServer {
async fn next_preimage_request<F>(&self, get_preimage: &F) -> Result<()>
where
F: PreimageFetcher + Send + Sync;
}
#[async_trait]
pub trait HintReaderServer {
async fn next_hint<R>(&self, route_hint: &R) -> Result<()>
where
R: HintRouter + Send + Sync;
}
#[async_trait]
pub trait HintRouter {
async fn route_hint(&self, hint: String) -> Result<()>;
}
#[async_trait]
pub trait PreimageFetcher {
async fn get_preimage(&self, key: PreimageKey) -> Result<Vec<u8>>;
}