use http::StatusCode;
use http::header::LOCATION;
use crate::body::TakoBody;
use crate::responder::Responder;
use crate::types::Response;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Redirect {
status: StatusCode,
location: String,
}
impl Redirect {
#[inline]
#[must_use]
pub fn with_status(location: impl Into<String>, status: StatusCode) -> Self {
Self {
status,
location: location.into(),
}
}
#[inline]
#[must_use]
pub fn found(location: impl Into<String>) -> Self {
Self::with_status(location, StatusCode::FOUND)
}
#[inline]
#[must_use]
pub fn see_other(location: impl Into<String>) -> Self {
Self::with_status(location, StatusCode::SEE_OTHER)
}
#[inline]
#[must_use]
pub fn temporary(location: impl Into<String>) -> Self {
Self::with_status(location, StatusCode::TEMPORARY_REDIRECT)
}
#[inline]
#[must_use]
pub fn permanent_moved(location: impl Into<String>) -> Self {
Self::with_status(location, StatusCode::MOVED_PERMANENTLY)
}
#[inline]
#[must_use]
pub fn permanent(location: impl Into<String>) -> Self {
Self::with_status(location, StatusCode::PERMANENT_REDIRECT)
}
}
impl Responder for Redirect {
fn into_response(self) -> Response {
http::Response::builder()
.status(self.status)
.header(LOCATION, self.location)
.body(TakoBody::empty())
.unwrap()
}
}
pub fn found(location: impl Into<String>) -> Redirect {
Redirect::found(location)
}
pub fn see_other(location: impl Into<String>) -> Redirect {
Redirect::see_other(location)
}
pub fn temporary(location: impl Into<String>) -> Redirect {
Redirect::temporary(location)
}
pub fn permanent_moved(location: impl Into<String>) -> Redirect {
Redirect::permanent_moved(location)
}
pub fn permanent(location: impl Into<String>) -> Redirect {
Redirect::permanent(location)
}