app
KiCad - the KiCad Bridge
Public Made by Adomby adom
Reference implementation of the KiCad bridge: multi-instance Python server, forward path via kicad-cli, reverse path via in-process plugin. Most complex of the three bundled bridges.
← Commit history
rust: kicad-ipc-rs behind the ipc feature, advapi32 link fix, routing group placeholder
9 files changed
+191−3
rust/Cargo.lock+161−1rust/crates/kicad-bridge/Cargo.toml+2−1rust/crates/kicad-bridge/src/groups.rs+1rust/crates/kicad-bridge/src/main.rs+1rust/crates/kicad-bridge/src/verbs_routing.rs+11rust/crates/kicad-core/Cargo.toml+5−1rust/crates/kicad-core/build.rs+7rust/crates/kicad-core/src/ipc.rs+1rust/crates/kicad-core/src/lib.rs+2rust/Cargo.lock+161−1@@ -8,6 +8,12 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" +[[package]]+name = "anyhow"+version = "1.0.104"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470"+ [[package]] name = "ascii" version = "1.1.0"@@ -48,6 +54,15 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e4de3bc4ea267985becf712dc6d9eed8b04c953b3fcfb339ebc87acd9804901" +[[package]]+name = "cmake"+version = "0.1.58"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678"+dependencies = [+ "cc",+]+ [[package]] name = "crc32fast" version = "1.5.1"@@ -57,6 +72,12 @@ dependencies = [ "cfg-if", ] +[[package]]+name = "either"+version = "1.18.0"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "252afb9ae5eaa683babdc6a068b3f5726eb19e05070c731f9b2a23a7c3e8ed34"+ [[package]] name = "find-msvc-tools" version = "0.1.12"@@ -107,6 +128,15 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" +[[package]]+name = "itertools"+version = "0.14.0"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285"+dependencies = [+ "either",+]+ [[package]] name = "itoa" version = "1.0.18"@@ -128,6 +158,7 @@ dependencies = [ name = "kicad-core" version = "1.0.0-alpha.2" dependencies = [+ "kicad-ipc-rs", "kicad-platform", "quick-xml", "serde",@@ -135,6 +166,19 @@ dependencies = [ "ureq", ] +[[package]]+name = "kicad-ipc-rs"+version = "0.5.1"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "17270cabeef7d717f31b94caa7540b59a99b4a0935c36ca3645f319594f7a3ff"+dependencies = [+ "nng",+ "prost",+ "prost-types",+ "thiserror",+ "tokio",+]+ [[package]] name = "kicad-platform" version = "1.0.0-alpha.2"@@ -172,6 +216,26 @@ dependencies = [ "simd-adler32", ] +[[package]]+name = "nng"+version = "1.0.1"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "20a18ed7ec1c8ff1658bcfea2ce76dcedf8be21dd9e8dd2e9762ba9632d16203"+dependencies = [+ "log",+ "nng-sys",+]++[[package]]+name = "nng-sys"+version = "1.4.0-rc.0"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "50d0e7f39a8fd1792a710da9351320e864dc799cf439960e332c977b2f876da6"+dependencies = [+ "cmake",+ "version_check",+]+ [[package]] name = "once_cell" version = "1.21.4"@@ -184,6 +248,12 @@ version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" +[[package]]+name = "pin-project-lite"+version = "0.2.17"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd"+ [[package]] name = "proc-macro2" version = "1.0.107"@@ -193,6 +263,38 @@ dependencies = [ "unicode-ident", ] +[[package]]+name = "prost"+version = "0.14.4"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "528ac67416ff8646872a3c02cad9cc4ee5dc9f9540c9b10771855c95cb2e5ae1"+dependencies = [+ "bytes",+ "prost-derive",+]++[[package]]+name = "prost-derive"+version = "0.14.4"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "b570b25f7617e43d59005d0990ccb79e950a423952cea19671b7a876da390adf"+dependencies = [+ "anyhow",+ "itertools",+ "proc-macro2",+ "quote",+ "syn 2.0.119",+]++[[package]]+name = "prost-types"+version = "0.14.4"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "f94967dc7688f3054c7fac87473ffae4cc4c3904800e2d9f5b857246d8963b0a"+dependencies = [+ "prost",+]+ [[package]] name = "quick-xml" version = "0.37.5"@@ -287,7 +389,7 @@ checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote",- "syn",+ "syn 3.0.5", ] [[package]]@@ -321,6 +423,17 @@ version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" +[[package]]+name = "syn"+version = "2.0.119"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297"+dependencies = [+ "proc-macro2",+ "quote",+ "unicode-ident",+]+ [[package]] name = "syn" version = "3.0.5"@@ -332,6 +445,26 @@ dependencies = [ "unicode-ident", ] +[[package]]+name = "thiserror"+version = "2.0.20"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f"+dependencies = [+ "thiserror-impl",+]++[[package]]+name = "thiserror-impl"+version = "2.0.20"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af"+dependencies = [+ "proc-macro2",+ "quote",+ "syn 3.0.5",+]+ [[package]] name = "tiny_http" version = "0.12.0"@@ -344,6 +477,27 @@ dependencies = [ "log", ] +[[package]]+name = "tokio"+version = "1.53.1"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed"+dependencies = [+ "pin-project-lite",+ "tokio-macros",+]++[[package]]+name = "tokio-macros"+version = "2.7.2"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e"+dependencies = [+ "proc-macro2",+ "quote",+ "syn 3.0.5",+]+ [[package]] name = "unicode-ident" version = "1.0.24"@@ -391,6 +545,12 @@ version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8c0a043c9540bae7c578c88f91dda8bd82e59ae27c21baca69c8b191aaf5a6e" +[[package]]+name = "version_check"+version = "0.9.5"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"+ [[package]] name = "wasi" version = "0.11.1+wasi-snapshot-preview1"
rust/crates/kicad-bridge/Cargo.toml+2−1@@ -18,6 +18,7 @@ kicad-core = { path = "../kicad-core", default-features = false } kicad-platform = { path = "../kicad-platform" } [features]-default = ["net"]+default = ["net", "ipc"] # Forwarded to kicad-core; off for a cross type-check from a box without the target C toolchain. net = ["kicad-core/net"]+ipc = ["kicad-core/ipc"]
rust/crates/kicad-bridge/src/groups.rs+1@@ -22,6 +22,7 @@ pub static GROUPS: &[Group] = &[ Group { name: "schematic", verbs: || crate::verbs_schematic::VERBS, dispatch: crate::verbs_schematic::dispatch }, Group { name: "misc", verbs: || crate::verbs_misc::VERBS, dispatch: crate::verbs_misc::dispatch }, Group { name: "install", verbs: || crate::verbs_install::VERBS, dispatch: crate::verbs_install::dispatch },+ Group { name: "routing", verbs: || crate::verbs_routing::VERBS, dispatch: crate::verbs_routing::dispatch }, ]; pub fn dispatch(state: &mut State, command: &str, args: &Value) -> Option<Value> {
rust/crates/kicad-bridge/src/main.rs+1@@ -17,6 +17,7 @@ mod verbs_lint; mod verbs_maint; mod verbs_misc; mod verbs_netlist;+mod verbs_routing; mod verbs_schematic; use std::time::Instant;
rust/crates/kicad-bridge/src/verbs_routing.rsadded+11@@ -0,0 +1,11 @@+//! Verb group "routing". Placeholder until phase 2 lands.+use serde_json::Value;++use crate::catalog::Verb;+use crate::util::State;++pub static VERBS: &[Verb] = &[];++pub fn dispatch(_state: &mut State, _command: &str, _args: &Value) -> Option<Value> {+ None+}
rust/crates/kicad-core/Cargo.toml+5−1@@ -13,10 +13,14 @@ kicad-platform = { path = "../kicad-platform" } # XML netlists from kicad-cli, HTTP for wiki fetches (rustls: no OS CA store needed). quick-xml = "0.37" ureq = { version = "3", default-features = false, features = ["rustls", "gzip"], optional = true }+# KiCad IPC API client (protobuf over nng). Behind the ipc feature: nng-sys is a C build+# (cmake), so a bare cross type-check can turn it off.+kicad-ipc-rs = { version = "0.5", features = ["blocking"], optional = true } [features] # net: HTTPS fetches (wiki design rules, PCM, KiCad update check) through ureq + rustls. # rustls pulls in ring, whose C build needs a target C compiler, so a cross type-check # from a box without one runs with --no-default-features.-default = ["net"]+default = ["net", "ipc"] net = ["dep:ureq"]+ipc = ["dep:kicad-ipc-rs"]
rust/crates/kicad-core/build.rsadded+7@@ -0,0 +1,7 @@+fn main() {+ // nng's Windows IPC listener references IsValidSecurityDescriptor (advapi32); the+ // nng-sys build script does not link it on the gnu target, so append it here.+ if std::env::var("CARGO_CFG_TARGET_OS").as_deref() == Ok("windows") {+ println!("cargo:rustc-link-arg=-ladvapi32");+ }+}
rust/crates/kicad-core/src/ipc.rsadded+1@@ -0,0 +1 @@+//! Placeholder: KiCad IPC client wrapper, filled in by phase 2.
rust/crates/kicad-core/src/lib.rs+2@@ -14,3 +14,5 @@ pub mod kicad_common; pub mod render; pub mod bridge_log; pub mod install;+#[cfg(feature = "ipc")]+pub mod ipc;