winereg 0.1.0

Rust library for parsing, writing, diffing, patching, and scripting Wine/Windows registry files.
Documentation
use winereg::*;

#[test]
fn text_diff_export_and_parse_round_trip() {
    let key1 = RegistryKey::create_root();
    let key2 = RegistryKey::create_root();
    {
        let k = RegistryKey::create_key_recursive(&key2, "SOFTWARE\\Test");
        k.borrow_mut().set_value(
            "Version",
            RegistryValue::new("Version", RegistryValueData::String("1.0".into())),
        );
    }
    let comparator = RegistryComparator;
    let diff = comparator.compare_registries(&key1, &key2);
    let exporter = TextDiffExporter;
    let text = exporter.export(&diff, None, None);
    let parser = TextDiffParser;
    let parsed = parser.parse(&text).expect("parse text diff");
    assert_eq!(diff.changes.len(), parsed.changes.len());
}

#[test]
fn text_diff_export_parse_and_apply_produces_identical_registry() {
    let base = RegistryKey::create_root();
    let desired = RegistryKey::create_root();
    let desired_key = RegistryKey::create_key_recursive(&desired, "Software\\Example");
    {
        let mut guard = desired_key.borrow_mut();
        guard.set_value(
            "Version",
            RegistryValue::new("Version", RegistryValueData::String("1.2.3".into())),
        );
        guard.set_value(
            "Enabled",
            RegistryValue::new("Enabled", RegistryValueData::Dword(1)),
        );
    }

    let comparator = RegistryComparator;
    let diff = comparator.compare_registries(&base, &desired);
    let exporter = TextDiffExporter;
    let text = exporter.export(&diff, Some("old.reg"), Some("new.reg"));
    let parser = TextDiffParser;
    let parsed = parser.parse(&text).expect("parse diff text");

    let patcher = RegistryPatcher;
    let result = patcher.apply_patch(&base, &parsed, PatchOptions::default());
    assert!(result.is_success());

    let final_diff = comparator.compare_registries(&base, &desired);
    assert!(!final_diff.has_changes());
}