summaryrefslogtreecommitdiff
path: root/matrix-std
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
parentfix readme (diff)
downloadmatrix-ace046624d2e23fba67564a86af7f03ed8a48eae.tar.gz
matrix-ace046624d2e23fba67564a86af7f03ed8a48eae.tar.bz2
matrix-ace046624d2e23fba67564a86af7f03ed8a48eae.zip
remove unwraps, fix utf8
Diffstat (limited to '')
-rw-r--r--matrix-std/src/core.rs21
-rw-r--r--matrix-std/src/io.rs6
-rw-r--r--matrix-std/src/iter.rs2
-rw-r--r--matrix-std/src/math.rs4
-rw-r--r--matrix-std/src/sys.rs6
5 files changed, 20 insertions, 19 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))
}
diff --git a/matrix-std/src/io.rs b/matrix-std/src/io.rs
index 19ff074..829ed28 100644
--- a/matrix-std/src/io.rs
+++ b/matrix-std/src/io.rs
@@ -106,7 +106,7 @@ fn file_read(_: VmArgs, args: Vec<Value>) -> Result<Value> {
return error!("file read requires a file")
};
let mut contents = String::new();
- if let Err(err) = file.try_borrow_mut().unwrap().read_to_string(&mut contents) {
+ if let Err(err) = file.borrow_mut().read_to_string(&mut contents) {
return error!("cannot read file: '{err}'")
};
Ok(Value::String(contents.into()))
@@ -119,7 +119,7 @@ fn file_lines(_: VmArgs, args: Vec<Value>) -> Result<Value> {
return error!("file read requires a file")
};
let mut contents = String::new();
- if let Err(err) = file.try_borrow_mut().unwrap().read_to_string(&mut contents) {
+ if let Err(err) = file.borrow_mut().read_to_string(&mut contents) {
return error!("cannot read file: '{err}'")
};
let lines: Vec<Rc<str>> = contents.split_inclusive("\n").map(|s| Rc::from(s)).collect();
@@ -139,7 +139,7 @@ fn file_write(_: VmArgs, args: Vec<Value>) -> Result<Value> {
return error!("file write requires a file")
};
let content = format!("{content}");
- if let Err(err) = file.try_borrow_mut().unwrap().write_all(content.as_bytes()) {
+ if let Err(err) = file.borrow_mut().write_all(content.as_bytes()) {
return error!("cannot write file: '{err}'")
};
Ok(Value::Nil)
diff --git a/matrix-std/src/iter.rs b/matrix-std/src/iter.rs
index 638755c..c0e0c63 100644
--- a/matrix-std/src/iter.rs
+++ b/matrix-std/src/iter.rs
@@ -365,7 +365,7 @@ fn unzip((vm, frame): VmArgs, args: Vec<Value>) -> Result<Value> {
if vals.len() != 2 {
return error!("unzip only works over a iterator of pairs");
}
- let [l, r] = vals.try_into().unwrap();
+ let [l, r] = vals.try_into().map_err(|_| exception!(RUNTIME_EXCEPTION, "can only unzip over a set of pairs"))?;
ll.push(l);
lr.push(r);
}
diff --git a/matrix-std/src/math.rs b/matrix-std/src/math.rs
index 111544c..503192d 100644
--- a/matrix-std/src/math.rs
+++ b/matrix-std/src/math.rs
@@ -15,7 +15,7 @@ fn trans(_: VmArgs, args: Vec<Value>) -> Result<Value> {
let values = mat
.cols()
.reduce(|mut a, b| {a.extend(b); a})
- .unwrap()
+ .ok_or(exception!(RUNTIME_EXCEPTION, "matrix values smashed"))?
.into_iter()
.map(|e| e.clone())
.collect();
@@ -164,7 +164,7 @@ fn mat_det(mat: Matrix) -> Result<Value> {
.collect::<Vec<Value>>()
)
.reduce(|mut a, b| {a.extend(b); a})
- .unwrap();
+ .ok_or(exception!(RUNTIME_EXCEPTION, "matrix values smashed"))?;
let sub = Matrix::new(mat.domain - 1, mat.domain - 1, sub_values);
let val = mat.get(0, col)?;
let part = (val * mat_det(sub)?)?;
diff --git a/matrix-std/src/sys.rs b/matrix-std/src/sys.rs
index 609e72d..8b54f0f 100644
--- a/matrix-std/src/sys.rs
+++ b/matrix-std/src/sys.rs
@@ -193,7 +193,7 @@ fn basename(_: VmArgs, args: Vec<Value>) -> Result<Value> {
};
let path = PathBuf::from(value.to_string());
match path.file_name() {
- Some(p) => Ok(Value::String(p.to_str().unwrap().into())),
+ Some(p) => Ok(Value::String(p.to_str().unwrap_or("").into())),
None => Ok(Value::String(value.into()))
}
}
@@ -209,7 +209,7 @@ fn dirname(_: VmArgs, args: Vec<Value>) -> Result<Value> {
Some(p) => p,
None => path.as_path()
};
- let str = parent.as_os_str().to_str().unwrap();
+ let str = parent.as_os_str().to_str().unwrap_or("");
match str {
"" => Ok(Value::String(".".into())),
s => Ok(Value::String(s.into()))
@@ -226,7 +226,7 @@ fn realpath(_: VmArgs, args: Vec<Value>) -> Result<Value> {
Ok(p) => p,
Err(e) => return error!("could not get realpath: {e}")
};
- Ok(Value::String(path.to_str().unwrap().into()))
+ Ok(Value::String(path.to_str().unwrap_or("").into()))
}