此文件为 AI 助手在处理本仓库代码时提供指南与上下文。
当前状态: 活跃开发中 | 主要语言: Rust
语言约定: 为了便于指导,本文件 (AGENTS.md) 使用中文编写,且与用户交流时请使用中文。但项目代码中的
所有文档注释 (doc comments)、行内注释以及提交信息必须使用英文。
tva 是一个高性能的命令行 TSV (Tab-Separated Values) 数据处理工具集。它旨在提供类 Unix
的文本处理体验,专注于流式处理、高性能和易用性。
核心设计哲学是“流式优先”,尽量以 O(1) 内存处理大数据。
# 开发构建
cargo build
# 发布构建 (高性能)
cargo build --release# 运行所有测试
cargo testsrc/tva.rs- 主程序入口,负责命令行解析和分发。- Uses
clapfor argument parsing. - Enforces consistent flag naming and help text styles.
- Uses
src/lib.rs- 库入口,导出模块。src/cmd_tva/- 命令实现模块。- Selection & Sampling:
sample,select,slice - Filtering:
filter - Ordering:
reverse,sort,transpose - Statistics & Summary:
bin,stats,uniq - Reshaping:
blank,fill,longer,wider - Combining & Splitting:
append,join,split - Formatting & Utilities:
check,header,keep_header,nl - Expression:
expr - Plotting:
plot/(bin2d,box,point) - Import:
from/(csv,html,xlsx) - Export:
to/(csv,md,xlsx)
- Selection & Sampling:
src/libs/- 共享工具库和核心逻辑。aggregation/- SoA 聚合引擎 (stats)。aggregator.rs: 扁平状态存储;processor.rs: 执行器;ops/: 算子实现;math.rs: 数学函数。
cell.rs- AoS 聚合单元 (wider), 动态类型状态容器。cli.rs- CLI 参数工具 (header_args,header_args_with_columns)。expr/- 表达式引擎 (expr命令)。parser/: Pest 解析器 (grammar.pest, ast.rs);runtime/: 求值引擎 (value.rs);functions/: 内置函数库。
filter/- 过滤引擎。config.rs: 配置;builder.rs: 测试链构建;engine.rs: 核心求值;runner.rs: 执行主循环。io.rs- I/O 辅助。stdin/stdout 统一处理,.gz透明解压,InputSource多文件视图。number.rs- 数字格式化 (千位分隔符, 小数位控制)。plot/- 终端绘图库 (plot命令)。axis.rs: 坐标轴;binning.rs: 分箱算法;boxplot.rs/scatter.rs/heatmap.rs: 图表渲染;data.rs: 数据加载。
sampling/- 采样算法。reservoir.rs: 蓄水池采样;bernoulli.rs: 跳步采样;traits.rs: 采样器 trait。tsv/- TSV 核心解析。reader.rs: 零拷贝读取器;record.rs: 记录抽象;fields.rs: 字段选择语法;header.rs: 表头处理;key.rs: Key 提取;select.rs: 列选择引擎;split.rs: SIMD 字段切分。
每个命令在 src/cmd_tva/ 中作为一个独立的模块实现,必须包含两个公开函数:
make_subcommand: 定义命令行接口。- 返回
clap::Command。 - 使用
.about(...)设置简短描述。 - 推荐使用
.after_help(include_str!("../../docs/help/<cmd>.md"))引入详细文档。
- 返回
execute: 命令执行逻辑。- 接收
&clap::ArgMatches。 - 返回
anyhow::Result<()>。
- 接收
- 在
src/cmd_tva/下创建新文件yourcommand.rs。 - 在
src/cmd_tva/mod.rs中声明该模块。 - 在
src/tva.rs(或主入口) 中注册该子命令。 - 实现
make_subcommand和执行逻辑。 - 添加测试文件
tests/cli_yourcommand.rs。
- 集成测试位于
tests/目录下,文件命名为cli_<command>.rs。 - 测试数据通常放在
tests/data/<command>/目录下。 - 推荐使用
TvaCmd辅助结构体(定义在tests/common/mod.rs)来编写集成测试,以简化子进程调用和断言。 - 必须使用
assert_cmd::cargo::cargo_bin_cmd!宏来定位二进制文件,以兼容自定义构建目录。 - 稳定性原则 (Zero Panic): 任何用户输入(包括畸形数据、二进制文件)都不应导致程序 Panic。必须捕获所有错误并返回友好的错误信息。
- 基准测试: 性能敏感的变更必须伴随
benches/下的基准测试结果(使用criterion)。 - 单元测试参数化: 使用
test-case进行参数化测试,减少重复代码。- 示例:
#[test_case(Value::Int(1), Value::Int(2), Some(Ordering::Less) ; "int_lt")] - 适用于多组相似输入的测试场景,如数值运算、类型转换、函数行为验证等。
- 示例:
- 使用
cargo fmt格式化代码。 - 使用
cargo clippy检查潜在问题。 - 优先使用标准库和项目中已引入的 crate (
csv,clap,anyhow,regex等)。 - 保持代码简洁,注重性能。
-
默认单线程 (Single-Threaded Default):
tva的核心命令默认采用单线程流式处理,以保证最低的启动开销和确定的内存使用。- 通过管道 (
|) 组合命令可以让操作系统负责进程级并行。
-
未来并行方向 (Future Parallelism):
- 对于 CPU 密集型任务 (如复杂
filter或stats),架构应支持基于 "Chunking" 的数据并行。 - 利用 TSV
\n的唯一性,将大文件切分为多个Chunk,分发给线程池处理,最后聚合结果。
- 对于 CPU 密集型任务 (如复杂
about: 使用第三人称单数动词,简要描述 TSV 操作。 (e.g., "Converts TSV to markdown table", "Deduplicates TSV rows").after_help: 使用include_str!("../../docs/help/<cmd>.md")引入外部文档。- Arguments:
- Input: 命名为
infile(单文件) 或infiles(多文件)。- Help (single):
Input TSV file to process (default: stdin). - Help (multiple):
Input TSV file(s) to process.
- Help (single):
- Output: 命名为
outfile(-o,--outfile)。- Help:
Output filename. [stdout] for screen.
- Help:
- Input: 命名为
- Terminology:
- 优先使用 "TSV" 而非 "file"。
- Column vs Field:
- Column: 用于文档和概念描述,指代数据的垂直维度 (e.g., "Select the first column").
- Field: 仅用于指代 CLI 参数 (
--field/-f) 或底层分隔符逻辑 (e.g., "tab-separated fields").
- Key:
- 特指用于排序、连接、去重等操作的那些 Column (e.g., "Sort by the first column as key").
- Row vs Line:
- Row: 指代数据记录 (Data Record),通常不包含表头。
- Line: 指代物理文本行 (e.g., "The first line is a header").
所有子命令的帮助文档 (docs/help/<cmd>.md) 必须遵循以下统一风格:
-
简述 (Description):
- 标题后紧跟简洁的功能描述,可以比 .about(...) 更详细,但不能超过两行。
-
分节结构(按顺序):
- Behavior (可选): 命令的核心行为说明。
- Input: 输入源说明(使用标准格式)。
- Output (如适用): 输出说明。
- Header behavior (如适用): Header 处理说明(使用标准格式)。
- Examples: 使用示例。
-
节标题格式:
- 使用
Section Name:(首字母大写,后跟冒号)。 - 不要使用 Markdown 的
##。 - 不要包含
Usage:或Options:小节(由clap自动生成)。
- 使用
-
内容格式:
- 列表: 使用
*(星号 + 1 个空格)引导无序列表。- 子项使用
*(4空格缩进 + 星号 + 1 个空格)。
- 子项使用
- 代码示例: 使用缩进(4空格)而非
```。 - 例外:多行命令示例(如包含
\换行的命令)可使用```代码块。 - 参数引用: 使用反引号包裹,如
`--header` / `-H`。
- 列表: 使用
-
示例 (Examples):
- 使用
Examples:作为标题。 - 采用编号列表 (
1.,2.), 秆尾不要句号或冒号。 - 下一行命令示例(3 空格缩进, 用 `` 包裹单行命令)。
- 使用
docs/developer.md 是供项目开发者参考的内部指南,不要包含在最终生成的用户文档(mdBook 站点)中。
- 语言: 使用中文编写。
- 格式: 避免过多的加粗 (Bold) 或强调格式,以保持在纯文本编辑器中的可读性。
- 内容: 包含测试策略、架构设计、功能计划和开发工作流。