Browse Source

[Viz]: v0.7.0 (#8658)

Fangdun Tsai 1 year ago
parent
commit
04c882eaaa

+ 4 - 3
frameworks/Rust/viz/Cargo.toml

@@ -24,8 +24,9 @@ path = "src/main_diesel.rs"
 required-features = ["diesel", "diesel-async", "sailfish"]
 required-features = ["diesel", "diesel-async", "sailfish"]
 
 
 [dependencies]
 [dependencies]
-viz = "0.4"
-hyper = "0.14"
+viz = "0.7"
+hyper = "1.0"
+hyper-util = "0.1"
 atoi = "2.0"
 atoi = "2.0"
 serde = { version = "1.0", features = ["derive"] }
 serde = { version = "1.0", features = ["derive"] }
 nanorand = "0.7"
 nanorand = "0.7"
@@ -50,7 +51,7 @@ diesel-async = { version = "0.4", default-features = false, features = [
 ], optional = true }
 ], optional = true }
 
 
 yarte = { version = "0.15", features = ["bytes-buf", "json"], optional = true }
 yarte = { version = "0.15", features = ["bytes-buf", "json"], optional = true }
-markup = { version = "0.13", optional = true }
+markup = { version = "0.15", optional = true }
 v_htmlescape = { version = "0.15", optional = true }
 v_htmlescape = { version = "0.15", optional = true }
 sailfish = { version = "0.8", optional = true }
 sailfish = { version = "0.8", optional = true }
 
 

+ 1 - 3
frameworks/Rust/viz/src/db_diesel.rs

@@ -1,5 +1,3 @@
-use std::borrow::Cow;
-
 use diesel::prelude::*;
 use diesel::prelude::*;
 use diesel_async::{
 use diesel_async::{
     pooled_connection::bb8::{Pool, RunError},
     pooled_connection::bb8::{Pool, RunError},
@@ -112,7 +110,7 @@ pub async fn tell_fortune(pool: Pool<AsyncPgConnection>) -> Result<String, PgErr
 
 
     items.push(Fortune {
     items.push(Fortune {
         id: 0,
         id: 0,
-        message: Cow::Borrowed("Additional fortune added at request time."),
+        message: "Additional fortune added at request time.".to_string(),
     });
     });
     items.sort_by(|it, next| it.message.cmp(&next.message));
     items.sort_by(|it, next| it.message.cmp(&next.message));
 
 

+ 3 - 3
frameworks/Rust/viz/src/db_pg.rs

@@ -1,4 +1,4 @@
-use std::{borrow::Cow, collections::HashMap, fmt::Write, io, sync::Arc};
+use std::{collections::HashMap, fmt::Write, io, sync::Arc};
 
 
 use futures_util::{stream::FuturesUnordered, StreamExt, TryFutureExt, TryStreamExt};
 use futures_util::{stream::FuturesUnordered, StreamExt, TryFutureExt, TryStreamExt};
 use rand::{rngs::SmallRng, thread_rng, Rng, SeedableRng};
 use rand::{rngs::SmallRng, thread_rng, Rng, SeedableRng};
@@ -162,7 +162,7 @@ impl PgConnection {
     pub async fn tell_fortune(&self) -> Result<Vec<Fortune>, PgError> {
     pub async fn tell_fortune(&self) -> Result<Vec<Fortune>, PgError> {
         let mut items = vec![Fortune {
         let mut items = vec![Fortune {
             id: 0,
             id: 0,
-            message: Cow::Borrowed("Additional fortune added at request time."),
+            message: "Additional fortune added at request time.".to_string(),
         }];
         }];
 
 
         let stream = self
         let stream = self
@@ -176,7 +176,7 @@ impl PgConnection {
 
 
             items.push(Fortune {
             items.push(Fortune {
                 id: row.get(0),
                 id: row.get(0),
-                message: Cow::Owned(row.get(1)),
+                message: row.get(1),
             });
             });
         }
         }
 
 

+ 2 - 4
frameworks/Rust/viz/src/db_sqlx.rs

@@ -1,5 +1,3 @@
-use std::borrow::Cow;
-
 use nanorand::{Rng, WyRand};
 use nanorand::{Rng, WyRand};
 
 
 pub use sqlx::{
 pub use sqlx::{
@@ -110,14 +108,14 @@ pub async fn get_fortunes(
     let mut items = sqlx::query("SELECT * FROM Fortune")
     let mut items = sqlx::query("SELECT * FROM Fortune")
         .map(|row: PgRow| Fortune {
         .map(|row: PgRow| Fortune {
             id: row.get(0),
             id: row.get(0),
-            message: Cow::Owned(row.get(1)),
+            message: row.get(1),
         })
         })
         .fetch_all(&mut *conn)
         .fetch_all(&mut *conn)
         .await?;
         .await?;
 
 
     items.push(Fortune {
     items.push(Fortune {
         id: 0,
         id: 0,
-        message: Cow::Borrowed("Additional fortune added at request time."),
+        message: "Additional fortune added at request time.".to_string(),
     });
     });
 
 
     items.sort_by(|it, next| it.message.cmp(&next.message));
     items.sort_by(|it, next| it.message.cmp(&next.message));

+ 4 - 6
frameworks/Rust/viz/src/main.rs

@@ -3,7 +3,7 @@
 use serde::Serialize;
 use serde::Serialize;
 use viz::{
 use viz::{
     header::{HeaderValue, SERVER},
     header::{HeaderValue, SERVER},
-    Error, Request, Response, ResponseExt, Result, Router, ServiceMaker,
+    Error, Request, Response, ResponseExt, Result, Router, Tree,
 };
 };
 
 
 mod server;
 mod server;
@@ -36,9 +36,7 @@ async fn main() -> Result<()> {
         .get("/plaintext", plaintext)
         .get("/plaintext", plaintext)
         .get("/json", json);
         .get("/json", json);
 
 
-    server::builder()
-        .http1_pipeline_flush(true)
-        .serve(ServiceMaker::from(app))
-        .await
-        .map_err(Error::normal)
+    let tree = Tree::from(app);
+
+    server::serve(tree).await.map_err(Error::Boxed)
 }
 }

+ 3 - 7
frameworks/Rust/viz/src/main_diesel.rs

@@ -11,7 +11,7 @@ use nanorand::{Rng, WyRand};
 use viz::{
 use viz::{
     header::{HeaderValue, SERVER},
     header::{HeaderValue, SERVER},
     types::State,
     types::State,
-    Request, RequestExt, Response, ResponseExt, Result, Router, ServiceMaker,
+    Request, RequestExt, Response, ResponseExt, Result, Router, Tree,
 };
 };
 
 
 mod db_diesel;
 mod db_diesel;
@@ -89,7 +89,7 @@ async fn main() {
 
 
     let rng = WyRand::new();
     let rng = WyRand::new();
 
 
-    let service = ServiceMaker::from(
+    let tree = Tree::from(
         Router::new()
         Router::new()
             .get("/db", db)
             .get("/db", db)
             .get("/fortunes", fortunes)
             .get("/fortunes", fortunes)
@@ -99,9 +99,5 @@ async fn main() {
             .with(State::new(rng)),
             .with(State::new(rng)),
     );
     );
 
 
-    serve(service).await;
-}
-
-async fn serve(service: ServiceMaker) {
-    server::builder().serve(service).await.unwrap()
+    server::serve(tree).await.unwrap()
 }
 }

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

@@ -6,7 +6,7 @@ use std::{
 use viz::{
 use viz::{
     header::{HeaderValue, SERVER},
     header::{HeaderValue, SERVER},
     types::State,
     types::State,
-    Request, RequestExt, Response, ResponseExt, Result, Router, ServiceMaker,
+    Request, RequestExt, Response, ResponseExt, Result, Router, Tree,
 };
 };
 use yarte::Template;
 use yarte::Template;
 
 
@@ -19,8 +19,8 @@ use db_pg::{get_conn, PgConnection};
 
 
 #[derive(Template)]
 #[derive(Template)]
 #[template(path = "fortune.hbs")]
 #[template(path = "fortune.hbs")]
-pub struct FortunesTemplate<'a> {
-    pub fortunes: &'a Vec<models::Fortune>,
+pub struct FortunesTemplate {
+    pub fortunes: Vec<models::Fortune>,
 }
 }
 
 
 const DB_URL: &str =
 const DB_URL: &str =
@@ -42,11 +42,9 @@ async fn fortunes(req: Request) -> Result<Response> {
 
 
     let fortunes = conn.tell_fortune().await?;
     let fortunes = conn.tell_fortune().await?;
 
 
-    let buf = FortunesTemplate {
-        fortunes: &fortunes,
-    }
-    .call()
-    .expect("error rendering template");
+    let buf = FortunesTemplate { fortunes }
+        .call()
+        .expect("error rendering template");
 
 
     let mut res = Response::html(buf);
     let mut res = Response::html(buf);
     res.headers_mut()
     res.headers_mut()
@@ -107,8 +105,5 @@ async fn serve() {
         .get("/updates", updates)
         .get("/updates", updates)
         .with(State::new(conn));
         .with(State::new(conn));
 
 
-    server::builder()
-        .serve(ServiceMaker::from(app))
-        .await
-        .unwrap()
+    server::serve(Tree::from(app)).await.unwrap()
 }
 }

+ 2 - 6
frameworks/Rust/viz/src/main_sqlx.rs

@@ -4,8 +4,7 @@ use nanorand::{Rng, WyRand};
 use viz::{
 use viz::{
     header::{HeaderValue, SERVER},
     header::{HeaderValue, SERVER},
     types::State,
     types::State,
-    BytesMut, Error, Request, RequestExt, Response, ResponseExt, Result, Router,
-    ServiceMaker,
+    BytesMut, Error, Request, RequestExt, Response, ResponseExt, Result, Router, Tree,
 };
 };
 
 
 mod db_sqlx;
 mod db_sqlx;
@@ -101,10 +100,7 @@ async fn main() -> Result<()> {
         .with(State::new(pool))
         .with(State::new(pool))
         .with(State::new(rng));
         .with(State::new(rng));
 
 
-    server::builder()
-        .serve(ServiceMaker::from(app))
-        .await
-        .map_err(Error::normal)
+    server::serve(Tree::from(app)).await.map_err(Error::Boxed)
 }
 }
 
 
 markup::define! {
 markup::define! {

+ 1 - 3
frameworks/Rust/viz/src/models.rs

@@ -1,5 +1,3 @@
-use std::borrow::Cow;
-
 use serde::Serialize;
 use serde::Serialize;
 
 
 #[derive(Serialize, Debug, yarte::Serialize)]
 #[derive(Serialize, Debug, yarte::Serialize)]
@@ -11,5 +9,5 @@ pub struct World {
 #[derive(Serialize, Debug)]
 #[derive(Serialize, Debug)]
 pub struct Fortune {
 pub struct Fortune {
     pub id: i32,
     pub id: i32,
-    pub message: Cow<'static, str>,
+    pub message: String,
 }
 }

+ 1 - 3
frameworks/Rust/viz/src/models_diesel.rs

@@ -1,5 +1,3 @@
-use std::borrow::Cow;
-
 use diesel::Queryable;
 use diesel::Queryable;
 use sailfish::TemplateOnce;
 use sailfish::TemplateOnce;
 use serde::Serialize;
 use serde::Serialize;
@@ -13,7 +11,7 @@ pub struct World {
 #[derive(Serialize, Queryable, Debug)]
 #[derive(Serialize, Queryable, Debug)]
 pub struct Fortune {
 pub struct Fortune {
     pub id: i32,
     pub id: i32,
-    pub message: Cow<'static, str>,
+    pub message: String,
 }
 }
 
 
 #[derive(TemplateOnce)]
 #[derive(TemplateOnce)]

+ 1 - 3
frameworks/Rust/viz/src/models_sqlx.rs

@@ -1,5 +1,3 @@
-use std::borrow::Cow;
-
 use serde::{Deserialize, Serialize};
 use serde::{Deserialize, Serialize};
 use sqlx::FromRow;
 use sqlx::FromRow;
 
 
@@ -12,5 +10,5 @@ pub struct World {
 #[derive(Debug, PartialEq, Deserialize, Serialize, FromRow)]
 #[derive(Debug, PartialEq, Deserialize, Serialize, FromRow)]
 pub struct Fortune {
 pub struct Fortune {
     pub id: i32,
     pub id: i32,
-    pub message: Cow<'static, str>,
+    pub message: String,
 }
 }

+ 19 - 6
frameworks/Rust/viz/src/server.rs

@@ -1,19 +1,32 @@
+use std::error::Error;
 use std::io;
 use std::io;
 use std::net::{Ipv4Addr, SocketAddr};
 use std::net::{Ipv4Addr, SocketAddr};
+use std::sync::Arc;
 
 
-use hyper::server::conn::AddrIncoming;
+use hyper::server::conn::http1::Builder;
+use hyper_util::rt::TokioIo;
 use tokio::net::{TcpListener, TcpSocket};
 use tokio::net::{TcpListener, TcpSocket};
 
 
-pub fn builder() -> hyper::server::Builder<AddrIncoming> {
+pub async fn serve(tree: viz::Tree) -> Result<(), Box<dyn Error + Send + Sync>> {
+    let tree = Arc::new(tree);
     let addr = SocketAddr::from((Ipv4Addr::UNSPECIFIED, 8080));
     let addr = SocketAddr::from((Ipv4Addr::UNSPECIFIED, 8080));
     let listener = reuse_listener(addr).expect("couldn't bind to addr");
     let listener = reuse_listener(addr).expect("couldn't bind to addr");
-    let incoming = AddrIncoming::from_listener(listener).unwrap();
 
 
     println!("Started viz server at 8080");
     println!("Started viz server at 8080");
 
 
-    viz::Server::builder(incoming)
-        .http1_only(true)
-        .tcp_nodelay(true)
+    loop {
+        let (tcp, _) = listener.accept().await?;
+        let io = TokioIo::new(tcp);
+        let tree = tree.clone();
+
+        tokio::task::spawn(async move {
+            Builder::new()
+                .pipeline_flush(true)
+                .serve_connection(io, viz::Responder::new(tree, None))
+                .with_upgrades()
+                .await
+        });
+    }
 }
 }
 
 
 fn reuse_listener(addr: SocketAddr) -> io::Result<TcpListener> {
 fn reuse_listener(addr: SocketAddr) -> io::Result<TcpListener> {

+ 1 - 1
frameworks/Rust/viz/viz-diesel.dockerfile

@@ -1,4 +1,4 @@
-FROM rust:1.72
+FROM rust:1.74.1
 
 
 RUN apt-get update -yqq && apt-get install -yqq cmake g++
 RUN apt-get update -yqq && apt-get install -yqq cmake g++
 
 

+ 1 - 1
frameworks/Rust/viz/viz-pg.dockerfile

@@ -1,4 +1,4 @@
-FROM rust:1.72
+FROM rust:1.74.1
 
 
 RUN apt-get update -yqq && apt-get install -yqq cmake g++
 RUN apt-get update -yqq && apt-get install -yqq cmake g++
 
 

+ 1 - 1
frameworks/Rust/viz/viz-sqlx.dockerfile

@@ -1,4 +1,4 @@
-FROM rust:1.72
+FROM rust:1.74.1
 
 
 RUN apt-get update -yqq && apt-get install -yqq cmake g++
 RUN apt-get update -yqq && apt-get install -yqq cmake g++
 
 

+ 1 - 1
frameworks/Rust/viz/viz.dockerfile

@@ -1,4 +1,4 @@
-FROM rust:1.72
+FROM rust:1.74.1
 
 
 RUN apt-get update -yqq && apt-get install -yqq cmake g++
 RUN apt-get update -yqq && apt-get install -yqq cmake g++