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);