use crate::script::support::{collect_string_sequence, expect_table};
use mlua::{Lua, Value};
pub fn select_keys(lua: &Lua, rec: Value, keys: Value) -> mlua::Result<Value> {
let rec = expect_table(rec, "aip.shape.select_keys", "Record")?;
let key_names = collect_string_sequence(keys, "aip.shape.select_keys", "Key names")?;
let out = lua.create_table()?;
for key in key_names {
let val: Value = rec.get(key.clone())?;
if !val.is_nil() {
out.set(key, val)?;
}
}
Ok(Value::Table(out))
}
pub fn omit_keys(lua: &Lua, rec: Value, keys: Value) -> mlua::Result<Value> {
let rec = expect_table(rec, "aip.shape.omit_keys", "Record")?;
use std::collections::HashSet;
let key_names = collect_string_sequence(keys, "aip.shape.omit_keys", "Key names")?;
let mut omit_set: HashSet<String> = HashSet::with_capacity(key_names.len());
for key in key_names {
omit_set.insert(key.to_string_lossy().to_string());
}
let out = lua.create_table()?;
for pair in rec.pairs::<Value, Value>() {
let (k, v) = pair?;
let skip = match &k {
Value::String(s) => {
let needle = s.to_string_lossy();
omit_set.contains(&needle)
}
_ => false,
};
if !skip {
out.set(k, v)?;
}
}
Ok(Value::Table(out))
}
pub fn remove_keys(_lua: &Lua, rec: Value, keys: Value) -> mlua::Result<Value> {
let rec = expect_table(rec, "aip.shape.remove_keys", "Record")?;
let key_names = collect_string_sequence(keys, "aip.shape.remove_keys", "Key names")?;
let mut removed: i64 = 0;
for key in key_names {
let val: Value = rec.get(key.clone())?;
if !val.is_nil() {
rec.set(key, Value::Nil)?;
removed += 1;
}
}
Ok(Value::Integer(removed))
}
pub fn extract_keys(lua: &Lua, rec: Value, keys: Value) -> mlua::Result<Value> {
let rec = expect_table(rec, "aip.shape.extract_keys", "Record")?;
let key_names = collect_string_sequence(keys, "aip.shape.extract_keys", "Key names")?;
let out = lua.create_table()?;
for key in key_names {
let val: Value = rec.get(key.clone())?;
if !val.is_nil() {
out.set(key.clone(), val)?;
rec.set(key, Value::Nil)?;
}
}
Ok(Value::Table(out))
}
#[cfg(test)]
#[path = "shape_keys_tests.rs"]
mod tests;