use crate::{
PreimageKey,
errors::{ChannelResult, PreimageOracleResult},
};
use alloc::{boxed::Box, string::String, vec::Vec};
use async_trait::async_trait;
#[async_trait]
pub trait PreimageOracleClient {
async fn get(&self, key: PreimageKey) -> PreimageOracleResult<Vec<u8>>;
async fn get_exact(&self, key: PreimageKey, buf: &mut [u8]) -> PreimageOracleResult<()>;
}
#[async_trait]
pub trait HintWriterClient {
async fn write(&self, hint: &str) -> PreimageOracleResult<()>;
}
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) -> PreimageOracleResult<()>
where
F: PreimageFetcher + Send + Sync;
}
#[async_trait]
pub trait HintReaderServer {
async fn next_hint<R>(&self, route_hint: &R) -> PreimageOracleResult<()>
where
R: HintRouter + Send + Sync;
}
#[async_trait]
pub trait HintRouter {
async fn route_hint(&self, hint: String) -> PreimageOracleResult<()>;
}
#[async_trait]
pub trait PreimageFetcher {
async fn get_preimage(&self, key: PreimageKey) -> PreimageOracleResult<Vec<u8>>;
}
pub trait PreimageServerBackend: PreimageFetcher + HintRouter {}
impl<T: PreimageFetcher + HintRouter> PreimageServerBackend for T {}
#[async_trait]
pub trait Channel {
async fn read(&self, buf: &mut [u8]) -> ChannelResult<usize>;
async fn read_exact(&self, buf: &mut [u8]) -> ChannelResult<usize>;
async fn write(&self, buf: &[u8]) -> ChannelResult<usize>;
}