diff options
| author | Nathan Reiner <nathan@nathanreiner.xyz> | 2024-07-25 00:40:37 +0200 |
|---|---|---|
| committer | Nathan Reiner <nathan@nathanreiner.xyz> | 2024-07-25 00:40:37 +0200 |
| commit | 58b305b9f6d13007d2ea62775054c95177f81092 (patch) | |
| tree | 2123cb5379aa69476b1e549e0bcacc08d67fba71 /src/sheet/register.rs | |
first sketch
Diffstat (limited to 'src/sheet/register.rs')
| -rw-r--r-- | src/sheet/register.rs | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/src/sheet/register.rs b/src/sheet/register.rs new file mode 100644 index 0000000..aa5245b --- /dev/null +++ b/src/sheet/register.rs @@ -0,0 +1,60 @@ +use std::sync::{Arc, RwLock}; + +use mlua::{UserData, Value}; + +use super::{Sheet, SheetLuaRef}; + +static REGISTER: RwLock<Vec<Arc<RwLock<Sheet>>>> = RwLock::new(Vec::new()); + +pub type SheetId = usize; + +#[derive(Debug)] +pub struct Register; + +impl Register { + pub fn create(width: usize, height: usize) -> SheetId { + let mut register = REGISTER.write().unwrap(); + + let id = register.len(); + let sheet = Sheet::new(width, height, id); + register.push(Arc::new(RwLock::new(sheet))); + id + } + + pub fn get<'a>(id: SheetId) -> Option<Arc<RwLock<Sheet>>> { + let register = REGISTER.read().unwrap(); + + if id < register.len() { + Some(Arc::clone(®ister[id])) + } else { + None + } + } +} + +impl UserData for Register { + fn add_methods<'lua, M: mlua::UserDataMethods<'lua, Self>>(methods: &mut M) { + methods.add_function_mut("create", |lua, (width, height): (usize, usize)| { + let id = Register::create(width, height); + let luaref = SheetLuaRef::new(id); + if let Ok(ud) = lua.create_userdata(luaref) { + Ok(Value::UserData(ud)) + } else { + Ok(Value::Nil) + } + }); + + methods.add_function_mut("get", |lua, id: SheetId| { + if let Some(_) = Register::get(id) { + let luaref = SheetLuaRef::new(id); + if let Ok(ud) = lua.create_userdata(luaref) { + Ok(Value::UserData(ud)) + } else { + Ok(Value::Nil) + } + } else { + Ok(Value::Nil) + } + }) + } +} |