recutils-rs 0.1.1

Rust FFI bindings to GNU recutils (librec) with an optional Arrow conversion layer
Documentation
use std::fs;

use recutils_rs::{Db, Record};

fn main() {
    let mut args = std::env::args().skip(1);
    let path = args
        .next()
        .expect("usage: append_record <file.rec> <Type> Field=Value [Field=Value ...]");
    let rset_type = args.next().expect("missing record type");
    let pairs: Vec<(String, String)> = args
        .map(|a| {
            let (k, v) = a.split_once('=').expect("expected Field=Value");
            (k.to_string(), v.to_string())
        })
        .collect();
    assert!(!pairs.is_empty(), "need at least one Field=Value");

    let text = fs::read_to_string(&path).expect("read file");
    let mut db = Db::parse_str(&text).expect("parse");

    let mut record = Record::new();
    for (k, v) in &pairs {
        record.append_field(k, v).expect("append field");
    }

    {
        let mut rset = db
            .rset_by_type(&rset_type)
            .unwrap_or_else(|| panic!("no record set of type {rset_type:?}"));
        rset.append_record(record).expect("append record");
    }

    let serialized = db.to_rec_string().expect("serialize");
    fs::write(&path, serialized).expect("write file");
    println!("appended 1 record to rset {rset_type:?} in {path}");
}