1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
use anyhow::Result;
use dbui_core::database::results::ResultSet;
use dbui_core::field_type::FieldType;
use dbui_service::{RequestContext, Router};
use maud::{html, Markup};

pub fn results(ctx: &RequestContext, router: &dyn Router, sql: &str, result: &ResultSet) -> Result<Markup> {
  let content = html! {
    div.uk-section.uk-section-small {
      div.uk-container {
        div.uk-text-center {
          h1.uk-heading-hero {
            "SQL Results"
          }
        }
        div {
          (crate::card(&ctx, html! {
            pre { (sql) }
          }))
          div.uk-margin-top {
            (crate::card(&ctx, html! {
              table.uk-table.uk-table-divider.uk-text-left {
                thead {
                  tr {
                    @for c in result.columns() {
                      th { (c.name()) }
                    }
                  }
                }
                tbody {
                  @if result.data().is_empty() {
                    tr {
                      td colspan=(if result.columns().is_empty() { 1 } else { result.columns().len() }) { "No rows returned" }
                    }
                  }
                  @for row in result.data() {
                    tr {
                      @for cell in result.columns().iter().zip(row) {
                        td { (write_field(cell.0.t(), cell.1)) }
                      }
                    }
                  }
                }
              }
            }))
          }
        }
      }
    }
  };
  crate::simple(ctx, router, "SQL Results", content)
}

fn write_field(ft: &FieldType, v: &Option<String>) -> Markup {
  match *ft {
    FieldType::Json => html! { pre { (v.as_ref().unwrap_or(&"∅".to_string())) } },
    _ => html! { (v.as_ref().unwrap_or(&"∅".to_string())) }
  }
}