rinja_rocket/
lib.rs

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/// Render a [`Template`] into a [`Response`], or render an error page.
19#[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
37/// Try to render a [`Template`] into a [`Response`].
38pub 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}