From 09e4537e78db6572e52087603c8ef644c692c41d Mon Sep 17 00:00:00 2001 From: ConnorSkees <39542938+ConnorSkees@users.noreply.github.com> Date: Sun, 16 Feb 2020 18:39:27 -0500 Subject: [PATCH] Proper error in str-slice when passed float --- src/builtin/string.rs | 2 ++ src/value/number.rs | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/src/builtin/string.rs b/src/builtin/string.rs index f87eea9..16e8856 100644 --- a/src/builtin/string.rs +++ b/src/builtin/string.rs @@ -58,6 +58,7 @@ pub(crate) fn register(f: &mut BTreeMap<String, Builtin>) { }; let str_len = string.len(); let start = match arg!(args, 1, "start-at").eval() { + Value::Dimension(n, Unit::None) if n.is_decimal() => return Err(format!("{} is not an int.", n).into()), Value::Dimension(n, Unit::None) if n.to_integer().is_positive() => n.to_integer().to_usize().unwrap(), Value::Dimension(n, Unit::None) if n == Number::from(0) => 1_usize, Value::Dimension(n, Unit::None) if n < -Number::from(str_len) => 1_usize, @@ -66,6 +67,7 @@ pub(crate) fn register(f: &mut BTreeMap<String, Builtin>) { _ => todo!("$start-at: ____ is not a number") }; let mut end = match arg!(args, 2, "end-at"=Value::Null).eval() { + Value::Dimension(n, Unit::None) if n.is_decimal() => return Err(format!("{} is not an int.", n).into()), Value::Dimension(n, Unit::None) if n.to_integer().is_positive() => n.to_integer().to_usize().unwrap(), Value::Dimension(n, Unit::None) if n == Number::from(0) => 0_usize, Value::Dimension(n, Unit::None) if n < -Number::from(str_len) => 0_usize, diff --git a/src/value/number.rs b/src/value/number.rs index 3d05e4b..ae8e2fd 100644 --- a/src/value/number.rs +++ b/src/value/number.rs @@ -51,6 +51,10 @@ impl Number { val: self.val.abs(), } } + + pub fn is_decimal(&self) -> bool { + self.val.denom() != &BigInt::from(1) + } } impl fmt::LowerHex for Number {