use crate::http::headers::LOCATION;
use crate::{StatusCode, Context};
use crate::{Endpoint, Response};
#[derive(Debug, Clone)]
pub struct Redirect<T: AsRef<str>> {
status: StatusCode,
location: T,
}
impl<T: AsRef<str>> Redirect<T> {
pub fn new(location: T) -> Self {
Self {
status: StatusCode::Found,
location,
}
}
pub fn permanent(location: T) -> Self {
Self {
status: StatusCode::PermanentRedirect,
location,
}
}
pub fn temporary(location: T) -> Self {
Self {
status: StatusCode::TemporaryRedirect,
location,
}
}
pub fn see_other(location: T) -> Self {
Self {
status: StatusCode::SeeOther,
location,
}
}
}
#[cfg(test)]
mod test {
use super::*;
use crate::*;
#[test]
fn smoke() {
let redirect = Redirect::new("https://example.com");
let res: Response = redirect.clone().into();
assert_eq!(res.status(), StatusCode::Found);
let redirect = Redirect::temporary("https://example.com");
let res: Response = redirect.clone().into();
assert_eq!(res.status(), StatusCode::TemporaryRedirect);
let redirect = Redirect::permanent("https://example.com");
let res: Response = redirect.clone().into();
assert_eq!(res.status(), StatusCode::PermanentRedirect);
let redirect = Redirect::see_other("https://example.com");
let res: Response = redirect.clone().into();
assert_eq!(res.status(), StatusCode::SeeOther);
}
}