use std::any::Any;
use std::cell::RefCell;
use std::rc::Rc;
use crate::gc::GcRef;
use crate::table::LuaTable;
use crate::value::LuaValue;
pub struct LuaUserData {
pub data: Box<[u8]>,
pub uv: RefCell<Vec<LuaValue>>,
pub metatable: RefCell<Option<GcRef<LuaTable>>>,
pub host_value: RefCell<Option<Rc<dyn Any>>>,
}
impl std::fmt::Debug for LuaUserData {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("LuaUserData")
.field("data_len", &self.data.len())
.field("uv_len", &self.uv.borrow().len())
.field("has_metatable", &self.metatable.borrow().is_some())
.field("has_host_value", &self.host_value.borrow().is_some())
.finish()
}
}
impl LuaUserData {
pub fn placeholder() -> Self {
LuaUserData {
data: Box::new([]),
uv: RefCell::new(Vec::new()),
metatable: RefCell::new(None),
host_value: RefCell::new(None),
}
}
pub fn metatable(&self) -> Option<GcRef<LuaTable>> {
self.metatable.borrow().clone()
}
pub fn set_metatable(&self, mt: Option<GcRef<LuaTable>>) {
*self.metatable.borrow_mut() = mt;
}
pub fn host_value(&self) -> Option<Rc<dyn Any>> {
self.host_value.borrow().clone()
}
pub fn set_host_value(&self, value: Option<Rc<dyn Any>>) {
*self.host_value.borrow_mut() = value;
}
pub fn buffer_bytes(&self) -> usize {
self.data
.len()
.saturating_add(self.uv.borrow().capacity() * std::mem::size_of::<LuaValue>())
}
}