1 module zua.interop.userdata;
2 import zua.interop.table;
3 import zua.interop;
4 import zua.vm.engine;
5 import std.typecons;
6 import std.uuid;
7 
8 /** Wrapper around Lua userdata */
9 struct Userdata {
10 
11 	/** The internal data for this userdata; should seldom be accessed by user code */
12 	Value _internalUserdata;
13 
14 	package this(Value userdata) {
15 		_internalUserdata = userdata;
16 	}
17 
18 	@disable this();
19 
20 	/** Create a new userdata */
21 	static Userdata create(void* ptr, Nullable!Table metatable = Nullable!Table()) {
22 		auto res = Userdata(Value(new UserdataValue(ptr, null)));
23 		if (!metatable.isNull) {
24 			res.metatable = metatable;
25 		}
26 		return res;
27 	}
28 
29 	/** Get the metatable */
30 	Nullable!Table metatable() {
31 		if (_internalUserdata.metatable) {
32 			return Nullable!Table(Table(Value(_internalUserdata.metatable)));
33 		}
34 		else {
35 			return Nullable!Table();
36 		}
37 	}
38 
39 	/** Set the metatable */
40 	void metatable(Nullable!Table newMetatable) {
41 		if (newMetatable.isNull) {
42 			_internalUserdata.userdata.metatable = null;
43 		}
44 		else {
45 			_internalUserdata.userdata.metatable = newMetatable.get._internalTable.table;
46 		}
47 	}
48 
49 	/** Set the metatable */
50 	pragma(inline) void metatable(Table newMetatable) {
51 		metatable = newMetatable.Nullable!Table;
52 	}
53 
54 	/** Set the metatable */
55 	pragma(inline) void metatable(typeof(null)) {
56 		metatable = Nullable!Table();
57 	}
58 
59 	/** Get the internal data pointer */
60 	void* data() {
61 		return _internalUserdata.userdata.data;
62 	}
63 
64 	/** Set the internal data pointer */
65 	void data(void* value) {
66 		_internalUserdata.userdata.data = value;
67 	}
68 
69 	/** Get the owner UUID of this userdata */
70 	UUID owner() {
71 		return _internalUserdata.userdata.ownerId;
72 	}
73 
74 	/** Set the owner UUID of this userdata */
75 	void owner(UUID value) {
76 		_internalUserdata.userdata.ownerId = value;
77 	}
78 
79 }