diff options
Diffstat (limited to '')
-rw-r--r-- | matrix-std/src/core.rs | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/matrix-std/src/core.rs b/matrix-std/src/core.rs index 69b6d97..5b702d0 100644 --- a/matrix-std/src/core.rs +++ b/matrix-std/src/core.rs @@ -4,30 +4,31 @@ use matrix_lang::prelude::*; use matrix_macros::native_func; use crate::{VmArgs, next, error, unpack_args, unpack_varargs}; -fn to_radix(r: i64, mut n: i64) -> String { +fn to_radix(r: i64, mut n: i64) -> Result<String> { let mut result = String::new(); let mut idx = 0; if n == 0 { result.push('0'); - return result + return Ok(result) } else if n < 0 { n = -n; idx = 1; result.push('-'); } while n != 0 { - let c = std::char::from_digit((n % r) as u32, r as u32).unwrap(); + let c = std::char::from_digit((n % r) as u32, r as u32) + .ok_or(exception!(RUNTIME_EXCEPTION, "given radix and digit created invalid number"))?; result.insert(idx, c); n /= r; } - result + Ok(result) } #[native_func(1)] fn bin(_: VmArgs, args: Vec<Value>) -> Result<Value> { let [value] = unpack_args!(args); match value { - Value::Int(n) => Ok(Value::String(to_radix(2, n).into())), + Value::Int(n) => Ok(Value::String(to_radix(2, n)?.into())), _ => error!("bin requires a integer agument") } } @@ -36,7 +37,7 @@ fn bin(_: VmArgs, args: Vec<Value>) -> Result<Value> { fn sex(_: VmArgs, args: Vec<Value>) -> Result<Value> { let [value] = unpack_args!(args); match value { - Value::Int(n) => Ok(Value::String(to_radix(6, n).into())), + Value::Int(n) => Ok(Value::String(to_radix(6, n)?.into())), _ => error!("sex requires a integer agument") } } @@ -45,7 +46,7 @@ fn sex(_: VmArgs, args: Vec<Value>) -> Result<Value> { fn oct(_: VmArgs, args: Vec<Value>) -> Result<Value> { let [value] = unpack_args!(args); match value { - Value::Int(n) => Ok(Value::String(to_radix(8, n).into())), + Value::Int(n) => Ok(Value::String(to_radix(8, n)?.into())), _ => error!("oct requires a integer agument") } } @@ -54,7 +55,7 @@ fn oct(_: VmArgs, args: Vec<Value>) -> Result<Value> { fn hex(_: VmArgs, args: Vec<Value>) -> Result<Value> { let [value] = unpack_args!(args); match value { - Value::Int(n) => Ok(Value::String(to_radix(16, n).into())), + Value::Int(n) => Ok(Value::String(to_radix(16, n)?.into())), _ => error!("hex requires a integer agument") } } @@ -63,7 +64,7 @@ fn hex(_: VmArgs, args: Vec<Value>) -> Result<Value> { fn radix(_: VmArgs, args: Vec<Value>) -> Result<Value> { let [radix, value] = unpack_args!(args); match (radix, value) { - (Value::Int(r), Value::Int(n)) => Ok(Value::String(to_radix(r, n).into())), + (Value::Int(r), Value::Int(n)) => Ok(Value::String(to_radix(r, n)?.into())), _ => error!("radix requires two integer aguments") } } @@ -136,7 +137,7 @@ fn ord(_: VmArgs, args: Vec<Value>) -> Result<Value> { if str.len() != 1 { return error!("ord requires a 1 length string") } - let char = str.chars().next().unwrap(); + let char = str.chars().next().unwrap_or('\0'); Ok(Value::Int(char as i64)) } |