use crate::error::{Result, RouteError};
use axum::http::{HeaderMap, HeaderValue, StatusCode, header};
use serde::Serialize;
use super::Response;
pub fn json<T: Serialize>(data: T) -> Result<Response> {
let body = serde_json::to_vec(&data)
.map_err(|e| RouteError::Internal(anyhow::anyhow!("Failed to serialize JSON: {e}")))?;
let mut headers = HeaderMap::new();
headers.insert(
header::CONTENT_TYPE,
HeaderValue::from_static("application/json"),
);
Ok(Response {
status: StatusCode::OK,
headers,
body,
})
}
pub fn text(content: impl Into<String>) -> Response {
let body = content.into();
let mut headers = HeaderMap::new();
headers.insert(
header::CONTENT_TYPE,
HeaderValue::from_static("text/plain; charset=utf-8"),
);
Response {
status: StatusCode::OK,
headers,
body: body.into_bytes(),
}
}
pub fn html(content: impl Into<String>) -> Response {
let body = content.into();
let mut headers = HeaderMap::new();
headers.insert(
header::CONTENT_TYPE,
HeaderValue::from_static("text/html; charset=utf-8"),
);
Response {
status: StatusCode::OK,
headers,
body: body.into_bytes(),
}
}
pub fn redirect(url: &str) -> Result<Response> {
let value = HeaderValue::try_from(url)
.map_err(|_| RouteError::bad_request(format!("Invalid redirect URL: {url}")))?;
let mut headers = HeaderMap::new();
headers.insert(header::LOCATION, value);
Ok(Response {
status: StatusCode::FOUND,
headers,
body: Vec::new(),
})
}
#[must_use]
pub fn no_content() -> Response {
Response {
status: StatusCode::NO_CONTENT,
headers: HeaderMap::new(),
body: Vec::new(),
}
}
#[must_use]
pub fn bytes(data: Vec<u8>) -> Response {
Response {
status: StatusCode::OK,
headers: HeaderMap::new(),
body: data,
}
}