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

igc_parser

A high-level parsing/deserializing crate for IGC flight recorder files

6 releases

0.1.5 Nov 19, 2023
0.1.4 May 16, 2023
0.1.2 Apr 17, 2023

#608 in Rust patterns

30 downloads per month

MIT license

135KB
1.5K SLoC

IGC Parser

A high-level parsing crate for IGC flight recorder files.
With most focus on:

  • Easy to use
  • No run-time asserts meaning that any errors will be through the Result type
  • A panic free crate

You should use this crate if you want to easily, quickly and safely parse igc files.

For additional information on the records use https://xp-soaring.github.io/igc_file_format/igc_format_2008.html

Example: Series of records

Parsing all fixes (B records)

let file = fs::read_to_string("./examples/example.igc").unwrap().parse::<String>().unwrap();
let valid_fixes = file.lines().filter_map(|line| {
    match Record::parse(line) {
        Ok(Record::B(fix)) => Some(fix),
        _ => None,
        }
    }).collect::<Vec<Fix>>();
println!("{}", valid_fixes.len())

Example: Single record

Parsing a single record (L record aka comment)

let comment = match Record::parse("LCOMMENTYCOMMENT").unwrap() {
        Record::L(comment) => comment,
        _ => panic!("This was not a comment")
    };
println!("{}", comment.content);

Example: Entire file

Parsing entire file and getting all valid fixes

let file = fs::read_to_string("./examples/example.igc").unwrap().parse::<String>().unwrap();
let igc_file = IGCFile::parse(&file).unwrap();
let valid_fixes = igc_file.get_fixes().clone().into_iter()
    .filter_map(|fix| match fix {
       Ok(fix) => Some(fix),
       Err(_) => None,
   }).collect::<Vec<Fix>>();
println!("{}", valid_fixes.len())

Example: Specific kind of records

Use builder pattern to parse only specific kinds of records

use igc_parser::parser_builder::*;
use std::fs;
let file = fs::read_to_string("./examples/example.igc").unwrap().parse::<String>().unwrap();
let builder = ParserBuilder::new().parse_fixes().parse_comments().parse_task_info();
let parsed = builder.on_file(&file).unwrap();
let fixes = parsed.get_fixes();

New in 0.1.5

  • Serde feature (use feature flag serde)
  • Errors now implement std::error::Error through thiserror

Dependencies

~0.4–1MB
~21K SLoC