Render an aligned plain-text table in Groovy
Groovy
def render(List<Map> rows, List<String> columns) {
List<List<String>> cells = [columns] + rows.collect { row ->
columns.collect { col -> row[col]?.toString() ?: '' }
}
List<Integer> widths = (0..<columns.size()).collect { i ->
cells.collect { it[i].length() }.max()
}
String rule = widths.collect { '-' * it }.join('-+-')
def formatRow = { List<String> values ->
(0..<values.size()).collect { i -> values[i].padRight(widths[i]) }.join(' | ')
}
List<String> lines = [formatRow(columns), rule]
lines.addAll(cells.drop(1).collect(formatRow))
lines
}
def data = [[name: 'alpha', size: 12], [name: 'b', size: 340]]
render(data, ['name', 'size']).each { println it }