summaryrefslogtreecommitdiff
path: root/src/library/utility
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2022-07-27 00:09:15 +0200
committerLaurenz <laurmaedje@gmail.com>2022-07-27 00:09:15 +0200
commit9362c279de362eac1b7ec76834dd76a0235c5dd2 (patch)
treefdcec0de57deac0f94c2b4521ff09e94b1c785ee /src/library/utility
parentfc574b39454aec77cf2c33270566225917c7c823 (diff)
CSV reading
Diffstat (limited to 'src/library/utility')
-rw-r--r--src/library/utility/data.rs30
-rw-r--r--src/library/utility/mod.rs2
2 files changed, 32 insertions, 0 deletions
diff --git a/src/library/utility/data.rs b/src/library/utility/data.rs
new file mode 100644
index 00000000..0f9e6bf0
--- /dev/null
+++ b/src/library/utility/data.rs
@@ -0,0 +1,30 @@
+use crate::library::prelude::*;
+
+/// Read structured data from a CSV file.
+pub fn csv(vm: &mut Machine, args: &mut Args) -> TypResult<Value> {
+ let Spanned { v: path, span } =
+ args.expect::<Spanned<EcoString>>("path to csv file")?;
+
+ let path = vm.locate(&path).at(span)?;
+ let try_load = || -> io::Result<Value> {
+ let data = vm.ctx.loader.load(&path)?;
+
+ let mut builder = csv::ReaderBuilder::new();
+ builder.has_headers(false);
+
+ let mut reader = builder.from_reader(data.as_slice());
+ let mut vec = vec![];
+
+ for result in reader.records() {
+ vec.push(Value::Array(
+ result?.iter().map(|field| Value::Str(field.into())).collect(),
+ ))
+ }
+
+ Ok(Value::Array(Array::from_vec(vec)))
+ };
+
+ try_load()
+ .map_err(|err| failed_to_load("csv file", &path, err))
+ .at(span)
+}
diff --git a/src/library/utility/mod.rs b/src/library/utility/mod.rs
index 10aa7c7a..9c95e60c 100644
--- a/src/library/utility/mod.rs
+++ b/src/library/utility/mod.rs
@@ -1,10 +1,12 @@
//! Computational utility functions.
mod color;
+mod data;
mod math;
mod string;
pub use color::*;
+pub use data::*;
pub use math::*;
pub use string::*;