use crate::lua_value::LuaValue;
use crate::lua_vm::{LuaResult, LuaVM};
pub struct TableBuilder {
entries: Vec<(TableKey, LuaValue)>,
array: Vec<LuaValue>,
}
enum TableKey {
String(String),
Integer(i64),
Value(LuaValue),
}
impl TableBuilder {
#[inline]
pub fn new() -> Self {
TableBuilder {
entries: Vec::new(),
array: Vec::new(),
}
}
#[inline]
pub fn set(mut self, key: &str, value: LuaValue) -> Self {
self.entries.push((TableKey::String(key.to_owned()), value));
self
}
#[inline]
pub fn set_int(mut self, key: i64, value: LuaValue) -> Self {
self.entries.push((TableKey::Integer(key), value));
self
}
#[inline]
pub fn set_value(mut self, key: LuaValue, value: LuaValue) -> Self {
self.entries.push((TableKey::Value(key), value));
self
}
#[inline]
pub fn push(mut self, value: LuaValue) -> Self {
self.array.push(value);
self
}
pub fn build(self, vm: &mut LuaVM) -> LuaResult<LuaValue> {
let table = vm.create_table(self.array.len(), self.entries.len())?;
for (i, val) in self.array.into_iter().enumerate() {
let key = LuaValue::integer((i + 1) as i64);
vm.raw_set(&table, key, val);
}
for (k, val) in self.entries {
let key = match k {
TableKey::String(s) => vm.create_string(&s)?,
TableKey::Integer(n) => LuaValue::integer(n),
TableKey::Value(v) => v,
};
vm.raw_set(&table, key, val);
}
Ok(table)
}
}
impl Default for TableBuilder {
fn default() -> Self {
Self::new()
}
}