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 <noreply@anthropic.com>
This commit is contained in:
NetterSilver
2026-10-19 02:32:21 -04:00
committed by GitHub
co-authored by Claude Haiku 5.5
parent acb28313c6
commit abce3a718b
+14
View File
@@ -121,14 +121,20 @@ pub fn parse_distance(s: &str) -> Option<f64> {
};
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);