use std::{net::SocketAddr, sync::Mutex};
use super::SharedState;
use crate::{app_data_store::AppDataStore, request::RequestBodyStream};
#[derive(Default)]
pub struct MessageRequest {
pub peer_addr: Option<SocketAddr>,
pub(crate) app_data: AppDataStore,
body_stream: Option<Mutex<Option<RequestBodyStream>>>,
}
impl MessageRequest {
#[must_use]
pub fn new() -> Self { Self::default() }
#[must_use]
pub fn with_peer_addr(mut self, addr: Option<SocketAddr>) -> Self {
self.peer_addr = addr;
self
}
#[must_use]
pub fn state<T>(&self) -> Option<SharedState<T>>
where
T: Send + Sync + 'static,
{
self.app_data.get::<T>().map(SharedState::from)
}
pub fn insert_state<T>(&self, state: T)
where
T: Send + Sync + 'static,
{
self.app_data.insert(state);
}
pub fn set_body_stream(&mut self, stream: RequestBodyStream) {
self.body_stream = Some(Mutex::new(Some(stream)));
}
#[must_use]
pub fn take_body_stream(&self) -> Option<RequestBodyStream> {
self.body_stream
.as_ref()
.and_then(|mutex| mutex.lock().ok())
.and_then(|mut guard| guard.take())
}
}
#[derive(Default)]
pub struct Payload<'a> {
pub(super) data: &'a [u8],
}
impl<'a> Payload<'a> {
#[must_use]
#[inline]
pub fn new(data: &'a [u8]) -> Self { Self { data } }
}
impl<'a> From<&'a [u8]> for Payload<'a> {
#[inline]
fn from(data: &'a [u8]) -> Self { Self { data } }
}
impl AsRef<[u8]> for Payload<'_> {
fn as_ref(&self) -> &[u8] { self.data }
}
impl Payload<'_> {
pub fn advance(&mut self, count: usize) {
let n = count.min(self.data.len());
self.data = self.data.get(n..).unwrap_or_default();
}
#[must_use]
pub fn remaining(&self) -> usize { self.data.len() }
}