]> saetta.ns0.it Git - rust/zakgrid/commitdiff
Function row_from_json.
authorAndrea Zagli <azagli@libero.it>
Wed, 4 Jan 2023 13:53:17 +0000 (14:53 +0100)
committerAndrea Zagli <azagli@libero.it>
Wed, 4 Jan 2023 13:53:17 +0000 (14:53 +0100)
Cargo.toml
examples/grid.db [new file with mode: 0644]
examples/grid.rs
src/lib.rs

index 036a3f98a2aafb7c8f0ed5475f8df9d3d1a63b2a..d6c75d966527fcdc63aafa773e91425aec15fe54 100644 (file)
@@ -9,10 +9,12 @@ edition = "2021"
 [dependencies]
 serde = "1"
 serde_derive = "1"
+serde_json = "1"
 tera = "1.8.0"
 
 
 [dev-dependencies]
 config = "0.13"
-
 actix-web = "4"
+futures = "0.3"
+sqlx = { version = "0.6", features = [ "runtime-async-std-native-tls", "sqlite" ] }
diff --git a/examples/grid.db b/examples/grid.db
new file mode 100644 (file)
index 0000000..9a0e890
Binary files /dev/null and b/examples/grid.db differ
index d1f6189b3d2abcd5d7e0287ad3ec31d0921d7e60..09dc5e9737dbe54faa44511474280f2d1bb21a21 100644 (file)
@@ -12,6 +12,10 @@ use actix_web::{
     web, App, Error, HttpResponse, HttpServer, Responder, Result,
 };
 
+use futures::TryStreamExt;
+use sqlx::{Connection, SqliteConnection, Row, Column};
+use std::str::FromStr;
+
 #[derive(Debug, Deserialize)]
 #[allow(unused)]
 struct Http {
@@ -53,18 +57,26 @@ async fn index(
        s.push_str("<html>");
        s.push_str("<body>");
 
-       let mut col = zakgrid::Column::new("col name");
+       let mut col = zakgrid::Column::new("id");
        s.push_str(format!("column added: {}<br/>\n", col.name()).as_str());
        col.set_title("the column title");
        s.push_str(format!("column changed title: {}<br/>\n", col.title()).as_str());
        grid.add_column(col);
 
-       let mut col = zakgrid::Column::new("col2 name");
+       let mut col = zakgrid::Column::new("name");
        col.set_title("the second column title");
        grid.add_column(col);
 
-       let mut col = grid.get_column("col2 name").unwrap();
+       let mut col = zakgrid::Column::new("surname");
+       grid.add_column(col);
+
+       let mut col = zakgrid::Column::new("age");
        col.set_align(zakgrid::Align::Right);
+       grid.add_column(col);
+
+       let mut col = zakgrid::Column::new("income");
+       col.set_align(zakgrid::Align::Right);
+       grid.add_column(col);
 
        let cols = grid.columns();
 
@@ -76,6 +88,26 @@ async fn index(
        s.push_str("<table style='border: 1px solid;'>\n");
        let header = grid.header();
        s.push_str(header.as_str());
+
+       let mut conn = SqliteConnection::connect("examples/grid.db").await.unwrap();
+
+       let mut rows = sqlx::query("SELECT * FROM clients").fetch(&mut conn);
+       while let Some(row) = rows.try_next().await.unwrap() {
+               let cols = row.columns();
+
+               let mut r = String::new();
+               r.push_str("{");
+               for col in cols {
+                       let s: &str = row.try_get_unchecked(col.name()).unwrap();
+                       r.push_str(format!("\"{}\": \"{}\",", col.name(), s).as_str());
+               }
+               r.truncate(r.len() - 1);
+               r.push_str("}");
+
+               let val = serde_json::Value::from_str(r.as_str()).unwrap();
+               s.push_str(grid.row_from_json(&val).as_str());
+       }
+
        s.push_str("</table>\n");
 
        s.push_str("</body>\n");
index 7088ef4b04f9c5834e9e1d32ea92ee7ec56c4357..b161b661112402a2596f208ef57d0020d7ac7620 100644 (file)
@@ -1,3 +1,4 @@
+use serde_json::Value;
 use serde_derive::Serialize;
 use tera::Tera;
 
@@ -128,4 +129,26 @@ impl Grid {
                context.insert("row", s.as_str());
                String::from(tera.render("header", &context).unwrap().as_str())
        }
+
+       pub fn row_from_json(&self, value: &serde_json::Value) -> String {
+               let mut s = String::new();
+
+               let mut tera = Tera::default();
+
+               tera.add_raw_template("row", &self.row_tmpl);
+               tera.add_raw_template("row_col", &self.row_col_tmpl);
+
+               for c in &self.columns {
+                       if !c.hidden {
+                               let mut context = tera::Context::new();
+                               context.insert("value", &value[c.name.as_str()]);
+                               context.insert("align", &c.align);
+                               s.push_str(tera.render("row_col", &context).unwrap().as_str());
+                       }
+               }
+
+               let mut context = tera::Context::new();
+               context.insert("row", s.as_str());
+               String::from(tera.render("row", &context).unwrap().as_str())
+       }
 }