#table #format #cli #command-line

cli-table-derive

一个用于在命令行中打印表格的crate

7 个版本

0.4.6 2024年7月1日
0.4.5 2022年4月13日
0.4.4 2021年3月5日
0.4.3 2021年2月25日
0.4.0 2020年12月10日

#501#table

Download history 7116/week @ 2024-05-03 7953/week @ 2024-05-10 7377/week @ 2024-05-17 6811/week @ 2024-05-24 8198/week @ 2024-05-31 7360/week @ 2024-06-07 7274/week @ 2024-06-14 7974/week @ 2024-06-21 7587/week @ 2024-06-28 7428/week @ 2024-07-05 9315/week @ 2024-07-12 7964/week @ 2024-07-19 8506/week @ 2024-07-26 6044/week @ 2024-08-02 7531/week @ 2024-08-09 7826/week @ 2024-08-16

31,554 每月下载量
2 个crate中使用 (通过 cli-table)

MIT/Apache

26KB
475

cli-table

Continuous Integration Crates.io Documentation License

Rust crate,用于在命令行中打印表格。

使用方法

在您的 Cargo.toms 文件的 dependencies 部分添加 cli-table

[dependencies]
cli-table = "0.4"

简单使用

use cli_table::{format::Justify, print_stdout, Cell, Style, Table};

let table = vec![
    vec!["Tom".cell(), 10.cell().justify(Justify::Right)],
    vec!["Jerry".cell(), 15.cell().justify(Justify::Right)],
    vec!["Scooby Doo".cell(), 20.cell().justify(Justify::Right)],
]
.table()
.title(vec![
    "Name".cell().bold(true),
    "Age (in years)".cell().bold(true),
])
.bold(true);

assert!(print_stdout(table).is_ok());

以下是刚刚创建的表格的输出

+------------+----------------+
| Name       | Age (in years) |  <-- This row and all the borders/separators
+------------+----------------+      will appear in bold
| Tom        |             10 |
+------------+----------------+
| Jerry      |             15 |
+------------+----------------+
| Scooby Doo |             25 |
+------------+----------------+

Display trait 实现

要获取 TableStructDisplay trait 实现,请使用该结构体上的 display() 函数来获取一个实现 Display trait 的 TableDisplay 实例。

use cli_table::{format::Justify, Cell, Style, Table};

let table = vec![
    vec!["Tom".cell(), 10.cell().justify(Justify::Right)],
    vec!["Jerry".cell(), 15.cell().justify(Justify::Right)],
    vec!["Scooby Doo".cell(), 20.cell().justify(Justify::Right)],
]
.table()
.title(vec![
    "Name".cell().bold(true),
    "Age (in years)".cell().bold(true),
])
.bold(true);

let table_display = table.display().unwrap();

println!("{}", table_display);

以下是刚刚创建的表格的输出

+------------+----------------+
| Name       | Age (in years) |  <-- This row and all the borders/separators
+------------+----------------+      will appear in bold
| Tom        |             10 |
+------------+----------------+
| Jerry      |             15 |
+------------+----------------+
| Scooby Doo |             25 |
+------------+----------------+

派生宏

#[derive(Table)] 也可以用来打印 Vec 或结构体的切片作为表格。

use cli_table::{format::Justify, print_stdout, Table, WithTitle};

#[derive(Table)]
struct User {
    #[table(title = "ID", justify = "Justify::Right")]
    id: u64,
    #[table(title = "First Name")]
    first_name: &'static str,
    #[table(title = "Last Name")]
    last_name: &'static str,
}

let users = vec![
    User {
        id: 1,
        first_name: "Scooby",
        last_name: "Doo",
    },
    User {
        id: 2,
        first_name: "John",
        last_name: "Cena",
    },
];

assert!(print_stdout(users.with_title()).is_ok());

以下是使用派生宏创建的表格的输出

+----+------------+-----------+
| ID | First Name | Last Name |  <-- This row will appear in bold
+----+------------+-----------+
|  1 | Scooby     | Doo       |
+----+------------+-----------+
|  2 | John       | Cena      |
+----+------------+-----------+

字段属性

  • title | name:用于指定列的标题。用法:#[table(title = ""Title")]
  • justify:用于水平对齐列的内容。用法:#[table(justify = ""Justify::Right")]
  • align:用于垂直对齐列的内容。用法:#[table(align = "Align::Top")]
  • color:用于指定列内容的颜色。用法:#[table(color = "Color::Red")]
  • bold:用于指定列内容的粗细。用法:#[table(bold)]
  • order:用于打印表格时对列进行排序。用法:#[table(order = <usize>)]。这里,列将根据其顺序进行排序。例如,具有 order = 0 的列将显示在左侧,然后是具有 order = 1 的列,依此类推。
  • display_fn:用于打印未实现 Display 特性的类型。用法:#[table(display_fn = "<func_name>")]。提供的函数的签名应该是 fn <func_name>(value: &<type>) -> impl Display
  • customize_fn:用于自定义单元格样式。用法:#[table(customize_fn = "<func_name>")]。提供函数的签名应为:fn <func_name>) for TableStruct。此属性可用于根据单元格内容更改格式/样式。请注意,这将覆盖其他属性所做的所有样式设置。
  • skip:用于从表中跳过一个字段。用法:#[table(skip)]

有关 derive 宏上可用的配置的更多信息,请参阅 cli-table/examples/struct.rs

CSV

此 crate 还集成了 csv crate。启用 "csv" 功能后,您可以使用 TryFrom<&mut Reader> for TableStruct trait 实现将 csv::Reader 转换为 TableStruct

有关处理 CSV 值的更多信息,请参阅 cli-table/examples/csv.rs

样式

可以通过调用 Style trait 的函数来修改表/单元格的样式。它由 TableStructCellStruct 实现。

对于单独格式化表的每个单元格,可以使用来自 CellStructjustifyalignpadding 函数。

此外,还可以通过在 TableStruct 中调用 borderseparator 函数来自定义表格的边框和分隔符。例如,要创建一个无边框的表格

use cli_table::{Cell, Table, TableStruct, format::{Justify, Border}, print_stdout};

fn get_table() -> TableStruct {
    vec![
        vec!["Tom".cell(), 10.cell().justify(Justify::Right)],
        vec!["Jerry".cell(), 15.cell().justify(Justify::Right)],
        vec!["Scooby Doo".cell(), 20.cell().justify(Justify::Right)],
    ]
    .table()
}

let table = get_table().border(Border::builder().build()); // Attaches an empty border to the table
assert!(print_stdout(table).is_ok());

功能

  • derive:启用用于使用结构体创建表的 derive 宏。默认启用。
  • csv:启用使用 csv 打印表格的支持。默认启用。

许可证

根据您的选择,许可协议如下

贡献

除非您明确说明,否则根据Apache-2.0许可证定义,您有意提交的任何贡献,旨在包含在作品中,应双重许可如上所述,不附加任何其他条款或条件。

依赖项

~1.5MB
~35K SLoC