7个版本
0.1.6 | 2024年7月22日 |
---|---|
0.1.5 | 2023年11月19日 |
0.1.4 | 2023年5月16日 |
0.1.2 | 2023年4月17日 |
#440 in Rust模式
153 每月下载量
140KB
1.5K SLoC
IGC解析器
IGC飞行记录文件的解析库。特性
- 无运行时断言,意味着任何错误将通过
Result
类型传递 - 拥有类型,意味着没有生命周期
Rc<str>
和Arc<str>
用于不可变字符串类型,以提高与String
相比克隆效率- 构建器以高效解析特定项目
有关记录的更多信息,请参阅 https://xp-soaring.github.io/igc_file_format/igc_format_2008.html
示例:特定类型的记录
使用构建器模式仅解析特定类型的记录,这比解析所有记录更有效
let file = fs::read_to_string("./examples/example.igc")?;
let builder = parser_builder::new_builder()
.parse_a_records()
.parse_e_records()
.parse_b_records();
let parsed = builder.on_file(&file)?;
// Then we can get the records we specified
let a_records = parsed.get_a_records();
let e_records = parsed.get_e_records();
let b_records = parsed.get_b_records();
// NOTE This below does not compile since our builder was not set to parse C records
// let c_records = parsed.get_c_records();
示例:一系列记录
解析所有修正(B记录)
let file = fs::read_to_string("./examples/example.igc")?;
let valid_fixes: Vec<Fix> = file
.lines()
.filter_map(|line| {
if let Record::B(fix) = Record::parse(line).ok()? {
Some(fix)
} else {
None
}
})
.collect();
println!("{}", valid_fixes.len());
示例:单个记录
解析单个记录(L记录即注释)
let comment = match Record::parse("LCOMMENTYCOMMENT").unwrap() {
Record::L(comment) => comment,
_ => panic!("This was not a comment")
};
println!("{}", comment.content);
示例:整个文件
解析整个文件并获取所有有效的修正
let file = fs::read_to_string("./examples/example.igc")?;
let igc_file = IGCFile::parse(&file)?;
let valid_fixes: Vec<Fix> = igc_file
.get_fixes()
.clone()
.into_iter()
.filter_map(|fix| fix.ok())
.collect();
println!("{}", valid_fixes.len());
0.1.6版本新增
- 为构建器添加了类型状态模式,以避免返回
Option
- 从
String
更改为Rc<str>
以允许更高效的克隆 - 添加了
thread-safe
特性,其中字符串类型将是Arc<str>
依赖项
~265–780KB
~18K SLoC