diff options
author | Matthias Beyer <mail@beyermatthias.de> | 2020-11-03 18:09:58 +0100 |
---|---|---|
committer | Matthias Beyer <mail@beyermatthias.de> | 2020-11-03 18:16:48 +0100 |
commit | 61851845eeb918ecae253b9391a33315ee204d1c (patch) | |
tree | 6337c53757607d0214b2f53bde66f2a704d39ef6 /src/db | |
parent | 130b1f5b807e56ddbffdf6ab219c2b9eff0ed8f4 (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.rs | 4 | ||||
-rw-r--r-- | src/db/interface.rs | 57 |
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); +} + |