use crate::http::{Protocol, ReqResBuffer, Request};
use core::net::IpAddr;
#[cfg(feature = "http2")]
pub type ManualServerStream<CA, HB, SA, SW> =
ManualStream<CA, crate::http2::ServerStream<HB, SW>, SA>;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum OperationMode {
Auto,
Manual,
}
#[derive(Debug)]
pub struct AutoStream<CA, SA> {
pub conn_aux: CA,
pub peer: IpAddr,
pub protocol: Option<Protocol>,
pub req: Request<ReqResBuffer>,
pub stream_aux: SA,
}
#[derive(Debug)]
pub struct ManualStream<CA, S, SA> {
pub conn_aux: CA,
pub peer: IpAddr,
pub protocol: Option<Protocol>,
pub req: Request<ReqResBuffer>,
pub stream: S,
pub stream_aux: SA,
}
pub trait OperationModeStream {
const OM: OperationMode;
type ConnAux;
type StreamAux;
fn conn_aux(&mut self) -> &mut Self::ConnAux;
fn parts(&mut self) -> (&mut Self::ConnAux, &mut Request<ReqResBuffer>, &mut Self::StreamAux);
fn peer(&self) -> &IpAddr;
fn req(&mut self) -> &mut Request<ReqResBuffer>;
fn stream_aux(&mut self) -> &mut Self::StreamAux;
}
impl<CA, SA> OperationModeStream for AutoStream<CA, SA> {
const OM: OperationMode = OperationMode::Auto;
type ConnAux = CA;
type StreamAux = SA;
#[inline]
fn conn_aux(&mut self) -> &mut Self::ConnAux {
&mut self.conn_aux
}
#[inline]
fn parts(&mut self) -> (&mut Self::ConnAux, &mut Request<ReqResBuffer>, &mut Self::StreamAux) {
(&mut self.conn_aux, &mut self.req, &mut self.stream_aux)
}
#[inline]
fn peer(&self) -> &IpAddr {
&self.peer
}
#[inline]
fn req(&mut self) -> &mut Request<ReqResBuffer> {
&mut self.req
}
#[inline]
fn stream_aux(&mut self) -> &mut Self::StreamAux {
&mut self.stream_aux
}
}
impl<CA, S, SA> OperationModeStream for ManualStream<CA, S, SA> {
const OM: OperationMode = OperationMode::Manual;
type ConnAux = CA;
type StreamAux = SA;
#[inline]
fn conn_aux(&mut self) -> &mut CA {
&mut self.conn_aux
}
#[inline]
fn parts(&mut self) -> (&mut Self::ConnAux, &mut Request<ReqResBuffer>, &mut Self::StreamAux) {
(&mut self.conn_aux, &mut self.req, &mut self.stream_aux)
}
#[inline]
fn peer(&self) -> &IpAddr {
&self.peer
}
#[inline]
fn req(&mut self) -> &mut Request<ReqResBuffer> {
&mut self.req
}
#[inline]
fn stream_aux(&mut self) -> &mut SA {
&mut self.stream_aux
}
}