summaryrefslogtreecommitdiff
path: root/src/sheet/register.rs
diff options
context:
space:
mode:
authorNathan Reiner <nathan@nathanreiner.xyz>2024-07-25 00:40:37 +0200
committerNathan Reiner <nathan@nathanreiner.xyz>2024-07-25 00:40:37 +0200
commit58b305b9f6d13007d2ea62775054c95177f81092 (patch)
tree2123cb5379aa69476b1e549e0bcacc08d67fba71 /src/sheet/register.rs
first sketch
Diffstat (limited to 'src/sheet/register.rs')
-rw-r--r--src/sheet/register.rs60
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(&register[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)
+ }
+ })
+ }
+}