An easy to use library for pretty print tables of Rust struct
s and enum
s.
To print a list of structs or enums as a table.
Implement Tabled
trait for your struct/enum with or annotate it with a #[derive(Tabled)]
macro. Then call a table
macro.
```rust use tabled::{Tabled, table};
struct Language { name: &'static str, designedby: &'static str, inventedyear: usize, }
let languages = vec![ Language{ name: "C", designedby: "Dennis Ritchie", inventedyear: 1972 }, Language{ name: "Rust", designedby: "Graydon Hoare", inventedyear: 2010 }, Language{ name: "Go", designedby: "Rob Pike", inventedyear: 2009 }, ];
let table = table!(&languages); let expected = "+------+----------------+---------------+\n\ | name | designedby | inventedyear |\n\ +------+----------------+---------------+\n\ | C | Dennis Ritchie | 1972 |\n\ +------+----------------+---------------+\n\ | Rust | Graydon Hoare | 2010 |\n\ +------+----------------+---------------+\n\ | Go | Rob Pike | 2009 |\n\ +------+----------------+---------------+\n";
assert_eq!(expected, table); ```
To be able to use a Tabled
macro each field should implement std::fmt::Display
otherwise it will not work.
The following example will cause a error.
```rust,compile_fail use tabled::Tabled;
struct SomeType { field1: SomeOtherType, }
struct SomeOtherType; ```
Most of the default types implements the trait out of the box.
rust
use tabled::table;
let some_numbers = [1, 2, 3];
let table = table!(&some_numbers);
A list of ready to use styles. A shocases for the data in the Usage section.
Styles can be chosen by passing a Style
argument like this to table!
macro.
rust
let table = table!(&data, Style::Psql);
,
+------+----------------+---------------+
| name | designed_by | invented_year |
+------+----------------+---------------+
| C | Dennis Ritchie | 1972 |
+------+----------------+---------------+
| Rust | Graydon Hoare | 2010 |
+------+----------------+---------------+
| Go | Rob Pike | 2009 |
+------+----------------+---------------+
name | designed_by | invented_year
------+----------------+---------------
C | Dennis Ritchie | 1972
Rust | Graydon Hoare | 2010
Go | Rob Pike | 2009
| name | designed_by | invented_year |
|------+----------------+---------------|
| C | Dennis Ritchie | 1972 |
| Rust | Graydon Hoare | 2010 |
| Go | Rob Pike | 2009 |
┌──────┬────────────────┬───────────────┐
│ name │ designed_by │ invented_year │
├──────┼────────────────┼───────────────┤
│ C │ Dennis Ritchie │ 1972 │
├──────┼────────────────┼───────────────┤
│ Rust │ Graydon Hoare │ 2010 │
├──────┼────────────────┼───────────────┤
│ Go │ Rob Pike │ 2009 │
└──────┴────────────────┴───────────────┘
┌──────┬────────────────┬───────────────┐
│ name │ designed_by │ invented_year │
├──────┼────────────────┼───────────────┤
│ C │ Dennis Ritchie │ 1972 │
│ Rust │ Graydon Hoare │ 2010 │
│ Go │ Rob Pike │ 2009 │
└──────┴────────────────┴───────────────┘
name designed_by invented_year
C Dennis Ritchie 1972
Rust Graydon Hoare 2010
Go Rob Pike 2009
You can set a alignemt for a Header, Column, Row or All Cells.
table!(
&data,
Style::Psql,
HorizontalAlignment::new(Alignment::Left, AlignmentObject::Full)
);
Change function provides an interface for a smart modification of cells. Even though it may look ugly at first.
let table = table!(
&data,
Style::Psql,
ChangeRing(
Column(..),
vec![
Box::new(|s| { format!("<< {} >>", s) }),
Box::new(|s| { format!("!! {} !!", s) }),
]
),
);
The library doesn't bind you in usage of any color library but to be able to work corectly with color input you should provide a --features color
.
The folowing change on the script in the usage and it's result
let table = table!(
&data,
Style::Psql,
ChangeRing(
Column(..),
vec![
Box::new(|s| { s.red().to_string() }),
Box::new(|s| { s.blue().to_string() }),
Box::new(|s| { s.green().to_string() }),
]
),
);
You can use a #[header("")]
attribute to override a column name.
```
struct Person { #[header("Name")] firstname: &'static str, #[header("Surname")] lastname: &'static str, } ```
You also can combine objets which implements Tabled
by means of tuples, you will get a combined columns of them.
```rust use tabled::{Tabled, table, Style};
enum Domain { Security, Embeded, Frontend, Unknown, }
struct Developer(#[header("name")] &'static str);
let data = vec![ (Developer("Terri Kshlerin"), Domain::Embeded), (Developer("Catalina Dicki"), Domain::Security), (Developer("Jennie Schmeler"), Domain::Frontend), (Developer("Maxim Zhiburt"), Domain::Unknown), ];
let table = table!(data, Style::Psql);
assert_eq!( table, concat!( " name | Security | Embeded | Frontend | Unknown \n", "-----------------+----------+---------+----------+---------\n", " Terri Kshlerin | | + | | \n", " Catalina Dicki | + | | | \n", " Jennie Schmeler | | | + | \n", " Maxim Zhiburt | | | | + \n" ) ); ```