From 58b305b9f6d13007d2ea62775054c95177f81092 Mon Sep 17 00:00:00 2001 From: Nathan Reiner Date: Thu, 25 Jul 2024 00:40:37 +0200 Subject: first sketch --- src/sheet/register.rs | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/sheet/register.rs (limited to 'src/sheet/register.rs') 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>>> = 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>> { + 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) + } + }) + } +} -- cgit v1.2.3-70-g09d2