1use mlua::{AnyUserData, FromLua, FromLuaMulti, IntoLua, IntoLuaMulti, Lua, MetaMethod, UserData, UserDataFields, UserDataMethods};
2
3use crate::{typed::generator::FunctionBuilder, MaybeSend};
4
5use super::{Typed, TypedDataFields, TypedDataMethods, TypedMultiValue};
6
7pub struct WrappedBuilder<'ctx, U>(&'ctx mut U);
11impl<'ctx, U> WrappedBuilder<'ctx, U> {
12 pub fn new(u: &'ctx mut U) -> Self {
13 WrappedBuilder(u)
14 }
15}
16
17impl<'lua, 'ctx, T: UserData, U: UserDataFields<'lua, T>> TypedDataFields<'lua, T>
18 for WrappedBuilder<'ctx, U>
19{
20 fn document(&mut self, _doc: &str) -> &mut Self {
21 self
22 }
23
24 fn add_field<V>(&mut self, name: impl AsRef<str>, value: V)
25 where
26 V: IntoLua<'lua> + Clone + 'static + Typed,
27 {
28 self.0.add_field(name, value)
29 }
30
31 fn add_field_function_set<S, A, F>(&mut self, name: &S, function: F)
32 where
33 S: AsRef<str> + ?Sized,
34 A: FromLua<'lua> + Typed,
35 F: 'static + MaybeSend + FnMut(&'lua Lua, AnyUserData<'lua>, A) -> mlua::Result<()>,
36 {
37 self.0.add_field_function_set(name, function)
38 }
39
40 fn add_field_function_get<S, R, F>(&mut self, name: &S, function: F)
41 where
42 S: AsRef<str> + ?Sized,
43 R: IntoLua<'lua> + Typed,
44 F: 'static + MaybeSend + Fn(&'lua Lua, AnyUserData<'lua>) -> mlua::Result<R>,
45 {
46 self.0.add_field_function_get(name, function)
47 }
48
49 fn add_field_function_get_set<S, R, A, GET, SET>(&mut self, name: &S, get: GET, set: SET)
50 where
51 S: AsRef<str> + ?Sized,
52 R: IntoLua<'lua> + Typed,
53 A: FromLua<'lua> + Typed,
54 GET: 'static + MaybeSend + Fn(&'lua Lua, AnyUserData<'lua>) -> mlua::Result<R>,
55 SET: 'static + MaybeSend + Fn(&'lua Lua, AnyUserData<'lua>, A) -> mlua::Result<()>,
56 {
57 self.0.add_field_function_get(name, get);
58 self.0.add_field_function_set(name, set);
59 }
60
61 fn add_field_method_set<S, A, M>(&mut self, name: &S, method: M)
62 where
63 S: AsRef<str> + ?Sized,
64 A: FromLua<'lua> + Typed,
65 M: 'static + MaybeSend + FnMut(&'lua Lua, &mut T, A) -> mlua::Result<()>,
66 {
67 self.0.add_field_method_set(name, method)
68 }
69
70 fn add_field_method_get<S, R, M>(&mut self, name: &S, method: M)
71 where
72 S: AsRef<str> + ?Sized,
73 R: IntoLua<'lua> + Typed,
74 M: 'static + MaybeSend + Fn(&'lua Lua, &T) -> mlua::Result<R>,
75 {
76 self.0.add_field_method_get(name, method)
77 }
78
79 fn add_field_method_get_set<S, R, A, GET, SET>(&mut self, name: &S, get: GET, set: SET)
80 where
81 S: AsRef<str> + ?Sized,
82 R: IntoLua<'lua> + Typed,
83 A: FromLua<'lua> + Typed,
84 GET: 'static + MaybeSend + Fn(&'lua Lua, &T) -> mlua::Result<R>,
85 SET: 'static + MaybeSend + Fn(&'lua Lua, &mut T, A) -> mlua::Result<()>,
86 {
87 self.0.add_field_method_get(name, get);
88 self.0.add_field_method_set(name, set);
89 }
90
91 fn add_meta_field<R, F>(&mut self, meta: MetaMethod, f: F)
92 where
93 F: 'static + MaybeSend + Fn(&'lua Lua) -> mlua::Result<R>,
94 R: IntoLua<'lua>,
95 {
96 self.0.add_meta_field_with(meta, f)
97 }
98}
99
100impl<'lua, 'ctx, T: UserData, U: UserDataMethods<'lua, T>> TypedDataMethods<'lua, T>
101 for WrappedBuilder<'ctx, U>
102{
103 fn document(&mut self, _documentation: &str) -> &mut Self {
104 self
105 }
106
107 fn add_method<S, A, R, M>(&mut self, name: &S, method: M)
108 where
109 S: ?Sized + AsRef<str>,
110 A: FromLuaMulti<'lua> + TypedMultiValue,
111 R: IntoLuaMulti<'lua> + TypedMultiValue,
112 M: 'static + MaybeSend + Fn(&'lua Lua, &T, A) -> mlua::Result<R>,
113 {
114 self.0.add_method(name, method)
115 }
116
117 fn add_method_with<S, A, R, M, G>(&mut self, name: &S, method: M, _generator: G)
118 where
119 S: ?Sized + AsRef<str>,
120 A: FromLuaMulti<'lua> + TypedMultiValue,
121 R: IntoLuaMulti<'lua> + TypedMultiValue,
122 M: 'static + MaybeSend + Fn(&'lua Lua, &T, A) -> mlua::Result<R>,
123 G: Fn(&mut FunctionBuilder<A, R>) {
124 self.0.add_method(name, method)
125 }
126
127 fn add_function<S, A, R, F>(&mut self, name: &S, function: F)
128 where
129 S: ?Sized + AsRef<str>,
130 A: FromLuaMulti<'lua> + TypedMultiValue,
131 R: IntoLuaMulti<'lua> + TypedMultiValue,
132 F: 'static + MaybeSend + Fn(&'lua Lua, A) -> mlua::Result<R>,
133 {
134 self.0.add_function(name, function)
135 }
136
137 fn add_function_with<S, A, R, F, G>(&mut self, name: &S, function: F, _generator: G)
138 where
139 S: ?Sized + AsRef<str>,
140 A: FromLuaMulti<'lua> + TypedMultiValue,
141 R: IntoLuaMulti<'lua> + TypedMultiValue,
142 F: 'static + MaybeSend + Fn(&'lua Lua, A) -> mlua::Result<R>,
143 G: Fn(&mut FunctionBuilder<A, R>) {
144 self.0.add_function(name, function)
145 }
146
147 fn add_method_mut<S, A, R, M>(&mut self, name: &S, method: M)
148 where
149 S: ?Sized + AsRef<str>,
150 A: FromLuaMulti<'lua> + TypedMultiValue,
151 R: IntoLuaMulti<'lua> + TypedMultiValue,
152 M: 'static + MaybeSend + FnMut(&'lua Lua, &mut T, A) -> mlua::Result<R>,
153 {
154 self.0.add_method_mut(name, method)
155 }
156
157 fn add_method_mut_with<S, A, R, M, G>(&mut self, name: &S, method: M, _generator: G)
158 where
159 S: ?Sized + AsRef<str>,
160 A: FromLuaMulti<'lua> + TypedMultiValue,
161 R: IntoLuaMulti<'lua> + TypedMultiValue,
162 M: 'static + MaybeSend + FnMut(&'lua Lua, &mut T, A) -> mlua::Result<R>,
163 G: Fn(&mut FunctionBuilder<A, R>) {
164 self.0.add_method_mut(name, method)
165 }
166
167 fn add_meta_method<A, R, M>(&mut self, meta: MetaMethod, method: M)
168 where
169 A: FromLuaMulti<'lua> + TypedMultiValue,
170 R: IntoLuaMulti<'lua> + TypedMultiValue,
171 M: 'static + MaybeSend + Fn(&'lua Lua, &T, A) -> mlua::Result<R>,
172 {
173 self.0.add_meta_method(meta, method)
174 }
175
176 fn add_meta_method_with<A, R, M, G>(&mut self, meta: MetaMethod, method: M, _generator: G)
177 where
178 A: FromLuaMulti<'lua> + TypedMultiValue,
179 R: IntoLuaMulti<'lua> + TypedMultiValue,
180 M: 'static + MaybeSend + Fn(&'lua Lua, &T, A) -> mlua::Result<R>,
181 G: Fn(&mut FunctionBuilder<A, R>) {
182 self.0.add_meta_method(meta, method)
183 }
184
185 #[cfg(feature = "async")]
186 fn add_async_method<'s, S: ?Sized + AsRef<str>, A, R, M, MR>(&mut self, name: &S, method: M)
187 where
188 'lua: 's,
189 T: 'static,
190 M: Fn(&'lua Lua, &'s T, A) -> MR + MaybeSend + 'static,
191 A: FromLuaMulti<'lua> + TypedMultiValue,
192 MR: std::future::Future<Output = mlua::Result<R>> + 's,
193 R: IntoLuaMulti<'lua>,
194 {
195 self.0.add_async_method(name, method)
196 }
197
198 #[cfg(feature = "async")]
199 fn add_async_method_with<'s, S: ?Sized + AsRef<str>, A, R, M, MR, G>(&mut self, name: &S, method: M, _generator: G)
200 where
201 'lua: 's,
202 T: 'static,
203 M: Fn(&'lua Lua, &'s T, A) -> MR + MaybeSend + 'static,
204 A: FromLuaMulti<'lua> + TypedMultiValue,
205 MR: std::future::Future<Output = mlua::Result<R>> + 's,
206 R: IntoLuaMulti<'lua> + TypedMultiValue,
207 G: Fn(&mut FunctionBuilder<A, R>) {
208 self.0.add_async_method(name, method)
209 }
210
211 #[cfg(feature = "async")]
212 fn add_async_method_mut<'s, S: ?Sized + AsRef<str>, A, R, M, MR>(&mut self, name: &S, method: M)
213 where
214 'lua: 's,
215 T: 'static,
216 M: Fn(&'lua Lua, &'s mut T, A) -> MR + MaybeSend + 'static,
217 A: FromLuaMulti<'lua> + TypedMultiValue,
218 MR: std::future::Future<Output = mlua::Result<R>> + 's,
219 R: IntoLuaMulti<'lua>,
220 {
221 self.0.add_async_method_mut(name, method)
222 }
223
224 #[cfg(feature = "async")]
225 fn add_async_method_mut_with<'s, S: ?Sized + AsRef<str>, A, R, M, MR, G>(&mut self, name: &S, method: M, _generator: G)
226 where
227 'lua: 's,
228 T: 'static,
229 M: Fn(&'lua Lua, &'s mut T, A) -> MR + MaybeSend + 'static,
230 A: FromLuaMulti<'lua> + TypedMultiValue,
231 MR: std::future::Future<Output = mlua::Result<R>> + 's,
232 R: IntoLuaMulti<'lua> + TypedMultiValue,
233 G: Fn(&mut FunctionBuilder<A, R>) {
234 self.0.add_async_method_mut(name, method)
235 }
236
237 fn add_function_mut<S, A, R, F>(&mut self, name: &S, function: F)
238 where
239 S: ?Sized + AsRef<str>,
240 A: FromLuaMulti<'lua> + TypedMultiValue,
241 R: IntoLuaMulti<'lua> + TypedMultiValue,
242 F: 'static + MaybeSend + FnMut(&'lua Lua, A) -> mlua::Result<R>,
243 {
244 self.0.add_function_mut(name, function)
245 }
246
247 fn add_function_mut_with<S, A, R, F, G>(&mut self, name: &S, function: F, _generator: G)
248 where
249 S: ?Sized + AsRef<str>,
250 A: FromLuaMulti<'lua> + TypedMultiValue,
251 R: IntoLuaMulti<'lua> + TypedMultiValue,
252 F: 'static + MaybeSend + FnMut(&'lua Lua, A) -> mlua::Result<R>,
253 G: Fn(&mut FunctionBuilder<A, R>) {
254 self.0.add_function_mut(name, function)
255 }
256
257 fn add_meta_function<A, R, F>(&mut self, meta: MetaMethod, function: F)
258 where
259 A: FromLuaMulti<'lua> + TypedMultiValue,
260 R: IntoLuaMulti<'lua> + TypedMultiValue,
261 F: 'static + MaybeSend + Fn(&'lua Lua, A) -> mlua::Result<R>,
262 {
263 self.0.add_meta_function(meta, function)
264 }
265
266 fn add_meta_function_with<A, R, F, G>(&mut self, meta: MetaMethod, function: F, _generator: G)
267 where
268 A: FromLuaMulti<'lua> + TypedMultiValue,
269 R: IntoLuaMulti<'lua> + TypedMultiValue,
270 F: 'static + MaybeSend + Fn(&'lua Lua, A) -> mlua::Result<R>,
271 G: Fn(&mut FunctionBuilder<A, R>) {
272 self.0.add_meta_function(meta, function)
273 }
274
275 #[cfg(feature = "async")]
276 fn add_async_function<S: ?Sized, A, R, F, FR>(&mut self, name: &S, function: F)
277 where
278 S: AsRef<str>,
279 A: FromLuaMulti<'lua> + TypedMultiValue,
280 R: IntoLuaMulti<'lua> + TypedMultiValue,
281 F: 'static + MaybeSend + Fn(&'lua Lua, A) -> FR,
282 FR: 'lua + std::future::Future<Output = mlua::Result<R>>,
283 {
284 self.0.add_async_function(name, function)
285 }
286
287 #[cfg(feature = "async")]
288 fn add_async_function_with<S: ?Sized, A, R, F, FR, G>(&mut self, name: &S, function: F, _generator: G)
289 where
290 S: AsRef<str>,
291 A: FromLuaMulti<'lua> + TypedMultiValue,
292 R: IntoLuaMulti<'lua> + TypedMultiValue,
293 F: 'static + MaybeSend + Fn(&'lua Lua, A) -> FR,
294 FR: 'lua + std::future::Future<Output = mlua::Result<R>>,
295 G: Fn(&mut FunctionBuilder<A, R>) {
296 self.0.add_async_function(name, function)
297 }
298
299 fn add_meta_method_mut<A, R, M>(&mut self, meta: MetaMethod, method: M)
300 where
301 A: FromLuaMulti<'lua> + TypedMultiValue,
302 R: IntoLuaMulti<'lua> + TypedMultiValue,
303 M: 'static + MaybeSend + FnMut(&'lua Lua, &mut T, A) -> mlua::Result<R>,
304 {
305 self.0.add_meta_method_mut(meta, method)
306 }
307
308 fn add_meta_method_mut_with<A, R, M, G>(&mut self, meta: MetaMethod, method: M, _generator: G)
309 where
310 A: FromLuaMulti<'lua> + TypedMultiValue,
311 R: IntoLuaMulti<'lua> + TypedMultiValue,
312 M: 'static + MaybeSend + FnMut(&'lua Lua, &mut T, A) -> mlua::Result<R>,
313 G: Fn(&mut FunctionBuilder<A, R>) {
314 self.0.add_meta_method_mut(meta, method)
315 }
316
317 fn add_meta_function_mut<A, R, F>(&mut self, meta: MetaMethod, function: F)
318 where
319 A: FromLuaMulti<'lua> + TypedMultiValue,
320 R: IntoLuaMulti<'lua> + TypedMultiValue,
321 F: 'static + MaybeSend + FnMut(&'lua Lua, A) -> mlua::Result<R>,
322 {
323 self.0.add_meta_function_mut(meta, function)
324 }
325
326 fn add_meta_function_mut_with<A, R, F, G>(&mut self, meta: MetaMethod, function: F, _generator: G)
327 where
328 A: FromLuaMulti<'lua> + TypedMultiValue,
329 R: IntoLuaMulti<'lua> + TypedMultiValue,
330 F: 'static + MaybeSend + FnMut(&'lua Lua, A) -> mlua::Result<R>,
331 G: Fn(&mut FunctionBuilder<A, R>) {
332 self.0.add_meta_function_mut(meta, function)
333 }
334}