wtx 0.47.2

A collection of different transport implementations and related tools focused primarily on web technologies.
Documentation
use crate::http::{
  KnownHeaderName, ReqResBuilder, ReqResBuilderInput, ReqResDataMut, Response, StatusCode, Version,
};
use core::ops::{Deref, DerefMut};

/// Response builder
///
/// Provides shortcuts to manipulate responses through a fluent interface.
#[derive(Debug)]
pub struct ResBuilder<RRD> {
  /// Generic builder
  rrb: ReqResBuilder<RRD>,
  /// Status code
  status_code: StatusCode,
  /// See [`Version`].
  version: Version,
}

impl<RRD> ResBuilder<RRD> {
  /// A new empty response with a 400 Bad Request status code.
  #[inline]
  pub const fn bad_request(rrd: RRD) -> Self {
    Self {
      rrb: ReqResBuilder::new(rrd),
      status_code: StatusCode::BadRequest,
      version: Version::Http2,
    }
  }

  /// A new empty response with a 201 Created status code.
  #[inline]
  pub const fn created(rrd: RRD) -> Self {
    Self { rrb: ReqResBuilder::new(rrd), status_code: StatusCode::Created, version: Version::Http2 }
  }

  /// A new empty response with a 500 Internal Server Error status code.
  #[inline]
  pub const fn internal_server_error(rrd: RRD) -> Self {
    Self {
      rrb: ReqResBuilder::new(rrd),
      status_code: StatusCode::InternalServerError,
      version: Version::Http2,
    }
  }

  /// A new empty response with a 404 Not Found status code.
  #[inline]
  pub const fn not_found(rrd: RRD) -> Self {
    Self {
      rrb: ReqResBuilder::new(rrd),
      status_code: StatusCode::NotFound,
      version: Version::Http2,
    }
  }

  /// A new empty response with a 200 OK status code.
  #[inline]
  pub const fn ok(rrd: RRD) -> Self {
    Self { rrb: ReqResBuilder::new(rrd), status_code: StatusCode::Ok, version: Version::Http2 }
  }

  /// Shortcut that converts this instance into a [`Response`].
  #[inline]
  pub fn into_response(self) -> Response<RRD> {
    Response::new(self.rrb.rrd, self.status_code, self.version)
  }

  /// Changes the status code
  #[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,
{
  /// Sets the `Location` header, typically used with 3xx redirect status codes.
  #[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)
  }

  /// Sets the `Set-Cookie` header.
  #[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)
  }

  /// Sets the `Cache-Control` header.
  #[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
  }
}