14 个版本 (7 个破坏性更新)
0.8.1 | 2022年7月18日 |
---|---|
0.7.2 | 2022年6月26日 |
0.7.0 | 2021年9月26日 |
0.6.0 | 2020年7月28日 |
0.4.0 | 2018年2月18日 |
#394 在 解析器实现
每月5,263 次下载
用于 5 crates
78KB
1.5K SLoC
lcov
LCOV tracefile 解析器/合并器/过滤器,纯 Rust 实现。
LCOV 是一个覆盖测试工具 gcov 的图形前端。它收集多个源文件的 gcov 数据,并将它们存储到名为 "tracefile" 的文件中。
该 crate 的目的是比 原始的 LCOV Perl 实现 更快地操作 LCOV tracefile。
用法
将此内容添加到您的 Cargo.toml
[dependencies]
lcov = "0.8.1"
性能
数据结构
在这个 crate 中,对应于 LCOV tracefile 每一行的数据结构称为 "LCOV record",表示为 Record
。LCOV tracefile 的每一行由表示记录类型的字符串、一个冒号和一个逗号分隔的字段列表组成。
<KIND>:<field#0>,<field#1>,...<field#N>
LCOV record 类型表示为 Record
或 RecordKind
的变体。LCOV record 的每个字段都表示为 Record
的类似结构的变体的字段。
有关 LCOV tracefile 语法的详细信息,请参阅 geninfo 的手册页。
示例
解析 LCOV tracefile
use lcov::{Record, RecordKind, Reader};
// `Reader` is an iterator that iterates over `Result<lcov::Record, E>` read from the input buffer.
let mut reader = Reader::open_file("tests/fixtures/report.info")?;
// Collect the read records into a vector.
let records = reader.collect::<Result<Vec<_>, _>>()?;
assert_eq!(records[0], Record::TestName { name: "".into() });
assert_eq!(records[1].kind(), RecordKind::SourceFile);
// Outputs the read records in LCOV tracefile format.
for record in records {
println!("{}", record);
}
从 String
创建 LCOV 报告
use lcov::{Reader, Record};
let input = "\
TN:test_name
SF:/path/to/source/file.rs
DA:1,2
DA:3,0
DA:5,6
LF:3
LH:2
end_of_record
";
// `&[u8]` implements `BufRead`, so you can pass it as an argument to `Reader::new`.
let mut reader = Reader::new(input.as_bytes());
let records = reader.collect::<Result<Vec<_>, _>>()?;
assert_eq!(records[0], Record::TestName { name: "test_name".into() });
assert_eq!(records[1], Record::SourceFile { path: "/path/to/source/file.rs".into() });
// Creates an `String` in tracefile format. In this example, it is the same as `input`.
let output = records.into_iter().map(|rec| format!("{}\n", rec)).collect::<String>();
assert_eq!(input, output);
合并 tracefiles
use lcov::{Record, RecordKind, Report};
// Creates an empty `Report`.
let mut report = Report::new();
// Merges a first file.
report.merge(Report::from_file("tests/fixtures/report.init.info")?)?;
// Merges a second file.
report.merge(Report::from_file("tests/fixtures/report.run.info")?)?;
// Outputs the merge result in LCOV tracefile format.
for record in report.into_records() {
println!("{}", record);
}
最低支持的 Rust 版本 (MSRV)
最低支持的 Rust 版本是 Rust 1.56.1。在任何时候都至少支持最后 3 个稳定 Rust 版本。
当 crate 处于预发布状态(0.x.x)时,它可能在补丁版本中提升 MSRV。一旦 crate 达到 1.x,任何 MSRV 升级都将伴随着新的次版本号。
许可证
该项目受以下任一协议的许可:
- Apache许可证,版本2.0,(LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
由您选择。
贡献
除非您明确说明,否则根据Apache-2.0许可证定义的,您有意提交给lcov的任何贡献,将按照上述方式双许可,不附加任何额外条款或条件。
依赖关系
~300–770KB
~18K SLoC