#pretty-print #printing #pretty #debugging #rust

pprint

Rust的灵活轻量级美化打印库

4个版本

0.2.2 2024年6月27日
0.2.1 2023年8月8日
0.2.0 2023年8月8日
0.1.0 2023年8月8日

334文本处理

每月 49 次下载

MIT 协议

26KB
590

pprint

使用文档模型进行美观打印的Rust库。自动为结构体、枚举和原始类型推导出Pretty;默认支持向量类型和映射类型;与derive(Debug)宏非常相似,只是更美观且更可配置。

使用方法

use pprint::{Doc, Printer, PRINTER};

let doc = Doc::from(vec![1, 2, 3])
    .wrap("[", "]")
    .join(", ");

print!("{}", PRINTER.pretty(doc));
// prints:
// [
//   1,
//   2,
//   3
// ]

文档模型

文档模型提供了一套丰富的构建块

  • 原始值,如字符串、数字
  • 容器,如向量、元组、映射、集合
  • 格式化,如concatjoinwrapgroup
  • 使用indentdedent控制缩进
  • 使用if_break进行条件格式化
  • 使用hardlinesoftline进行换行

Printer处理将Doc美化打印到字符串,具有可配置的选项

  • max_width - 每行最大宽度
  • indent - 每个缩进级别的空格数
  • break_long_text - 为长文本插入换行
  • use_tabs - 使用制表符而不是空格进行缩进

推导宏

库的开发时间的一半用于推导宏,使得几乎任何类型的打印都非常容易。以下是一个简单的例子

#[derive(Pretty)]
struct Point {
    x: f64,
    y: f64
}

let point = Point { x: 1.0, y: 2.0 };
print!("{}", Doc::from(point)); // prints "(x: 1, y: 2)"

Pretty支持一个额外的属性,pprint,用于自定义对象的打印定义。以下是一些选项

  • skip: bool: 跳过此字段 - 不要将其包括在输出中
  • indent: bool: 缩进此字段 - 在前后添加换行和缩进
  • rename: Option: 重命名此字段 - 使用给定的字符串作为字段名
  • getter: Option: 使用给定的函数获取此字段的值
  • verbose: bool: 详细输出 - 在输出中包含字段名
#[derive(Pretty)]
#[pprint(verbose)]
struct Point {
    #[pprint(rename = "x-coordinate")]
    x: f64,
    #[pprint(rename = "y-coordinate")]
    y: f64
    #[pprint(skip)]
    _skip_me: bool,
}

let point = Point { x: 1.0, y: 2.0, _skip_me: true };
print!("{}", Doc::from(point));

// prints:
// Point {
//   x-coordinate: 1,
//   y-coordinate: 2
// }

结构可以任意嵌套,& c. & c. 更复杂的例子可以在测试文件中找到。

关于

这个库部分是为了学习Rust的过程宏而创建的,部分是因为我非常喜欢格式化打印。它还在不断完善中,但到目前为止我对此相当满意。如果您有任何建议,请随时提出问题或发起拉取请求。

值得注意的是,text_justify函数的实现是基于麻省理工学院6.006课程《算法导论》中精彩的讲座系列(特别是第20讲)。这是一个简单而相当优雅的算法,我在实践中发现它非常有效。

依赖项

~3.5–4.5MB
~88K SLoC