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) } }) } }