5 releases

0.2.0 Jan 8, 2022
0.1.4 Dec 30, 2019
0.1.2 Sep 19, 2018

#56 in Value formatting

Download history 12769/week @ 2023-10-22 11772/week @ 2023-10-29 10671/week @ 2023-11-05 10277/week @ 2023-11-12 7923/week @ 2023-11-19 11362/week @ 2023-11-26 11259/week @ 2023-12-03 9916/week @ 2023-12-10 9637/week @ 2023-12-17 5818/week @ 2023-12-24 9844/week @ 2023-12-31 13770/week @ 2024-01-07 14079/week @ 2024-01-14 15087/week @ 2024-01-21 14730/week @ 2024-01-28 12305/week @ 2024-02-04

57,625 downloads per month
Used in 31 crates (29 directly)


506 lines

tabular: plain text tables in Rust

Build Status Crates.io License: MIT License: Apache 2.0 Documentation (latest release) Documentation (main)

Builds plain, automatically-aligned tables of monospaced text. This is basically what you want if you are implementing ls.


use tabular::{Table, Row};
use std::path::Path;

fn ls(dir: &Path) -> ::std::io::Result<()> {
    let mut table = Table::new("{:>}  {:<}{:<}  {:<}");
    for entry_result in ::std::fs::read_dir(dir)? {
        let entry    = entry_result?;
        let metadata = entry.metadata()?;

             .with_cell(if metadata.permissions().readonly() {"r"} else {""})
             .with_cell(if metadata.is_dir() {"d"} else {""})

    print!("{}", table);



produces something like

1198     target/.rustc_info.json
1120  d  target/doc
 192  d  target/package
1056  d  target/debug

Other features

  • The Table::with_heading() and Table::add_heading() methods add lines that span all columns.

  • The row! macro builds a row with a fixed number of columns using less syntax.

  • The Table::set_line_end() method allows changing the line ending to include a carriage return (or whatever you want).

  • With the ansi-cell feature enabled, the Row::with_ansi_cell and Row::add_ansi_cell methods can be used to add cells with ANSI color codes, and still have their widths be computed correctly.

  • The Row::with_custom_width_cell and Row::add_custom_width_cell methods can be used to customize alignment precisely.


It's on crates.io, so you can add

tabular = "0.2.0"

to your Cargo.toml.


  • unicode-width: enabled by default; depends on the unicode-width crate.

    With the unicode-width feature enabled, default alignment is based on [Unicode Standard Annex #11], with characters in the Ambiguous category considered to be 1 column wide.

    Without it, default alignment is based on the count of the std::str::Chars iterator.

  • ansi-cell: disabled by default; depends on the strip-ansi-escapes crate. Provides the with_ansi_cell and add_ansi_cell methods.

Minimum supported Rust version

The minimum supported Rust version (MSRV) of this crate is Rust 1.46.0. The MSRV may be bumped in a patch release.

See also

You may also want:

  • text-tables – This is more automatic than tabular. You give it an array of arrays, it renders a nice table with borders. Tabular doesn't do borders.

  • prettytable — This has an API more similar to tabular’s in terms of building a table, but it does a lot more, including, color, borders, and CSV import.