use crate::http::{
KnownHeaderName, ReqResBuilder, ReqResBuilderInput, ReqResDataMut, Response, StatusCode, Version,
};
use core::ops::{Deref, DerefMut};
#[derive(Debug)]
pub struct ResBuilder<RRD> {
rrb: ReqResBuilder<RRD>,
status_code: StatusCode,
version: Version,
}
impl<RRD> ResBuilder<RRD> {
#[inline]
pub const fn bad_request(rrd: RRD) -> Self {
Self {
rrb: ReqResBuilder::new(rrd),
status_code: StatusCode::BadRequest,
version: Version::Http2,
}
}
#[inline]
pub const fn created(rrd: RRD) -> Self {
Self { rrb: ReqResBuilder::new(rrd), status_code: StatusCode::Created, version: Version::Http2 }
}
#[inline]
pub const fn internal_server_error(rrd: RRD) -> Self {
Self {
rrb: ReqResBuilder::new(rrd),
status_code: StatusCode::InternalServerError,
version: Version::Http2,
}
}
#[inline]
pub const fn not_found(rrd: RRD) -> Self {
Self {
rrb: ReqResBuilder::new(rrd),
status_code: StatusCode::NotFound,
version: Version::Http2,
}
}
#[inline]
pub const fn ok(rrd: RRD) -> Self {
Self { rrb: ReqResBuilder::new(rrd), status_code: StatusCode::Ok, version: Version::Http2 }
}
#[inline]
pub fn into_response(self) -> Response<RRD> {
Response::new(self.rrb.rrd, self.status_code, self.version)
}
#[inline]
pub const fn status_code(&mut self, status_code: StatusCode) -> &mut Self {
self.status_code = status_code;
self
}
}
impl<RRD> ResBuilder<RRD>
where
RRD: ReqResDataMut,
{
#[inline]
pub fn location<'left, 'right, I>(&mut self, uri: I) -> crate::Result<&mut Self>
where
I: Into<ReqResBuilderInput<'left, 'right>>,
{
self.rrb.push_header(KnownHeaderName::Location.into(), uri)?;
Ok(self)
}
#[inline]
pub fn set_cookie<'left, 'right, I>(&mut self, cookie: I) -> crate::Result<&mut Self>
where
I: Into<ReqResBuilderInput<'left, 'right>>,
{
self.rrb.push_header(KnownHeaderName::SetCookie.into(), cookie)?;
Ok(self)
}
#[inline]
pub fn cache_control<'left, 'right, I>(&mut self, policy: I) -> crate::Result<&mut Self>
where
I: Into<ReqResBuilderInput<'left, 'right>>,
{
self.rrb.push_header(KnownHeaderName::CacheControl.into(), policy)?;
Ok(self)
}
}
impl<RRD> Default for ResBuilder<RRD>
where
RRD: Default,
{
#[inline]
fn default() -> Self {
Self::ok(RRD::default())
}
}
impl<RRD> AsMut<ResBuilder<RRD>> for ResBuilder<RRD> {
#[inline]
fn as_mut(&mut self) -> &mut ResBuilder<RRD> {
self
}
}
impl<RRD> AsRef<ResBuilder<RRD>> for ResBuilder<RRD> {
#[inline]
fn as_ref(&self) -> &ResBuilder<RRD> {
self
}
}
impl<RRD> Deref for ResBuilder<RRD> {
type Target = ReqResBuilder<RRD>;
#[inline]
fn deref(&self) -> &Self::Target {
&self.rrb
}
}
impl<RRD> DerefMut for ResBuilder<RRD> {
#[inline]
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.rrb
}
}