use std::future::Future;
use std::pin::Pin;
use futures::Stream as FuturesStream;
use rskit_errors::AppResult;
pub type BoxStream<O> = Pin<Box<dyn FuturesStream<Item = AppResult<O>> + Send + 'static>>;
#[async_trait::async_trait]
pub trait Provider: Send + Sync {
fn name(&self) -> &'static str;
}
#[async_trait::async_trait]
pub trait RequestResponse<I, O>: Provider
where
I: Send + 'static,
O: Send + 'static,
{
async fn execute(&self, input: I) -> AppResult<O>;
}
pub trait Stream<I, O>: Provider
where
I: Send + 'static,
O: Send + 'static,
{
fn execute(&self, input: I) -> impl Future<Output = AppResult<BoxStream<O>>> + Send + '_;
}
pub trait Sink<I>: Provider
where
I: Send + 'static,
{
fn send(&self, input: I) -> impl Future<Output = AppResult<()>> + Send + '_;
}
pub trait Duplex<I, O>: Provider
where
I: Send + 'static,
O: Send + 'static,
{
fn open(&self) -> impl Future<Output = AppResult<Box<dyn DuplexChannel<I, O>>>> + Send + '_;
}
#[async_trait::async_trait]
pub trait DuplexChannel<I, O>: Send
where
I: Send + 'static,
O: Send + 'static,
{
async fn send(&mut self, input: I) -> AppResult<()>;
async fn recv(&mut self) -> AppResult<Option<O>>;
async fn close(&mut self) -> AppResult<()>;
}