use crate::http::{MsgBufferString, Protocol, Request};
use core::net::IpAddr;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum OperationMode {
Auto,
Manual,
}
#[derive(Debug)]
pub struct AutoStream<D> {
pub data: D,
pub peer: IpAddr,
pub protocol: Option<Protocol>,
pub req: Request<MsgBufferString>,
}
impl<D> AutoStream<D> {
#[inline]
pub const fn new(
data: D,
peer: IpAddr,
protocol: Option<Protocol>,
req: Request<MsgBufferString>,
) -> Self {
Self { data, peer, protocol, req }
}
}
#[derive(Debug)]
pub struct ManualStream<D, S> {
pub data: D,
pub peer: IpAddr,
pub protocol: Option<Protocol>,
pub req: Request<MsgBufferString>,
pub stream: S,
}
impl<D, S> ManualStream<D, S> {
#[inline]
pub const fn new(
data: D,
peer: IpAddr,
protocol: Option<Protocol>,
req: Request<MsgBufferString>,
stream: S,
) -> Self {
Self { data, peer, protocol, req, stream }
}
}
pub trait OperationModeStream {
const OM: OperationMode;
type Data;
fn data(&mut self) -> &mut Self::Data;
fn parts(&mut self) -> (&mut Self::Data, &mut Request<MsgBufferString>);
fn peer(&self) -> &IpAddr;
fn req(&mut self) -> &mut Request<MsgBufferString>;
}
impl<D> OperationModeStream for AutoStream<D> {
const OM: OperationMode = OperationMode::Auto;
type Data = D;
#[inline]
fn data(&mut self) -> &mut Self::Data {
&mut self.data
}
#[inline]
fn parts(&mut self) -> (&mut Self::Data, &mut Request<MsgBufferString>) {
(&mut self.data, &mut self.req)
}
#[inline]
fn peer(&self) -> &IpAddr {
&self.peer
}
#[inline]
fn req(&mut self) -> &mut Request<MsgBufferString> {
&mut self.req
}
}
impl<D, S> OperationModeStream for ManualStream<D, S> {
const OM: OperationMode = OperationMode::Manual;
type Data = D;
#[inline]
fn data(&mut self) -> &mut D {
&mut self.data
}
#[inline]
fn parts(&mut self) -> (&mut Self::Data, &mut Request<MsgBufferString>) {
(&mut self.data, &mut self.req)
}
#[inline]
fn peer(&self) -> &IpAddr {
&self.peer
}
#[inline]
fn req(&mut self) -> &mut Request<MsgBufferString> {
&mut self.req
}
}