use std::pin::Pin;
use bytes::Bytes;
use futures::Stream;
use crate::codecs::EncodedRequest;
use crate::context::ExecutionContext;
use crate::error::Result;
#[derive(Clone, Debug)]
pub struct TransportResponse {
pub status: u16,
pub headers: http::HeaderMap,
pub body: Bytes,
}
pub struct TransportStream {
pub status: u16,
pub headers: http::HeaderMap,
pub body: Pin<Box<dyn Stream<Item = Result<Bytes>> + Send + 'static>>,
}
impl std::fmt::Debug for TransportStream {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("TransportStream")
.field("status", &self.status)
.field("headers", &self.headers)
.field("body", &"<byte stream>")
.finish()
}
}
#[async_trait::async_trait]
pub trait Transport: Send + Sync + 'static {
fn name(&self) -> &'static str;
async fn send(
&self,
request: EncodedRequest,
ctx: &ExecutionContext,
) -> Result<TransportResponse>;
async fn send_streaming(
&self,
request: EncodedRequest,
ctx: &ExecutionContext,
) -> Result<TransportStream> {
let response = self.send(request, ctx).await?;
let body = response.body;
let stream = futures::stream::once(async move { Ok(body) });
Ok(TransportStream {
status: response.status,
headers: response.headers,
body: Box::pin(stream),
})
}
}