1#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))]
2#![deny(elided_lifetimes_in_paths)]
3#![deny(unreachable_pub)]
4
5use std::io::Cursor;
6
7#[doc(no_inline)]
8pub use rinja::*;
9#[doc(no_inline)]
10pub use rocket;
11use rocket::Response;
12
13#[inline]
14pub fn respond<T: ?Sized + rinja::Template>(tmpl: &T) -> rocket::response::Result<'static> {
15 try_into_response(tmpl).map_err(|_| rocket::http::Status::InternalServerError)
16}
17
18#[must_use]
20pub fn into_response<T: ?Sized + rinja::Template>(tmpl: &T) -> Response<'static> {
21 match try_into_response(tmpl) {
22 Ok(response) => response,
23 Err(err) => {
24 let value = err.to_string();
25 Response::build()
26 .status(rocket::http::Status::InternalServerError)
27 .header(rocket::http::Header::new(
28 "content-type",
29 "text/plain; charset=utf-8",
30 ))
31 .sized_body(value.len(), Cursor::new(value))
32 .finalize()
33 }
34 }
35}
36
37pub fn try_into_response<T: ?Sized + rinja::Template>(
39 tmpl: &T,
40) -> Result<Response<'static>, Error> {
41 let value = tmpl.render()?;
42 Ok(Response::build()
43 .header(rocket::http::Header::new("content-type", T::MIME_TYPE))
44 .sized_body(value.len(), Cursor::new(value))
45 .finalize())
46}