mirror of
https://github.com/storytold/cadcraft.git
synced 2026-10-24 02:46:51 -06:00
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:
co-authored by
Claude Haiku 5.5
parent
acb28313c6
commit
abce3a718b
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user