diff options
author | Freya Murphy <freya@freyacat.org> | 2024-02-29 21:05:10 -0500 |
---|---|---|
committer | Freya Murphy <freya@freyacat.org> | 2024-02-29 21:05:10 -0500 |
commit | ace046624d2e23fba67564a86af7f03ed8a48eae (patch) | |
tree | 21ae64bc5897b1b89ee2ab8563b0e7ce047bf34a /matrix-std | |
parent | fix readme (diff) | |
download | matrix-ace046624d2e23fba67564a86af7f03ed8a48eae.tar.gz matrix-ace046624d2e23fba67564a86af7f03ed8a48eae.tar.bz2 matrix-ace046624d2e23fba67564a86af7f03ed8a48eae.zip |
remove unwraps, fix utf8
Diffstat (limited to 'matrix-std')
-rw-r--r-- | matrix-std/src/core.rs | 21 | ||||
-rw-r--r-- | matrix-std/src/io.rs | 6 | ||||
-rw-r--r-- | matrix-std/src/iter.rs | 2 | ||||
-rw-r--r-- | matrix-std/src/math.rs | 4 | ||||
-rw-r--r-- | matrix-std/src/sys.rs | 6 |
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())) } |