4个版本

0.1.3 2021年8月6日
0.1.2 2021年8月6日
0.1.1 2021年8月5日
0.1.0 2021年8月5日

#915 in 命令行界面

MIT/Apache

33KB
684 行代码

TableStream

将数据流送到终端并以ASCII表格的形式显示。

TableStream将首先缓冲一些行,并使用这些行自动确定列的适当宽度。它将尝试自动检测当前终端的宽度,并将行适应到该宽度。

之后,它将清除缓冲区,并将数据直接流式传输到输出。(io::Write

请参阅API文档中的代码示例。从crates.io进行安装。

Exmaple GIF

当前限制

  • 无法处理从右到左的文字。(在终端中处理这个有建议吗?)
  • 不支持表情符号。
  • 孟加拉语似乎在Windows终端中无法正确渲染,因此不支持。(虽然也许在其他地方可以工作?)

未来功能?

  • 可以添加颜色选项。

lib.rs:

TableStream是一个将表格流输出到终端的工具。在首次输出之前,它将缓冲一定数量的行,并尝试自动确定每列的适当宽度。

// Some sample data we want to show:
struct City {
    name: String,
    country: String,
    population: u32,
}

impl City {
    fn new(name: &str, country: &str, population: u32) -> Self {
        Self { name: name.to_string(), country: country.to_string(), population, }
    }
}

fn largest_cities() -> Vec<City> {
   vec![
       City::new("Shanghai", "China", 24_150_000),
       City::new("Beijing", "China", 21_700_000),
       City::new("Lagos", "Nigeria", 21_320_000),
   ]
}

let mut out = io::stdout();
let mut stream = Stream::new(&mut out, vec![
    // There are three different ways to specify which data to show in each column.
    // 1. A closure that takes a formatter, and a reference to your type, and writes it out.
    Column::new(|f, c: &City| write!(f, "{}", &c.name)).header("City"),
     
    // 2. Or we can use a shortcut macro to just show a single field:
    // (It must implement fmt::Display)
    col!(City: .country).header("Country"),

    // 3. You can optionally specify a formatter:
    // (Note: don't use padding/alignment in your formatters. TableStream will do that for you.)
    col!(City: "{:.2e}", .population).header("Population"),
]);

// Stream our data:
for city in largest_cities() {
   stream.row(city)?;
}

stream.finish()?;
 

依赖项

~2.5MB
~37K SLoC