playdate_rs/lua.rs
1use alloc::{borrow::ToOwned, ffi::CString};
2
3use crate::error::Error;
4
5pub struct Lua {
6 #[allow(unused)]
7 handle: *const sys::playdate_lua,
8}
9
10impl Lua {
11 pub(crate) fn new(handle: *const sys::playdate_lua) -> Self {
12 Self { handle }
13 }
14
15 pub fn add_function(&self, f: sys::lua_CFunction, name: impl AsRef<str>) -> Result<(), Error> {
16 let c_string = CString::new(name.as_ref()).unwrap();
17 unsafe {
18 let mut err = core::ptr::null();
19 (*self.handle).addFunction.unwrap()(f, c_string.as_ptr(), &mut err);
20 if !err.is_null() {
21 let c_str = ::core::ffi::CStr::from_ptr(err);
22 let err_str = c_str.to_str().unwrap();
23 Err(Error::Lua(err_str.to_owned()))
24 } else {
25 Ok(())
26 }
27 }
28 }
29
30 // pub addFunction: ::core::option::Option<
31 // unsafe extern "C" fn(
32 // f: lua_CFunction,
33 // name: *const ::core::ffi::c_char,
34 // outErr: *mut *const ::core::ffi::c_char,
35 // ) -> ::core::ffi::c_int,
36 // >,
37 // pub registerClass: ::core::option::Option<
38 // unsafe extern "C" fn(
39 // name: *const ::core::ffi::c_char,
40 // reg: *const lua_reg,
41 // vals: *const lua_val,
42 // isstatic: ::core::ffi::c_int,
43 // outErr: *mut *const ::core::ffi::c_char,
44 // ) -> ::core::ffi::c_int,
45 // >,
46 // pub pushFunction: ::core::option::Option<unsafe extern "C" fn(f: lua_CFunction)>,
47 // pub indexMetatable: ::core::option::Option<unsafe extern "C" fn() -> ::core::ffi::c_int>,
48 // pub stop: ::core::option::Option<unsafe extern "C" fn()>,
49 // pub start: ::core::option::Option<unsafe extern "C" fn()>,
50 // pub getArgCount: ::core::option::Option<unsafe extern "C" fn() -> ::core::ffi::c_int>,
51 // pub getArgType: ::core::option::Option<
52 // unsafe extern "C" fn(
53 // pos: ::core::ffi::c_int,
54 // outClass: *mut *const ::core::ffi::c_char,
55 // ) -> LuaType,
56 // >,
57 // pub argIsNil:
58 // ::core::option::Option<unsafe extern "C" fn(pos: ::core::ffi::c_int) -> ::core::ffi::c_int>,
59 // pub getArgBool:
60 // ::core::option::Option<unsafe extern "C" fn(pos: ::core::ffi::c_int) -> ::core::ffi::c_int>,
61 // pub getArgInt:
62 // ::core::option::Option<unsafe extern "C" fn(pos: ::core::ffi::c_int) -> ::core::ffi::c_int>,
63 // pub getArgFloat: ::core::option::Option<unsafe extern "C" fn(pos: ::core::ffi::c_int) -> f32>,
64 // pub getArgString: ::core::option::Option<
65 // unsafe extern "C" fn(pos: ::core::ffi::c_int) -> *const ::core::ffi::c_char,
66 // >,
67 // pub getArgBytes: ::core::option::Option<
68 // unsafe extern "C" fn(
69 // pos: ::core::ffi::c_int,
70 // outlen: *mut usize,
71 // ) -> *const ::core::ffi::c_char,
72 // >,
73 // pub getArgObject: ::core::option::Option<
74 // unsafe extern "C" fn(
75 // pos: ::core::ffi::c_int,
76 // type_: *mut ::core::ffi::c_char,
77 // outud: *mut *mut LuaUDObject,
78 // ) -> *mut ::core::ffi::c_void,
79 // >,
80 // pub getBitmap:
81 // ::core::option::Option<unsafe extern "C" fn(pos: ::core::ffi::c_int) -> *mut LCDBitmap>,
82 // pub getSprite:
83 // ::core::option::Option<unsafe extern "C" fn(pos: ::core::ffi::c_int) -> *mut LCDSprite>,
84 // pub pushNil: ::core::option::Option<unsafe extern "C" fn()>,
85 // pub pushBool: ::core::option::Option<unsafe extern "C" fn(val: ::core::ffi::c_int)>,
86 // pub pushInt: ::core::option::Option<unsafe extern "C" fn(val: ::core::ffi::c_int)>,
87 // pub pushFloat: ::core::option::Option<unsafe extern "C" fn(val: f32)>,
88 // pub pushString: ::core::option::Option<unsafe extern "C" fn(str_: *const ::core::ffi::c_char)>,
89 // pub pushBytes:
90 // ::core::option::Option<unsafe extern "C" fn(str_: *const ::core::ffi::c_char, len: usize)>,
91 // pub pushBitmap: ::core::option::Option<unsafe extern "C" fn(bitmap: *mut LCDBitmap)>,
92 // pub pushSprite: ::core::option::Option<unsafe extern "C" fn(sprite: *mut LCDSprite)>,
93 // pub pushObject: ::core::option::Option<
94 // unsafe extern "C" fn(
95 // obj: *mut ::core::ffi::c_void,
96 // type_: *mut ::core::ffi::c_char,
97 // nValues: ::core::ffi::c_int,
98 // ) -> *mut LuaUDObject,
99 // >,
100 // pub retainObject:
101 // ::core::option::Option<unsafe extern "C" fn(obj: *mut LuaUDObject) -> *mut LuaUDObject>,
102 // pub releaseObject: ::core::option::Option<unsafe extern "C" fn(obj: *mut LuaUDObject)>,
103 // pub setUserValue: ::core::option::Option<
104 // unsafe extern "C" fn(obj: *mut LuaUDObject, slot: ::core::ffi::c_uint),
105 // >,
106 // pub getUserValue: ::core::option::Option<
107 // unsafe extern "C" fn(
108 // obj: *mut LuaUDObject,
109 // slot: ::core::ffi::c_uint,
110 // ) -> ::core::ffi::c_int,
111 // >,
112 // pub callFunction_deprecated: ::core::option::Option<
113 // unsafe extern "C" fn(name: *const ::core::ffi::c_char, nargs: ::core::ffi::c_int),
114 // >,
115 // pub callFunction: ::core::option::Option<
116 // unsafe extern "C" fn(
117 // name: *const ::core::ffi::c_char,
118 // nargs: ::core::ffi::c_int,
119 // outerr: *mut *const ::core::ffi::c_char,
120 // ) -> ::core::ffi::c_int,
121 // >,
122}