use crate::courierust_http::body::Body;
use crate::courierust_http::header::{HeaderMap, HeaderName, HeaderValue};
use crate::courierust_http::status::StatusCode;
use crate::courierust_http::version::Version;
#[derive(Clone)]
pub struct Response<B = Body> {
pub status: StatusCode,
pub version: Version,
pub headers: HeaderMap,
pub body: B,
pub trailers: Option<HeaderMap>,
}
impl Response<Body> {
#[inline]
pub fn ok() -> Self {
Self::new(StatusCode::OK)
}
#[inline]
pub fn new(status: StatusCode) -> Self {
Self {
status,
version: Version::HTTP_11,
headers: HeaderMap::new(),
body: Body::Empty,
trailers: None,
}
}
}
impl<B> Response<B> {
pub fn header(mut self, name: impl Into<HeaderName>, value: impl Into<HeaderValue>) -> Self {
self.headers.insert(name.into(), value.into());
self
}
pub fn with_status(status: StatusCode) -> Self
where
B: Default,
{
Self {
status,
..Self::default()
}
}
pub fn append_header(
mut self,
name: impl Into<HeaderName>,
value: impl Into<HeaderValue>,
) -> Self {
self.headers.append(name.into(), value.into());
self
}
pub fn with_body<B2>(self, body: B2) -> Response<B2> {
Response {
status: self.status,
version: self.version,
headers: self.headers,
body,
trailers: self.trailers,
}
}
}
impl<B: Default> Default for Response<B> {
fn default() -> Self {
Self {
status: StatusCode::OK,
version: Version::HTTP_11,
headers: HeaderMap::new(),
body: B::default(),
trailers: None,
}
}
}
impl<B: core::fmt::Debug> core::fmt::Debug for Response<B> {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.debug_struct("Response")
.field("status", &self.status)
.field("version", &self.version)
.field("headers", &self.headers)
.field("body", &self.body)
.finish()
}
}
impl Response<Body> {
pub fn into_parts(self) -> (ResponseHead, Body) {
let head = ResponseHead {
status: self.status,
version: self.version,
headers: self.headers,
};
(head, self.body)
}
}
#[derive(Clone, Debug)]
pub struct ResponseHead {
pub status: StatusCode,
pub version: Version,
pub headers: HeaderMap,
}
impl ResponseHead {
pub fn new(status: StatusCode) -> Self {
Self {
status,
version: Version::HTTP_11,
headers: HeaderMap::new(),
}
}
pub fn with_body<B>(self, body: B) -> Response<B> {
Response {
status: self.status,
version: self.version,
headers: self.headers,
body,
trailers: None,
}
}
}