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 命令行界面
33KB
684 行代码
TableStream
将数据流送到终端并以ASCII表格的形式显示。
TableStream将首先缓冲一些行,并使用这些行自动确定列的适当宽度。它将尝试自动检测当前终端的宽度,并将行适应到该宽度。
之后,它将清除缓冲区,并将数据直接流式传输到输出。(io::Write
)
请参阅API文档中的代码示例。从crates.io进行安装。
当前限制
- 无法处理从右到左的文字。(在终端中处理这个有建议吗?)
- 不支持表情符号。
- 孟加拉语似乎在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