From c163c6f157c5ca597e924db74a4015041556c7f5 Mon Sep 17 00:00:00 2001 From: Filip Tibell Date: Thu, 24 Apr 2025 21:31:03 +0200 Subject: [PATCH] Fix __tostring metamethods sometimes not being respected properly --- .../lune-utils/src/fmt/value/metamethods.rs | 42 +++++++++---------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/crates/lune-utils/src/fmt/value/metamethods.rs b/crates/lune-utils/src/fmt/value/metamethods.rs index d0300ce..dd8b01c 100644 --- a/crates/lune-utils/src/fmt/value/metamethods.rs +++ b/crates/lune-utils/src/fmt/value/metamethods.rs @@ -1,37 +1,35 @@ use mlua::prelude::*; pub fn get_table_type_metavalue(tab: &LuaTable) -> Option { - let s = tab - .metatable()? - .get::(LuaMetaMethod::Type.name()) - .ok()?; + let meta = tab.metatable()?; + let s = meta.get::(LuaMetaMethod::Type.name()).ok()?; let s = s.to_str().ok()?; Some(s.to_string()) } -pub fn get_userdata_type_metavalue(tab: &LuaAnyUserData) -> Option { - let s = tab - .metatable() - .ok()? - .get::(LuaMetaMethod::Type.name()) - .ok()?; +pub fn get_userdata_type_metavalue(usr: &LuaAnyUserData) -> Option { + let meta = usr.metatable().ok()?; + let s = meta.get::(LuaMetaMethod::Type.name()).ok()?; let s = s.to_str().ok()?; Some(s.to_string()) } pub fn call_table_tostring_metamethod(tab: &LuaTable) -> Option { - tab.metatable()? - .get::(LuaMetaMethod::ToString.name()) - .ok()? - .call(tab) - .ok() + let meta = tab.metatable()?; + let value = meta.get(LuaMetaMethod::ToString.name()).ok()?; + match value { + LuaValue::String(s) => Some(s.to_string_lossy().to_string()), + LuaValue::Function(f) => f.call(tab).ok(), + _ => None, + } } -pub fn call_userdata_tostring_metamethod(tab: &LuaAnyUserData) -> Option { - tab.metatable() - .ok()? - .get::(LuaMetaMethod::ToString.name()) - .ok()? - .call(tab) - .ok() +pub fn call_userdata_tostring_metamethod(usr: &LuaAnyUserData) -> Option { + let meta = usr.metatable().ok()?; + let value = meta.get(LuaMetaMethod::ToString.name()).ok()?; + match value { + LuaValue::String(s) => Some(s.to_string_lossy().to_string()), + LuaValue::Function(f) => f.call(usr).ok(), + _ => None, + } }