use std::sync::Arc;
#[derive(Clone, Debug, Default)]
pub struct RequestBody(
Option<Arc<str>>,
);
impl RequestBody {
pub fn new_empty() -> Self {
Self(None)
}
fn as_bytes(&self) -> Option<&[u8]> {
self.0.as_ref().map(|s| s.as_bytes())
}
}
impl From<Arc<str>> for RequestBody {
fn from(value: Arc<str>) -> Self {
Self((!value.is_empty()).then_some(value))
}
}
impl RequestBody {
pub fn is_empty(&self) -> bool {
self.0.as_ref().is_none_or(|s| s.is_empty())
}
pub fn len(&self) -> usize {
self.0.as_ref().map(|s| s.len()).unwrap_or(0)
}
}
#[derive(Clone, Debug, Default)]
pub(crate) struct EncodedRequest {
header: String,
body: RequestBody,
}
impl EncodedRequest {
pub(crate) fn from_header(header: String) -> Self {
Self {
header,
body: RequestBody::default(),
}
}
#[cfg(test)]
pub(crate) fn to_owned(&self) -> Vec<u8> {
let mut v = self.header.as_bytes().to_owned();
v.extend_from_slice(self.body.as_bytes().unwrap_or(&[]));
v
}
pub(crate) fn set_body(&mut self, body: RequestBody) {
self.body = body;
}
pub(crate) fn iter(&self) -> impl Iterator<Item = &'_ [u8]> {
use std::iter;
iter::once(self.header.as_bytes()).chain(self.body.as_bytes())
}
}