use std::future::Future;
use std::pin::Pin;
use std::sync::Arc;
use crate::adapter::horizontal_adapter::{BroadcastMessage, RequestBody, ResponseBody};
use crate::error::Result;
use async_trait::async_trait;
pub type BoxFuture<'a, T> = Pin<Box<dyn Future<Output = T> + Send + 'a>>;
pub struct TransportHandlers {
pub on_broadcast: Arc<dyn Fn(BroadcastMessage) -> BoxFuture<'static, ()> + Send + Sync>,
pub on_request:
Arc<dyn Fn(RequestBody) -> BoxFuture<'static, Result<ResponseBody>> + Send + Sync>,
pub on_response: Arc<dyn Fn(ResponseBody) -> BoxFuture<'static, ()> + Send + Sync>,
}
#[async_trait]
pub trait HorizontalTransport: Send + Sync + Clone {
type Config: Send + Sync;
async fn new(config: Self::Config) -> Result<Self>;
async fn publish_broadcast(&self, message: &BroadcastMessage) -> Result<()>;
async fn publish_request(&self, request: &RequestBody) -> Result<()>;
async fn publish_response(&self, response: &ResponseBody) -> Result<()>;
async fn start_listeners(&self, handlers: TransportHandlers) -> Result<()>;
async fn get_node_count(&self) -> Result<usize>;
async fn check_health(&self) -> Result<()>;
}
pub trait TransportConfig: Send + Sync + Clone {
fn request_timeout_ms(&self) -> u64;
fn prefix(&self) -> &str;
}