diff options
| author | Laurenz <laurmaedje@gmail.com> | 2022-07-27 00:09:15 +0200 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2022-07-27 00:09:15 +0200 |
| commit | 9362c279de362eac1b7ec76834dd76a0235c5dd2 (patch) | |
| tree | fdcec0de57deac0f94c2b4521ff09e94b1c785ee /src/library/utility | |
| parent | fc574b39454aec77cf2c33270566225917c7c823 (diff) | |
CSV reading
Diffstat (limited to 'src/library/utility')
| -rw-r--r-- | src/library/utility/data.rs | 30 | ||||
| -rw-r--r-- | src/library/utility/mod.rs | 2 |
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::*; |
