wesnoth/data/lua/core/as_text.lua
Celtic Minstrel e1300e29b0
Lua API: Add inline documentation for pretty much everything and convert existing docs (#6483)
The new format is EmmyLua-based and can be used with (at least) Visual Studio Code.
2022-02-17 13:43:31 -05:00

64 lines
1.8 KiB
Lua

-- NOTE: the string output from here is intended solely as an aid in debugging; it should never be taken and used as an input to anything else.
-- escaping takes 3/4 of the time, but we can't avoid it...
local function escape(str)
str = string.gsub(str, "%c", "")
str = string.gsub(str, "[\\\"]", "\\%0")
return str
end
local function add_table_key(obj, buffer)
local _type = type(obj)
if _type == "string" then
buffer[#buffer + 1] = escape(obj)
elseif _type == "number" then
buffer[#buffer + 1] = obj
elseif _type == "boolean" then
buffer[#buffer + 1] = tostring(obj)
else
buffer[#buffer + 1] = '???' .. _type .. '???'
end
end
local function format_any_value(obj, buffer)
local _type = type(obj)
if _type == "table" then
buffer[#buffer + 1] = '{'
buffer[#buffer + 1] = '"' -- needs to be separate for empty tables {}
for key, value in pairs(obj) do
add_table_key(key, buffer)
buffer[#buffer + 1] = '":'
format_any_value(value, buffer)
buffer[#buffer + 1] = ',"'
end
buffer[#buffer] = '}' -- note the overwrite
elseif _type == "string" then
buffer[#buffer + 1] = '"' .. escape(obj) .. '"'
elseif _type == "boolean" or _type == "number" then
buffer[#buffer + 1] = tostring(obj)
elseif _type == "userdata" then
buffer[#buffer + 1] = '"' .. escape(tostring(obj)) .. '"'
else
buffer[#buffer + 1] = '"???' .. _type .. '???"'
end
end
local function value_to_text(obj)
if obj == nil then return "null" else
local buffer = {}
format_any_value(obj, buffer)
return table.concat(buffer)
end
end
---Convert an arbitrary value (especially a table) to a string for debugging
---@return string
function wesnoth.as_text(...)
local result = {}
local n = 1
for _, v in ipairs({ ... }) do
result[n] = value_to_text(v)
n = n + 1
end
return table.concat(result, "\t")
end