use super::frame::Payload;
use super::Result;
use std::future::Future;
use std::pin::Pin;
use tokio_stream::Stream;
pub type Mono<T> = Pin<Box<dyn Send + Sync + Future<Output = T>>>;
pub type Flux<T> = Pin<Box<dyn Send + Sync + Stream<Item = T>>>;
pub trait RSocket: Send + Sync {
fn request_response(&self, payload: Payload) -> Mono<Result<Payload>>;
fn request_stream(&self, payload: Payload) -> Flux<Result<Payload>>;
fn request_channel(
&self,
payloads: Flux<Result<Payload>>,
) -> Flux<Result<Payload>>;
fn fire_and_forget(&self, payload: Payload) -> Mono<Result<()>>;
fn metadata_push(&self, payload: Payload) -> Mono<Result<()>>;
}