use crate::response::Response;
use crate::Result;
use hyper::{Body, StatusCode};
use serde::Serialize;
pub trait Responder {
fn into_response(self) -> Result<Response>;
}
impl Responder for StatusCode {
fn into_response(self) -> Result<Response> {
Ok(Response::status(self))
}
}
impl Responder for String {
fn into_response(self) -> Result<Response> {
Ok(Response::ok().body(self))
}
}
impl Responder for &str {
fn into_response(self) -> Result<Response> {
Ok(Response::ok().body(self.to_owned()))
}
}
impl Responder for &[u8] {
fn into_response(self) -> Result<Response> {
Ok(Response::ok().body(self.to_vec()))
}
}
impl Responder for Vec<u8> {
fn into_response(self) -> Result<Response> {
Ok(Response::ok().body(self))
}
}
impl<R: Responder> Responder for (StatusCode, R) {
fn into_response(self) -> Result<Response> {
let mut resp = self.1.into_response()?;
resp.set_status(self.0);
Ok(resp)
}
}
impl<R: Responder> Responder for Option<R> {
fn into_response(self) -> Result<Response> {
match self {
None => StatusCode::NOT_FOUND.into_response(),
Some(r) => r.into_response(),
}
}
}
pub struct Json<T: Serialize>(pub T);
impl<T: Serialize> Responder for Json<T> {
fn into_response(self) -> Result<Response> {
Response::ok().json(self.0)
}
}
pub struct Form<T: Serialize>(pub T);
impl<T: Serialize> Responder for Form<T> {
fn into_response(self) -> Result<Response> {
Response::ok().form(self.0)
}
}
impl Responder for Response {
fn into_response(self) -> Result<Response> {
Ok(self)
}
}
impl Responder for hyper::Response<Body> {
fn into_response(self) -> Result<Response> {
Ok(self.into())
}
}
impl<R: Responder> Responder for Result<R> {
fn into_response(self) -> Result<Response> {
self.and_then(|r| r.into_response())
}
}