Skip to content

Commit 69991f1

Browse files
committed
simpler code
1 parent 1ac19cc commit 69991f1

File tree

5 files changed

+26
-62
lines changed

5 files changed

+26
-62
lines changed

crates/pcb-diode-api/src/component.rs

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -236,15 +236,6 @@ fn upgrade_footprint(footprint_path: &Path) -> Result<()> {
236236
.run()
237237
}
238238

239-
fn embed_step_in_footprint(
240-
footprint_content: String,
241-
step_bytes: Vec<u8>,
242-
step_filename: &str,
243-
) -> Result<String> {
244-
pcb_sexpr::board::embed_step_in_footprint(footprint_content, step_bytes, step_filename)
245-
.map_err(|e| anyhow::anyhow!(e))
246-
}
247-
248239
/// Embed a STEP file into a footprint file, writing the result atomically.
249240
/// Optionally deletes the standalone STEP file after embedding.
250241
fn embed_step_into_footprint_file(
@@ -260,7 +251,9 @@ fn embed_step_into_footprint_file(
260251
.and_then(|n| n.to_str())
261252
.unwrap_or("model.step");
262253

263-
let embedded_content = embed_step_in_footprint(footprint_content, step_bytes, step_filename)?;
254+
let embedded_content =
255+
pcb_sexpr::board::embed_step_in_footprint(footprint_content, step_bytes, step_filename)
256+
.map_err(|e| anyhow::anyhow!(e))?;
264257

265258
// Normalize line endings and write to temporary file
266259
let normalized_content = embedded_content.replace("\r\n", "\n");
@@ -1565,8 +1558,12 @@ mod tests {
15651558
)
15661559
)"#;
15671560
let step_data = b"STEP DATA HERE".to_vec();
1568-
let result =
1569-
embed_step_in_footprint(footprint.to_string(), step_data, "test.step").unwrap();
1561+
let result = pcb_sexpr::board::embed_step_in_footprint(
1562+
footprint.to_string(),
1563+
step_data,
1564+
"test.step",
1565+
)
1566+
.unwrap();
15701567

15711568
// Verify balanced parentheses
15721569
assert_eq!(
@@ -1600,7 +1597,9 @@ mod tests {
16001597
)
16011598
)"#;
16021599
let step_data = b"NEW STEP DATA".to_vec();
1603-
let result = embed_step_in_footprint(footprint.to_string(), step_data, "new.step").unwrap();
1600+
let result =
1601+
pcb_sexpr::board::embed_step_in_footprint(footprint.to_string(), step_data, "new.step")
1602+
.unwrap();
16041603

16051604
// Verify the transforms were preserved
16061605
assert!(result.contains("(xyz 1 2 3)"));

crates/pcb-sexpr/src/board.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -960,10 +960,12 @@ pub fn embed_step_in_footprint(
960960
#[cfg(feature = "embed")]
961961
pub fn extract_model_paths(footprint_text: &str) -> Vec<String> {
962962
use regex::Regex;
963-
let model_pattern = Regex::new(r#"(?m)^\s*\(model\s+"([^"]+)""#).unwrap();
963+
// Match both quoted ("path") and unquoted (path) model references,
964+
// consistent with `replace_model_path`.
965+
let model_pattern = Regex::new(r#"(?m)^\s*\(model\s+(?:"([^"]+)"|([^\s)]+))"#).unwrap();
964966
model_pattern
965967
.captures_iter(footprint_text)
966-
.map(|caps| caps[1].to_string())
968+
.filter_map(|caps| caps.get(1).or(caps.get(2)).map(|m| m.as_str().to_string()))
967969
.collect()
968970
}
969971

crates/pcb/src/import/extract.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ fn extract_kicad_schematic_data(
239239

240240
let properties: BTreeMap<String, String> = sexpr_kicad::schematic_properties(sym)
241241
.into_iter()
242-
.map(|(k, v)| (k, variable_resolver.expand_best_effort(&v)))
242+
.map(|(k, v)| (k, variable_resolver.expand_tolerant(&v)))
243243
.collect();
244244
let lib_id = sexpr_kicad::string_prop(sym, "lib_id").map(KiCadLibId::from);
245245

@@ -397,7 +397,7 @@ fn resolve_sheet_file(
397397
return None;
398398
}
399399

400-
let expanded = variable_resolver.expand_best_effort(raw);
400+
let expanded = variable_resolver.expand_tolerant(raw);
401401

402402
let candidate = PathBuf::from(&expanded);
403403
if candidate.is_absolute() {
@@ -550,7 +550,7 @@ fn extract_kicad_layout_data(
550550
let expanded_properties: BTreeMap<String, String> = fp
551551
.properties
552552
.into_iter()
553-
.map(|(k, v)| (k, variable_resolver.expand_best_effort(&v)))
553+
.map(|(k, v)| (k, variable_resolver.expand_tolerant(&v)))
554554
.collect();
555555

556556
let layout = ImportLayoutComponent {
@@ -670,8 +670,8 @@ fn parse_kicad_sexpr_netlist_components(
670670
.with_context(|| format!("Netlist component {refdes} missing sheetpath (tstamps)"))?;
671671

672672
let footprint = sexpr_kicad::string_prop(comp, "footprint");
673-
let value = sexpr_kicad::string_prop(comp, "value")
674-
.map(|v| variable_resolver.expand_best_effort(&v));
673+
let value =
674+
sexpr_kicad::string_prop(comp, "value").map(|v| variable_resolver.expand_tolerant(&v));
675675

676676
let normalized_sheetpath_tstamps = normalize_sheetpath_tstamps(&sheetpath_tstamps);
677677

crates/pcb/src/import/generate.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2442,6 +2442,10 @@ fn embed_models_in_footprint(
24422442
match embed_step_in_footprint(result.clone(), step_bytes, step_filename) {
24432443
Ok(embedded) => {
24442444
result = embedded;
2445+
// `embed_step_in_footprint` replaces ALL model paths and adds a
2446+
// single `(embedded_files)` block, so we can only safely embed one
2447+
// STEP model per footprint. Break after the first success.
2448+
break;
24452449
}
24462450
Err(e) => {
24472451
debug!("Failed to embed 3D model '{}': {}", step_filename, e);

crates/pcb/src/import/portable.rs

Lines changed: 1 addition & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1148,19 +1148,7 @@ impl KicadVariableResolver {
11481148
}
11491149
}
11501150

1151-
/// Expand variables in `input`, keeping the original text for any
1152-
/// variable that cannot be resolved (with a debug log).
1153-
pub(super) fn expand_best_effort(&self, input: &str) -> String {
1154-
match self.expand(input) {
1155-
Ok(v) => v,
1156-
Err(e) => {
1157-
log::debug!("Variable expansion skipped: {}", e);
1158-
input.to_string()
1159-
}
1160-
}
1161-
}
1162-
1163-
/// Like [`Self::expand_best_effort`], but tolerant of unknown variables:
1151+
/// Tolerant variable expansion:
11641152
/// known variables are replaced with their values while unknown ones are
11651153
/// kept as literal `${NAME}` text. Useful for expanding an entire
11661154
/// S-expression blob that may contain both project variables (e.g.
@@ -1411,35 +1399,6 @@ mod tests {
14111399
Ok(())
14121400
}
14131401

1414-
#[test]
1415-
fn expand_best_effort_resolves_known_variables() {
1416-
let mut vars = BTreeMap::new();
1417-
vars.insert("KIPRJMOD".to_string(), "/my/project".to_string());
1418-
vars.insert("MY_VAR".to_string(), "hello".to_string());
1419-
let resolver = KicadVariableResolver { vars };
1420-
1421-
assert_eq!(
1422-
resolver.expand_best_effort("${KIPRJMOD}/lib/foo.step"),
1423-
"/my/project/lib/foo.step"
1424-
);
1425-
assert_eq!(resolver.expand_best_effort("${MY_VAR}"), "hello");
1426-
assert_eq!(resolver.expand_best_effort("no variables"), "no variables");
1427-
}
1428-
1429-
#[test]
1430-
fn expand_best_effort_returns_original_on_unknown_variable() {
1431-
let resolver = KicadVariableResolver::empty();
1432-
1433-
assert_eq!(
1434-
resolver.expand_best_effort("${UNKNOWN_VAR}/path"),
1435-
"${UNKNOWN_VAR}/path"
1436-
);
1437-
assert_eq!(
1438-
resolver.expand_best_effort("$(ALSO_UNKNOWN)/x"),
1439-
"$(ALSO_UNKNOWN)/x"
1440-
);
1441-
}
1442-
14431402
#[test]
14441403
fn expand_tolerant_expands_known_and_keeps_unknown() {
14451404
let mut vars = BTreeMap::new();

0 commit comments

Comments
 (0)