Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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.