#deserialize #gedcom #genealogy #json-xml #name #xml-parser #fact

gedcomx

The core data structures and serialization / deserialization of the GEDCOM X format

15 releases

new 0.1.7 Oct 31, 2024
0.1.6 Oct 26, 2024
0.1.5 Jul 21, 2023
0.1.3 Jan 18, 2022
0.1.0-alpha.1 May 31, 2021

#308 in Parser implementations

Download history 23/week @ 2024-07-21 46/week @ 2024-07-28 4/week @ 2024-08-25 5/week @ 2024-09-01 29/week @ 2024-09-22 4/week @ 2024-09-29 1/week @ 2024-10-13 86/week @ 2024-10-20 163/week @ 2024-10-27

250 downloads per month
Used in gedcomx_file

MIT license

445KB
10K SLoC

gedcomx

The core data structures and serialization / deserialization of the GEDCOM X format.

CI codecov API

Specification Compliance

This crate provides conformance to the following GEDCOM X specs:

Features

  • Well tested: hundreds of unit tests and some large integration tests. Integration tests parsing of all the recipes in the Recipe Book as well as other test data from the Java Gedcomx implementation.
  • Fuzzed and quickchecked.
  • Use the builder pattern to safely build GEDCOM X data models.
  • XML and JSON serialization and deserialization supported.

Documentation

https://docs.rs/gedcomx

Usage

Add this to your Cargo.toml:

[dependencies]
gedcomx = "0.1"

Example

A GEDCOM X document can be deserialized from JSON:

use gedcomx::Gedcomx;

fn main() {
    let json = std::fs::read_to_string("../data/birth.json").unwrap();
    let gx = Gedcomx::from_json_str(&json).unwrap();
    println!(
        "Successfully deserialized GEDCOM X document from JSON with {} people inside!",
        gx.persons.len()
    );

    assert_eq!(gx.persons.len(), 4);
}

Similarly, you can deserialize from XML with the Gedcomx struct's from_xml_str method.

In-memory GEDCOM X documents can be built by instantiating individual components and adding them to an instance of Gedcomx. This can then be serialized to JSON or XML using a family of functions defined on Gedcomx:

use gedcomx::{Gedcomx, Name, NameForm, NameType, Person};

let gx = Gedcomx::builder()
    .person(
        Person::builder()
            .private(true)
            .name(
                Name::builder(
                    NameForm::builder()
                        .full_text("Jim Halpert")
                        .lang("en")
                        .build(),
                )
                .name_type(NameType::BirthName)
                .build(),
            )
            .build(),
    )
    .build();

let json = gx.to_json_string_pretty().unwrap();

assert_eq!(json.len(), 285);

Contributing

See the Design Doc for more information about why various choices were made. PRs welcome!

Dependencies

~3.5–5MB
~99K SLoC