nushell/src/format/table.rs

76 lines
1.8 KiB
Rust
Raw Normal View History

2019-05-10 18:59:12 +02:00
use crate::format::RenderView;
use crate::object::Value;
2019-05-23 06:30:43 +02:00
use crate::prelude::*;
2019-05-10 18:59:12 +02:00
use derive_new::new;
use prettytable::{color, Attr, Cell, Row, Table};
2019-05-10 18:59:12 +02:00
// An entries list is printed like this:
//
// name : ...
// name2 : ...
// another_name : ...
#[derive(new)]
pub struct TableView {
headers: Vec<String>,
entries: Vec<Vec<String>>,
}
impl TableView {
pub fn from_list(values: &[Value]) -> Option<TableView> {
if values.len() == 0 {
return None;
}
let item = &values[0];
let descs = item.data_descriptors();
let headers: Vec<String> = descs.iter().map(|d| d.name.display().to_string()).collect();
2019-05-10 18:59:12 +02:00
let mut entries = vec![];
for value in values {
let row = descs
.iter()
.enumerate()
.map(|(i, d)| value.get_data(d).borrow().format_leaf(Some(&headers[i])))
2019-05-10 18:59:12 +02:00
.collect();
entries.push(row);
}
Some(TableView { headers, entries })
}
}
impl RenderView for TableView {
fn render_view(&self, host: &mut dyn Host) -> Result<(), ShellError> {
2019-05-10 18:59:12 +02:00
if self.entries.len() == 0 {
return Ok(());
2019-05-10 18:59:12 +02:00
}
let mut table = Table::new();
table.set_format(*prettytable::format::consts::FORMAT_NO_COLSEP);
let header: Vec<Cell> = self
.headers
.iter()
.map(|h| {
Cell::new(h)
.with_style(Attr::ForegroundColor(color::GREEN))
.with_style(Attr::Bold)
})
.collect();
2019-05-10 18:59:12 +02:00
table.add_row(Row::new(header));
for row in &self.entries {
table.add_row(Row::new(row.iter().map(|h| Cell::new(h)).collect()));
}
table.print_term(&mut *host.out_terminal()).unwrap();
2019-05-10 18:59:12 +02:00
Ok(())
2019-05-10 18:59:12 +02:00
}
}