diff options
| author | Nathan Reiner <nathan@nathanreiner.xyz> | 2024-08-10 19:25:25 +0200 |
|---|---|---|
| committer | Nathan Reiner <nathan@nathanreiner.xyz> | 2024-08-10 19:25:25 +0200 |
| commit | 5ff507db2f6667a0305e2382037710f6082d75da (patch) | |
| tree | 94954bc8547e62ac8cbdbfd327d21712deb9fef2 /src/sheet/loader | |
| parent | 63cfcbe7a7745b276de58ec92e0141b958c44feb (diff) | |
imlement native csv loader
Diffstat (limited to 'src/sheet/loader')
| -rw-r--r-- | src/sheet/loader/mod.rs | 58 | ||||
| -rw-r--r-- | src/sheet/loader/native/csv.rs | 19 | ||||
| -rw-r--r-- | src/sheet/loader/native/mod.rs | 2 |
3 files changed, 79 insertions, 0 deletions
diff --git a/src/sheet/loader/mod.rs b/src/sheet/loader/mod.rs new file mode 100644 index 0000000..0e083fe --- /dev/null +++ b/src/sheet/loader/mod.rs @@ -0,0 +1,58 @@ +use std::{collections::HashMap, path::Path, ptr::addr_of_mut}; + +use mlua::{Lua, UserData}; +use once_cell::sync::Lazy; + +use crate::lua::{ownedfunction::OwnedFunction, runnable::Runnable}; + +use self::native::csv::load_csv; + +use super::{register::SheetId, tablized::Tablized}; + +pub mod native; + +#[derive(Default)] +pub struct Loader { + loaders: HashMap<String, Box<dyn Runnable<String, Tablized>>>, +} + +impl Loader { + pub fn new() -> Self { + let mut loaders: HashMap<String, Box<dyn Runnable<String, Tablized>>> = HashMap::new(); + + loaders.insert("csv".to_string(), Box::new(load_csv)); + + Self { loaders } + } + + pub fn load_sheet(&self, path: String, lua: &Lua) -> Option<SheetId> { + let p = Path::new(&path); + if p.is_file() { + let loader = self.loaders.get(p.extension()?.to_str()?)?; + return match loader.run(path, lua) { + Ok(table) => table.to_sheet(lua).ok(), + Err(_) => None, + }; + } + + return None; + } + + pub fn add(&mut self, extension: String, func: Box<dyn Runnable<String, Tablized>>) { + self.loaders.insert(extension, func); + } + + pub fn get() -> &'static mut Self { + static mut GLOBAL_LOADER: Lazy<Loader> = Lazy::new(|| Loader::new()); + unsafe { &mut *addr_of_mut!(GLOBAL_LOADER) } + } +} + +impl UserData for Loader { + fn add_methods<'lua, M: mlua::prelude::LuaUserDataMethods<'lua, Self>>(methods: &mut M) { + methods.add_function("add", |_, (extension, func): (String, OwnedFunction)| { + Loader::get().add(extension, Box::new(func)); + Ok(()) + }); + } +} diff --git a/src/sheet/loader/native/csv.rs b/src/sheet/loader/native/csv.rs new file mode 100644 index 0000000..4a8f05d --- /dev/null +++ b/src/sheet/loader/native/csv.rs @@ -0,0 +1,19 @@ +use std::{fs::File, io::BufReader}; + +use crate::sheet::{cell::Cell, tablized::Tablized}; + +pub fn load_csv(path: String) -> Tablized { + let file = File::open(path).unwrap(); + let reader = BufReader::new(file); + let mut csv_reader = csv::Reader::from_reader(reader); + + let mut table = Vec::new(); + + for result in csv_reader.records() { + if let Ok(record) = result { + table.push(record.iter().map(|s| Cell::from(s)).collect::<Vec<Cell>>()) + } + } + + Tablized::Vector(table) +} diff --git a/src/sheet/loader/native/mod.rs b/src/sheet/loader/native/mod.rs new file mode 100644 index 0000000..41ec797 --- /dev/null +++ b/src/sheet/loader/native/mod.rs @@ -0,0 +1,2 @@ + +pub mod csv; |