From abce3a718b348536ddff36ebb7c5db8b2a2304f8 Mon Sep 17 00:00:00 2001 From: NetterSilver <133535268+Silvertree2010@users.noreply.github.com> Date: Mon, 19 Oct 2026 08:32:21 +0200 Subject: [PATCH] Reject lone '-' or '"' in parse_distance instead of reading 0 (#1444) Found while testing crates/engine/src/units.rs:107-132 Co-authored-by: Claude Haiku 5.5 --- crates/engine/src/units.rs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/crates/engine/src/units.rs b/crates/engine/src/units.rs index 073a6948..06a23750 100644 --- a/crates/engine/src/units.rs +++ b/crates/engine/src/units.rs @@ -121,14 +121,20 @@ pub fn parse_distance(s: &str) -> Option { }; let mut total = 0.0; let mut rest = t; + let mut parsed = false; if let Some(i) = rest.find('\'') { let ft: f64 = rest.get(..i)?.trim().parse().ok()?; total += ft * 12.0; + parsed = true; rest = rest.get(i + 1..)?.trim_start_matches('-').trim(); } let rest = rest.trim_end_matches('"').trim(); if !rest.is_empty() { total += parse_mixed(rest)?; + parsed = true; + } + if !parsed { + return None; } let v = if neg { -total } else { total }; v.is_finite().then_some(v) @@ -378,6 +384,14 @@ mod tests { assert_eq!(parse_distance(""), None); } + #[test] + fn parse_distance_needs_a_number() { + assert_eq!(parse_distance("-"), None); + assert_eq!(parse_distance("\""), None); + assert_eq!(parse_distance("-\""), None); + assert_eq!(parse_distance("1'"), Some(12.0)); + } + #[test] fn angles() { assert!((parse_angle("90").unwrap() - PI / 2.0).abs() < 1e-12);