Skip to main content

symbol_roundtrip/
symbol_roundtrip.rs

1use std::env;
2use std::path::PathBuf;
3
4use kiutils_kicad::SymbolLibFile;
5
6fn usage() -> String {
7    "usage: symbol_roundtrip <input.kicad_sym> <output.kicad_sym>".to_string()
8}
9
10fn main() -> Result<(), String> {
11    let mut args = env::args().skip(1);
12    let in_path = args.next().map(PathBuf::from).ok_or_else(usage)?;
13    let out_path = args.next().map(PathBuf::from).ok_or_else(usage)?;
14
15    let mut doc = SymbolLibFile::read(&in_path).map_err(|e| e.to_string())?;
16    doc.set_generator("kiutils")
17        .set_generator_version("roundtrip-demo");
18
19    if let Some(first_name) = doc.ast().symbols.first().and_then(|s| s.name.clone()) {
20        let renamed = format!("{first_name}_Edited");
21        doc.rename_symbol(&first_name, renamed.clone())
22            .upsert_symbol_property(
23                &renamed,
24                "EditedBy",
25                "kiutils_kicad/examples/symbol_roundtrip.rs",
26            );
27    }
28
29    doc.write(&out_path).map_err(|e| e.to_string())?;
30
31    let reread = SymbolLibFile::read(&out_path).map_err(|e| e.to_string())?;
32    println!("input: {}", in_path.display());
33    println!("output: {}", out_path.display());
34    println!("symbol_count: {}", reread.ast().symbol_count);
35    println!("total_pin_count: {}", reread.ast().total_pin_count);
36    println!("unknown_nodes: {}", reread.ast().unknown_nodes.len());
37    println!("diagnostics: {}", reread.diagnostics().len());
38
39    Ok(())
40}