use rama_core::{error::BoxError, Context, Service};
use std::{fmt, future::Future, net::SocketAddr};
pub struct EstablishedClientConnection<S, State, Request> {
pub ctx: Context<State>,
pub req: Request,
pub conn: S,
pub addr: SocketAddr,
}
impl<S: fmt::Debug, State: fmt::Debug, Request: fmt::Debug> fmt::Debug
for EstablishedClientConnection<S, State, Request>
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("EstablishedClientConnection")
.field("ctx", &self.ctx)
.field("req", &self.req)
.field("conn", &self.conn)
.field("addr", &self.addr)
.finish()
}
}
impl<S: Clone, State, Request: Clone> Clone for EstablishedClientConnection<S, State, Request> {
fn clone(&self) -> Self {
Self {
ctx: self.ctx.clone(),
req: self.req.clone(),
conn: self.conn.clone(),
addr: self.addr,
}
}
}
pub trait ConnectorService<State, Request>: Send + Sync + 'static {
type Connection;
type Error: Into<BoxError>;
fn connect(
&self,
ctx: Context<State>,
req: Request,
) -> impl Future<
Output = Result<EstablishedClientConnection<Self::Connection, State, Request>, Self::Error>,
> + Send
+ '_;
}
impl<S, State, Request, Connection> ConnectorService<State, Request> for S
where
S: Service<
State,
Request,
Response = EstablishedClientConnection<Connection, State, Request>,
Error: Into<BoxError>,
>,
{
type Connection = Connection;
type Error = S::Error;
fn connect(
&self,
ctx: Context<State>,
req: Request,
) -> impl Future<
Output = Result<EstablishedClientConnection<Self::Connection, State, Request>, Self::Error>,
> + Send
+ '_ {
self.serve(ctx, req)
}
}