use crate::error::DbError;
use crate::scripting::string_utils::*;
use mlua::Lua;
fn safe_regex(pattern: &str) -> Result<regex::Regex, String> {
if pattern.len() > 1000 {
return Err("Pattern too long".to_string());
}
regex::RegexBuilder::new(pattern)
.size_limit(1024 * 1024) .dfa_size_limit(1024 * 1024)
.build()
.map_err(|e| e.to_string())
}
pub fn setup_string_extensions(lua: &Lua) -> Result<(), DbError> {
let globals = lua.globals();
let string_table: mlua::Table = globals
.get("string")
.map_err(|e| DbError::InternalError(format!("Failed to get string table: {}", e)))?;
let regex_fn = lua
.create_function(|_, (s, pattern): (String, String)| {
let re = safe_regex(&pattern).map_err(mlua::Error::RuntimeError)?;
Ok(re.is_match(&s))
})
.map_err(|e| DbError::InternalError(format!("Failed to create regex function: {}", e)))?;
string_table
.set("regex", regex_fn)
.map_err(|e| DbError::InternalError(format!("Failed to set string.regex: {}", e)))?;
let regex_replace_fn = lua
.create_function(|_, (s, pattern, replacement): (String, String, String)| {
let re = safe_regex(&pattern).map_err(mlua::Error::RuntimeError)?;
Ok(re.replace_all(&s, replacement.as_str()).to_string())
})
.map_err(|e| {
DbError::InternalError(format!("Failed to create regex_replace function: {}", e))
})?;
string_table
.set("regex_replace", regex_replace_fn)
.map_err(|e| {
DbError::InternalError(format!("Failed to set string.regex_replace: {}", e))
})?;
let slugify_fn = create_slugify_function(lua)
.map_err(|e| DbError::InternalError(format!("Failed to create slugify function: {}", e)))?;
string_table
.set("slugify", slugify_fn)
.map_err(|e| DbError::InternalError(format!("Failed to set string.slugify: {}", e)))?;
let truncate_fn = create_truncate_function(lua).map_err(|e| {
DbError::InternalError(format!("Failed to create truncate function: {}", e))
})?;
string_table
.set("truncate", truncate_fn)
.map_err(|e| DbError::InternalError(format!("Failed to set string.truncate: {}", e)))?;
let template_fn = create_template_function(lua).map_err(|e| {
DbError::InternalError(format!("Failed to create template function: {}", e))
})?;
string_table
.set("template", template_fn)
.map_err(|e| DbError::InternalError(format!("Failed to set string.template: {}", e)))?;
let split_fn = create_split_function(lua)
.map_err(|e| DbError::InternalError(format!("Failed to create split function: {}", e)))?;
string_table
.set("split", split_fn)
.map_err(|e| DbError::InternalError(format!("Failed to set string.split: {}", e)))?;
let trim_fn = create_trim_function(lua)
.map_err(|e| DbError::InternalError(format!("Failed to create trim function: {}", e)))?;
string_table
.set("trim", trim_fn)
.map_err(|e| DbError::InternalError(format!("Failed to set string.trim: {}", e)))?;
let pad_left_fn = create_pad_left_function(lua).map_err(|e| {
DbError::InternalError(format!("Failed to create pad_left function: {}", e))
})?;
string_table
.set("pad_left", pad_left_fn)
.map_err(|e| DbError::InternalError(format!("Failed to set string.pad_left: {}", e)))?;
let pad_right_fn = create_pad_right_function(lua).map_err(|e| {
DbError::InternalError(format!("Failed to create pad_right function: {}", e))
})?;
string_table
.set("pad_right", pad_right_fn)
.map_err(|e| DbError::InternalError(format!("Failed to set string.pad_right: {}", e)))?;
let capitalize_fn = create_capitalize_function(lua).map_err(|e| {
DbError::InternalError(format!("Failed to create capitalize function: {}", e))
})?;
string_table
.set("capitalize", capitalize_fn)
.map_err(|e| DbError::InternalError(format!("Failed to set string.capitalize: {}", e)))?;
let title_case_fn = create_title_case_function(lua).map_err(|e| {
DbError::InternalError(format!("Failed to create title_case function: {}", e))
})?;
string_table
.set("title_case", title_case_fn)
.map_err(|e| DbError::InternalError(format!("Failed to set string.title_case: {}", e)))?;
Ok(())
}