summaryrefslogtreecommitdiff
path: root/matrix-std/src/core.rs
diff options
context:
space:
mode:
authorFreya Murphy <freya@freyacat.org>2024-02-29 21:05:10 -0500
committerFreya Murphy <freya@freyacat.org>2024-02-29 21:05:10 -0500
commitace046624d2e23fba67564a86af7f03ed8a48eae (patch)
tree21ae64bc5897b1b89ee2ab8563b0e7ce047bf34a /matrix-std/src/core.rs
parentfix readme (diff)
downloadmatrix-ace046624d2e23fba67564a86af7f03ed8a48eae.tar.gz
matrix-ace046624d2e23fba67564a86af7f03ed8a48eae.tar.bz2
matrix-ace046624d2e23fba67564a86af7f03ed8a48eae.zip
remove unwraps, fix utf8
Diffstat (limited to 'matrix-std/src/core.rs')
-rw-r--r--matrix-std/src/core.rs21
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))
}