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 {