Browse Source

[rust/viz]: improve query and fortunes (#8502)

Fangdun Tsai 1 year ago
parent
commit
d3516bcd01

+ 1 - 0
frameworks/Rust/viz/.gitignore

@@ -1,2 +1,3 @@
 .cargo
 target
+Cargo.lock

+ 5 - 2
frameworks/Rust/viz/src/db_pg.rs

@@ -1,7 +1,8 @@
 use std::{borrow::Cow, collections::HashMap, fmt::Write, io, sync::Arc};
 
-use futures_util::{stream::FuturesUnordered, TryFutureExt, TryStreamExt};
+use futures_util::{stream::FuturesUnordered, StreamExt, TryFutureExt, TryStreamExt};
 use rand::{rngs::SmallRng, thread_rng, Rng, SeedableRng};
+use tokio::pin;
 use tokio_postgres::{connect, types::ToSql, Client, NoTls, Statement};
 use viz::{Error, IntoResponse, Response, StatusCode};
 
@@ -94,7 +95,9 @@ impl PgConnection {
 
 impl PgConnection {
     async fn query_one_world(&self, id: i32) -> Result<World, PgError> {
-        let row = self.client.query_one(&self.world, &[&id]).await?;
+        let stream = self.client.query_raw(&self.world, &[&id]).await?;
+        pin!(stream);
+        let row = stream.next().await.unwrap()?;
         Ok(World {
             id: row.get(0),
             randomnumber: row.get(1),

+ 12 - 3
frameworks/Rust/viz/src/main_pg.rs

@@ -8,7 +8,7 @@ use viz::{
     types::State,
     Request, RequestExt, Response, ResponseExt, Result, Router, ServiceMaker,
 };
-use yarte::ywrite_html;
+use yarte::Template;
 
 mod db_pg;
 mod models;
@@ -17,6 +17,12 @@ mod utils;
 
 use db_pg::{get_conn, PgConnection};
 
+#[derive(Template)]
+#[template(path = "fortune.hbs")]
+pub struct FortunesTemplate<'a> {
+    pub fortunes: &'a Vec<models::Fortune>,
+}
+
 const DB_URL: &str =
     "postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world";
 
@@ -36,8 +42,11 @@ async fn fortunes(req: Request) -> Result<Response> {
 
     let fortunes = conn.tell_fortune().await?;
 
-    let mut buf = String::with_capacity(2048);
-    ywrite_html!(buf, "{{> fortune }}");
+    let buf = FortunesTemplate {
+        fortunes: &fortunes,
+    }
+    .call()
+    .expect("error rendering template");
 
     let mut res = Response::html(buf);
     res.headers_mut()