use super::{ResponseMetadata, ResponseWriter, ResponseWriterError};
use crate::transport::{ResponseHeaders, StatusCode};
pub struct ResponseCompletion {
status: StatusCode,
initialized_len: usize,
metadata: ResponseMetadata,
}
impl ResponseCompletion {
#[must_use]
pub const fn new(
status: StatusCode,
initialized_len: usize,
metadata: ResponseMetadata,
) -> Self {
Self {
status,
initialized_len,
metadata,
}
}
}
pub struct AsyncResponseStaging<'staging, 'buffer> {
writer: &'staging mut ResponseWriter<'buffer>,
}
impl<'buffer> AsyncResponseStaging<'_, 'buffer> {
#[must_use]
pub const fn body_capacity(&self) -> usize {
self.writer.body_capacity()
}
pub fn body_mut(&mut self) -> Result<&mut [u8], ResponseWriterError> {
self.writer.body_mut()
}
pub fn headers_mut(&mut self) -> Result<&mut ResponseHeaders<'buffer>, ResponseWriterError> {
self.writer.headers_mut()
}
#[must_use]
pub const fn headers(&self) -> &ResponseHeaders<'buffer> {
self.writer.headers()
}
}
pub struct ResponseAttempt<'writer, 'buffer> {
pub(super) writer: &'writer mut ResponseWriter<'buffer>,
pub(super) completed: bool,
}
impl<'buffer> ResponseAttempt<'_, 'buffer> {
#[must_use]
pub const fn body_capacity(&self) -> usize {
self.writer.body_capacity()
}
pub fn body_mut(&mut self) -> Result<&mut [u8], ResponseWriterError> {
self.writer.body_mut()
}
pub fn headers_mut(&mut self) -> Result<&mut ResponseHeaders<'buffer>, ResponseWriterError> {
self.writer.headers_mut()
}
#[must_use]
pub const fn headers(&self) -> &ResponseHeaders<'buffer> {
self.writer.headers()
}
pub fn commit(
&mut self,
status: StatusCode,
initialized_len: usize,
metadata: ResponseMetadata,
) -> Result<(), ResponseWriterError> {
self.writer.commit(status, initialized_len, metadata)?;
self.completed = true;
Ok(())
}
pub(crate) fn staging(&mut self) -> AsyncResponseStaging<'_, 'buffer> {
AsyncResponseStaging {
writer: self.writer,
}
}
pub fn commit_completion(
&mut self,
completion: ResponseCompletion,
) -> Result<(), ResponseWriterError> {
self.commit(
completion.status,
completion.initialized_len,
completion.metadata,
)
}
}
impl Drop for ResponseAttempt<'_, '_> {
fn drop(&mut self) {
if !self.completed {
self.writer.rollback_attempt();
}
}
}