summaryrefslogtreecommitdiffstats
path: root/src/commands/util.rs
diff options
context:
space:
mode:
authorMatthias Beyer <matthias.beyer@atos.net>2021-03-05 16:16:06 +0100
committerMatthias Beyer <mail@beyermatthias.de>2021-03-07 21:50:29 +0100
commit61fb91fe4a4e0302b97aff777e68a98d15989da0 (patch)
treea887366e10e36c0ed03aaf6b18d9c3968d588686 /src/commands/util.rs
parent407379afeced6fd3185d054bacd097f4c126ebe3 (diff)
Move display_data() helper to commands::util
Signed-off-by: Matthias Beyer <matthias.beyer@atos.net>
Diffstat (limited to 'src/commands/util.rs')
-rw-r--r--src/commands/util.rs52
1 files changed, 51 insertions, 1 deletions
diff --git a/src/commands/util.rs b/src/commands/util.rs
index 1660c5d..3b63c1d 100644
--- a/src/commands/util.rs
+++ b/src/commands/util.rs
@@ -8,13 +8,16 @@
// SPDX-License-Identifier: EPL-2.0
//
+use std::io::Write;
+use std::fmt::Display;
use std::path::Path;
-use anyhow::Error;
use anyhow::Context;
+use anyhow::Error;
use anyhow::Result;
use anyhow::anyhow;
use clap::ArgMatches;
+use itertools::Itertools;
use log::{error, info, trace};
use regex::Regex;
use tokio_stream::StreamExt;
@@ -159,3 +162,50 @@ pub fn mk_header(vec: Vec<&str>) -> Vec<ascii_table::Column> {
.collect()
}
+/// Display the passed data as nice ascii table,
+/// or, if stdout is a pipe, print it nicely parseable
+pub fn display_data<D: Display>(
+ headers: Vec<ascii_table::Column>,
+ data: Vec<Vec<D>>,
+ csv: bool,
+) -> Result<()> {
+ if csv {
+ use csv::WriterBuilder;
+ let mut wtr = WriterBuilder::new().from_writer(vec![]);
+ for record in data.into_iter() {
+ let r: Vec<String> = record.into_iter().map(|e| e.to_string()).collect();
+
+ wtr.write_record(&r)?;
+ }
+
+ let out = std::io::stdout();
+ let mut lock = out.lock();
+
+ wtr.into_inner()
+ .map_err(Error::from)
+ .and_then(|t| String::from_utf8(t).map_err(Error::from))
+ .and_then(|text| writeln!(lock, "{}", text).map_err(Error::from))
+ } else if atty::is(atty::Stream::Stdout) {
+ let mut ascii_table = ascii_table::AsciiTable {
+ columns: Default::default(),
+ 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);
+ Ok(())
+ } else {
+ let out = std::io::stdout();
+ let mut lock = out.lock();
+ for list in data {
+ writeln!(lock, "{}", list.iter().map(|d| d.to_string()).join(" "))?;
+ }
+ Ok(())
+ }
+}
+