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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
use std::io::stdout;
use lister::Lister;
use error::Result;
use error::ResultExt;
use libimagstore::store::FileLockEntry;
use prettytable::Table;
use prettytable::cell::Cell;
use prettytable::row::Row;
pub struct TableLister<F: Fn(&FileLockEntry) -> Vec<String>> {
line_generator: F,
header: Option<Vec<String>>,
with_idx: bool,
print_empty: bool,
}
impl<F: Fn(&FileLockEntry) -> Vec<String>> TableLister<F> {
pub fn new(gen: F) -> TableLister<F> {
TableLister {
line_generator: gen,
header: None,
with_idx: true,
print_empty: false,
}
}
pub fn with_header(mut self, hdr: Vec<String>) -> TableLister<F> {
self.header = Some(hdr);
self
}
pub fn with_idx(mut self, b: bool) -> TableLister<F> {
self.with_idx = b;
self
}
pub fn print_empty(mut self, b: bool) -> TableLister<F> {
self.print_empty = b;
self
}
}
impl<F: Fn(&FileLockEntry) -> Vec<String>> Lister for TableLister<F> {
fn list<'b, I: Iterator<Item = FileLockEntry<'b>>>(&self, entries: I) -> Result<()> {
use error::ListErrorKind as LEK;
use error::ListError as LE;
let mut table = Table::new();
let mut header_len : Option<usize> = None;
match self.header {
Some(ref s) => {
debug!("We have a header... preparing");
let mut cells : Vec<Cell> = s.iter().map(|s| Cell::new(s)).collect();
if self.with_idx {
cells.insert(0, Cell::new("#"));
}
table.set_titles(Row::new(cells));
header_len = Some(s.len());
},
None => {
debug!("No header for table found... continuing without");
},
}
let mut entries_added = 0;
entries.enumerate().fold(Ok(table), |table, (i, entry)| {
table.and_then(|mut table| {
let mut v = (self.line_generator)(&entry);
{
let v_len = v.len();
if header_len.is_none() {
header_len = Some(v_len);
}
if header_len.map(|l| v_len > l).unwrap_or(false) {
return Err(LE::from_kind(LEK::FormatError));
}
while header_len.map(|l| v.len() != l).unwrap_or(false) {
v.push(String::from(""));
}
}
if self.with_idx {
v.insert(0, format!("{}", i));
}
table.add_row(v.iter().map(|s| Cell::new(s)).collect());
entries_added += 1;
Ok(table)
})
})
.and_then(|tbl| {
if entries_added != 0 && !self.print_empty {
let mut io = stdout();
tbl.print(&mut io).chain_err(|| LEK::IOError)
} else {
Ok(())
}
})
}
}