kiutils-rs 0.2.0

Pure-Rust KiCad API for seamless, lossless S-expression document round-trips
Documentation
use std::path::{Path, PathBuf};

use kiutils_rs::{
    DesignRulesFile, FootprintFile, FpLibTableFile, PcbFile, ProjectFile, SymLibTableFile,
    WriteMode,
};

fn fixture(name: &str) -> PathBuf {
    Path::new(env!("CARGO_MANIFEST_DIR"))
        .join("..")
        .join("kiutils_kicad")
        .join("tests")
        .join("fixtures")
        .join(name)
}

#[test]
fn facade_reads_all_v1_document_types() {
    let pcb = PcbFile::read(fixture("sample.kicad_pcb")).expect("pcb parse");
    assert_eq!(pcb.ast().version, Some(20260101));

    let footprint = FootprintFile::read(fixture("sample.kicad_mod")).expect("footprint parse");
    assert_eq!(footprint.ast().version, Some(20260101));

    let fplib = FpLibTableFile::read(fixture("fp-lib-table")).expect("fplib parse");
    assert_eq!(fplib.ast().library_count, 1);

    let symlib = SymLibTableFile::read(fixture("sym-lib-table")).expect("symlib parse");
    assert_eq!(symlib.ast().library_count, 1);

    let dru = DesignRulesFile::read(fixture("sample.kicad_dru")).expect("dru parse");
    assert_eq!(dru.ast().rule_count, 1);

    let project = ProjectFile::read(fixture("sample.kicad_pro")).expect("project parse");
    assert!(project.ast().pinned_symbol_libs.is_empty());
    assert_eq!(project.ast().pinned_footprint_libs, vec!["A"]);
}

#[test]
fn facade_exposes_write_mode() {
    assert_ne!(WriteMode::Lossless, WriteMode::Canonical);
}

#[test]
fn facade_exposes_project_setters_and_libtable_upsert() {
    let mut project = ProjectFile::read(fixture("sample.kicad_pro")).expect("project parse");
    project
        .set_pinned_symbol_libs(vec!["SYM_A"])
        .set_pinned_footprint_libs(vec!["FP_A"]);
    assert_eq!(project.ast().pinned_symbol_libs, vec!["SYM_A"]);
    assert_eq!(project.ast().pinned_footprint_libs, vec!["FP_A"]);

    let mut fplib = FpLibTableFile::read(fixture("fp-lib-table")).expect("fplib parse");
    fplib.upsert_library_uri("A", "${KIPRJMOD}/A.pretty");
    assert_eq!(
        fplib.ast().libraries[0].uri.as_deref(),
        Some("${KIPRJMOD}/A.pretty")
    );
}