From cae6b0c97ffa84b8360cf605b2116f171ac277c4 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Sun, 20 Aug 2023 13:17:52 +0300 Subject: [PATCH] add json routes --- src/main.rs | 74 +++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 63 insertions(+), 11 deletions(-) diff --git a/src/main.rs b/src/main.rs index b7ab9b0..6519446 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,7 +3,10 @@ extern crate rocket; use rocket::fs::FileServer; use rocket::fs::Options; +use rocket::http::ContentType; +use rocket::request::Request; use rocket::response::Redirect; +use rocket::response::{self, Responder, Response}; use rocket::State; use rocket_dyn_templates::tera; use rocket_dyn_templates::Template; @@ -54,11 +57,21 @@ impl WebError { } } +/// wrapper for terra:Value (json, context), to cache values by ref +/// implements Responder as json content type #[derive(Clone)] struct ArcTemplateData { value: Arc, } +impl Deref for ArcTemplateData { + type Target = tera::Value; + + fn deref(&self) -> &Self::Target { + self.value.deref() + } +} + impl ArcTemplateData { fn new(value: tera::Value) -> ArcTemplateData { ArcTemplateData { @@ -66,7 +79,15 @@ impl ArcTemplateData { } } fn render(&self, name: &'static str) -> Template { - Template::render(name, self.value.deref()) + Template::render(name, self.deref()) + } +} + +impl<'r> Responder<'r, 'static> for ArcTemplateData { + fn respond_to(self, req: &'r Request<'_>) -> response::Result<'static> { + Response::build_from(self.to_string().respond_to(req)?) + .header(ContentType::JSON) + .ok() } } @@ -101,14 +122,13 @@ async fn get_question(db: &DataBase, id: usize) -> Result { db.get(id - 1).await.err_empty() } -async fn show_question_details( - template_name: &'static str, +async fn get_question_data( data: &AppState, cache: &TemplateCache, id: usize, -) -> Option