lune_utils/
table_builder.rs1#![allow(clippy::missing_errors_doc)]
2
3use std::future::Future;
4
5use mlua::prelude::*;
6
7pub struct TableBuilder {
11 lua: Lua,
12 tab: LuaTable,
13}
14
15impl TableBuilder {
16 pub fn new(lua: Lua) -> LuaResult<Self> {
20 let tab = lua.create_table()?;
21 Ok(Self { lua, tab })
22 }
23
24 pub fn with_value<K, V>(self, key: K, value: V) -> LuaResult<Self>
30 where
31 K: IntoLua,
32 V: IntoLua,
33 {
34 self.tab.raw_set(key, value)?;
35 Ok(self)
36 }
37
38 pub fn with_values<K, V>(self, values: Vec<(K, V)>) -> LuaResult<Self>
44 where
45 K: IntoLua,
46 V: IntoLua,
47 {
48 for (key, value) in values {
49 self.tab.raw_set(key, value)?;
50 }
51 Ok(self)
52 }
53
54 pub fn with_sequential_value<V>(self, value: V) -> LuaResult<Self>
61 where
62 V: IntoLua,
63 {
64 self.tab.raw_push(value)?;
65 Ok(self)
66 }
67
68 pub fn with_sequential_values<V>(self, values: Vec<V>) -> LuaResult<Self>
75 where
76 V: IntoLua,
77 {
78 for value in values {
79 self.tab.raw_push(value)?;
80 }
81 Ok(self)
82 }
83
84 pub fn with_function<K, A, R, F>(self, key: K, func: F) -> LuaResult<Self>
90 where
91 K: IntoLua,
92 A: FromLuaMulti,
93 R: IntoLuaMulti,
94 F: Fn(&Lua, A) -> LuaResult<R> + 'static,
95 {
96 let f = self.lua.create_function(func)?;
97 self.with_value(key, LuaValue::Function(f))
98 }
99
100 pub fn with_async_function<K, A, R, F, FR>(self, key: K, func: F) -> LuaResult<Self>
106 where
107 K: IntoLua,
108 A: FromLuaMulti,
109 R: IntoLuaMulti,
110 F: Fn(Lua, A) -> FR + 'static,
111 FR: Future<Output = LuaResult<R>> + 'static,
112 {
113 let f = self.lua.create_async_function(func)?;
114 self.with_value(key, LuaValue::Function(f))
115 }
116
117 pub fn with_metatable(self, table: LuaTable) -> LuaResult<Self> {
123 self.tab.set_metatable(Some(table))?;
124 Ok(self)
125 }
126
127 pub fn build_readonly(self) -> LuaResult<LuaTable> {
133 self.tab.set_readonly(true);
134 Ok(self.tab)
135 }
136
137 pub fn build(self) -> LuaResult<LuaTable> {
141 Ok(self.tab)
142 }
143}