Fix __tostring metamethods sometimes not being respected properly

This commit is contained in:
Filip Tibell 2025-04-24 21:31:03 +02:00
parent 4ce2d3a80f
commit c163c6f157
No known key found for this signature in database

View file

@ -1,37 +1,35 @@
use mlua::prelude::*; use mlua::prelude::*;
pub fn get_table_type_metavalue(tab: &LuaTable) -> Option<String> { pub fn get_table_type_metavalue(tab: &LuaTable) -> Option<String> {
let s = tab let meta = tab.metatable()?;
.metatable()? let s = meta.get::<LuaString>(LuaMetaMethod::Type.name()).ok()?;
.get::<LuaString>(LuaMetaMethod::Type.name())
.ok()?;
let s = s.to_str().ok()?; let s = s.to_str().ok()?;
Some(s.to_string()) Some(s.to_string())
} }
pub fn get_userdata_type_metavalue(tab: &LuaAnyUserData) -> Option<String> { pub fn get_userdata_type_metavalue(usr: &LuaAnyUserData) -> Option<String> {
let s = tab let meta = usr.metatable().ok()?;
.metatable() let s = meta.get::<LuaString>(LuaMetaMethod::Type.name()).ok()?;
.ok()?
.get::<LuaString>(LuaMetaMethod::Type.name())
.ok()?;
let s = s.to_str().ok()?; let s = s.to_str().ok()?;
Some(s.to_string()) Some(s.to_string())
} }
pub fn call_table_tostring_metamethod(tab: &LuaTable) -> Option<String> { pub fn call_table_tostring_metamethod(tab: &LuaTable) -> Option<String> {
tab.metatable()? let meta = tab.metatable()?;
.get::<LuaFunction>(LuaMetaMethod::ToString.name()) let value = meta.get(LuaMetaMethod::ToString.name()).ok()?;
.ok()? match value {
.call(tab) LuaValue::String(s) => Some(s.to_string_lossy().to_string()),
.ok() LuaValue::Function(f) => f.call(tab).ok(),
_ => None,
}
} }
pub fn call_userdata_tostring_metamethod(tab: &LuaAnyUserData) -> Option<String> { pub fn call_userdata_tostring_metamethod(usr: &LuaAnyUserData) -> Option<String> {
tab.metatable() let meta = usr.metatable().ok()?;
.ok()? let value = meta.get(LuaMetaMethod::ToString.name()).ok()?;
.get::<LuaFunction>(LuaMetaMethod::ToString.name()) match value {
.ok()? LuaValue::String(s) => Some(s.to_string_lossy().to_string()),
.call(tab) LuaValue::Function(f) => f.call(usr).ok(),
.ok() _ => None,
}
} }