#parser #flight #recorder #record #file-format #high-level #igc

igc_parser

IGC飞行记录文件的解析/反序列化库

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模式

Download history 65/week @ 2024-07-16 73/week @ 2024-07-23 15/week @ 2024-07-30

153 每月下载量

MIT 协议

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