summaryrefslogtreecommitdiffstats
path: root/src/db
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2020-11-03 18:09:58 +0100
committerMatthias Beyer <mail@beyermatthias.de>2020-11-03 18:16:48 +0100
commit61851845eeb918ecae253b9391a33315ee204d1c (patch)
tree6337c53757607d0214b2f53bde66f2a704d39ef6 /src/db
parent130b1f5b807e56ddbffdf6ab219c2b9eff0ed8f4 (diff)
Add subcommand to show all artifacts from db
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
Diffstat (limited to 'src/db')
-rw-r--r--src/db/cli.rs4
-rw-r--r--src/db/interface.rs57
2 files changed, 61 insertions, 0 deletions
diff --git a/src/db/cli.rs b/src/db/cli.rs
index a762d4b..445df3e 100644
--- a/src/db/cli.rs
+++ b/src/db/cli.rs
@@ -31,5 +31,9 @@ pub fn cli<'a>() -> App<'a> {
)
)
+ .subcommand(App::new("artifacts")
+ .about("List artifacts from the DB")
+ )
+
}
diff --git a/src/db/interface.rs b/src/db/interface.rs
index 65a46ad..d745c9e 100644
--- a/src/db/interface.rs
+++ b/src/db/interface.rs
@@ -1,4 +1,5 @@
use std::path::PathBuf;
+use std::fmt::Display;
use clap_v3 as clap;
use clap::ArgMatches;
@@ -13,6 +14,7 @@ use crate::db::DbConnectionConfig;
pub fn interface(db_connection_config: DbConnectionConfig, matches: &ArgMatches, config: &Configuration) -> Result<()> {
match matches.subcommand() {
("cli", Some(matches)) => cli(db_connection_config, matches, config),
+ ("artifacts", Some(matches)) => artifacts(db_connection_config),
(other, _) => return Err(anyhow!("Unknown subcommand: {}", other)),
}
}
@@ -108,3 +110,58 @@ fn cli(db_connection_config: DbConnectionConfig, matches: &ArgMatches, config: &
.ok_or_else(|| anyhow!("No Program found"))?
.run_for_uri(db_connection_config)
}
+
+fn artifacts(conn_cfg: DbConnectionConfig) -> Result<()> {
+ use diesel::RunQueryDsl;
+ use crate::schema::artifacts::dsl;
+ use crate::db::models;
+
+ let hdrs = vec![
+ {
+ let mut column = ascii_table::Column::default();
+ column.header = "Id".into();
+ column.align = ascii_table::Align::Left;
+ column
+ },
+ {
+ let mut column = ascii_table::Column::default();
+ column.header = "Path".into();
+ column.align = ascii_table::Align::Left;
+ column
+ }
+ ];
+
+ let connection = crate::db::establish_connection(conn_cfg)?;
+ let data = dsl::artifacts
+ .load::<models::Artifact>(&connection)?
+ .into_iter()
+ .map(|artifact| {
+ vec![format!("{}", artifact.id), artifact.path]
+ })
+ .collect::<Vec<_>>();
+
+ if data.is_empty() {
+ info!("No artifacts in database");
+ } else {
+ display_as_table(hdrs, data);
+ }
+
+ Ok(())
+}
+
+fn display_as_table<D: Display>(headers: Vec<ascii_table::Column>, data: Vec<Vec<D>>) {
+ let mut ascii_table = ascii_table::AsciiTable::default();
+
+ ascii_table.max_width = terminal_size::terminal_size()
+ .map(|tpl| tpl.0.0 as usize) // an ugly interface indeed!
+ .unwrap_or(80);
+
+ headers.into_iter()
+ .enumerate()
+ .for_each(|(i, c)| {
+ ascii_table.columns.insert(i, c);
+ });
+
+ ascii_table.print(data);
+}
+