diff --git a/src/main.rs b/src/main.rs index fbf09b4..d47e151 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,6 +2,7 @@ extern crate rocket; use rocket::fs::FileServer; +use rocket::futures::FutureExt; use rocket::response::Redirect; use rocket::State; use rocket_dyn_templates::tera; @@ -86,28 +87,45 @@ async fn show_question_details( cache: &TemplateCache, id: usize, ) -> Template { - if let Some(value) = cache.get(&id) { - return value.render(template_name); - } + let cache_cloned = cache.clone(); - match get_question(&data.db, id).await { - Ok(question) => { - let mut context = tera::to_value(question).expect("question serialize"); - if context.is_object() { - let next_id = random_question_id(&data.database_distribution); - context["next"] = tera::to_value(next_id).expect("question id serialize"); + let from_cache = rocket::tokio::spawn(async move { cache_cloned.get(&id) }).fuse(); + let from_db = async move { + match get_question(&data.db, id).await { + Ok(question) => { + let mut context = tera::to_value(question).expect("question serialize"); + if context.is_object() { + let next_id = random_question_id(&data.database_distribution); + context["next"] = tera::to_value(next_id).expect("question id serialize"); + } + + let value = ArcTemplateData::new(context); + let result = value.render(template_name); + cache.insert(id, value); + + result + } + Err(_) => { + use std::collections::HashMap; + let context: HashMap = HashMap::new(); + Template::render("404", context) } - - let value = ArcTemplateData::new(context); - let result = value.render(template_name); - cache.insert(id, value); - - result } - Err(_) => { - use std::collections::HashMap; - let context: HashMap = HashMap::new(); - Template::render("404", context) + } + .fuse(); + + loop { + rocket::tokio::select! { + biased; + + Ok(Some(template)) = from_cache => { + println!("from cache"); + break template.render(template_name) + }, + template = from_db => { + println!("from db"); + break template + } } } }