Groups
Groups express M:N relationships between lines — multiple lines can be “members” of a group, and other lines can be “children” of that group. The print engine draws bracket connectors on the left margin.
Members and children
use cols::{Table, Column, TermForce, print_table};
fn main() {
let mut t = Table::new();
t.termwidth_set(40);
t.termforce_set(TermForce::Always);
t.headings_set(false);
t.new_column("PROCESS");
t.add_column(Column::new("PID").right(true));
let g = t.new_group();
let m1 = t.new_line(None);
t.line_mut(m1).data_set(0, "server").data_set(1, "100");
let m2 = t.new_line(None);
t.line_mut(m2).data_set(0, "worker").data_set(1, "101");
let c1 = t.new_line(None);
t.line_mut(c1).data_set(0, "logger").data_set(1, "200");
let c2 = t.new_line(None);
t.line_mut(c2).data_set(0, "monitor").data_set(1, "201");
t.group_add_member(g, m1);
t.group_add_member(g, m2);
t.group_add_child(g, c1);
t.group_add_child(g, c2);
print_table(&t, &mut std::io::stdout().lock()).unwrap();
}
┌─server 100
├─worker 101
├─logger 200
└─monitor 201
Members only
Groups can also have only members (no children):
use cols::{Table, Column, TermForce, print_table};
fn main() {
let mut t = Table::new();
t.termwidth_set(40);
t.termforce_set(TermForce::Always);
t.headings_set(false);
t.new_column("NAME");
t.add_column(Column::new("SIZE").right(true));
let g = t.new_group();
let l1 = t.new_line(None);
t.line_mut(l1).data_set(0, "alpha").data_set(1, "10");
let l2 = t.new_line(None);
t.line_mut(l2).data_set(0, "beta").data_set(1, "20");
let l3 = t.new_line(None);
t.line_mut(l3).data_set(0, "gamma").data_set(1, "30");
t.group_add_member(g, l1);
t.group_add_member(g, l2);
t.group_add_member(g, l3);
print_table(&t, &mut std::io::stdout().lock()).unwrap();
}
┌─alpha 10
├─beta 20
└─gamma 30
Symbols
┌─— first member├─— middle member or child└─— last member or last child│— vertical connector between members/children
Lines between members that aren’t part of the group get vertical connectors.
Terminal requirement
Group rendering requires a terminal width to compute the margin. Set TermForce::Always and an explicit termwidth for deterministic output in tests.