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) { }; 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) { _ => 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 {