local export = {} local indent = "" function export.Export(...) localised_print({"", indent, ...}) end function Indent(callback) local old_indent = indent indent = indent .. " " callback() indent = old_indent end --- Read an object property safely. -- There are a few properties where we can't predict safely if they are allowed -- to be read on an object or not, in particular these examples: -- -- https://lua-api.factorio.com/latest/LuaGroup.html#LuaGroup.group -- https://lua-api.factorio.com/latest/LuaGroup.html#LuaGroup.subgroups -- https://lua-api.factorio.com/latest/LuaGroup.html#LuaGroup.order_in_recipe -- -- This function is used to wrap any access to properties with `pcall`. function export.SaveRead(context, attr) local value = nil pcall(function() value = context[attr] end) return value end function export.SetContext(context, callback) callback(context) end function export.ExportStringAttr(name, value) -- Unfortunately we have no control over the string printed by -- `localised_print`. There can be single/double quotes or new lines in -- there. Neither JSON nor YAML can deal with that well. YAML could if we -- had a way to control the indentation, but we don't. So, let's solve it -- the hacky way: post-processing from Rust. if value ~= nil then export.Export(name, ": ", value, "") end end function export.ExportNumberAttr(name, value) -- Number values shouldn't be false, but it happens. -- Let's map them to numbers in a sensible way. if value ~= nil then if value == false then value = 0 end if value == true then value = 1 end export.Export(name, ": ", value) end end function export.ExportBoolAttr(name, value) if value ~= nil then export.Export(name, ": ", value) end end function export.ExportStringValue(value) if value ~= nil then export.Export("", value, "") end end function export.ExportNumberValue(value) if value ~= nil then export.Export(value) end end function export.ExportBoolValue(value) if value ~= nil then export.Export(value) end end function export.ExportObject(name, object, callback) if object ~= nil then export.Export(name, ":") Indent(function() callback(object) end) end end function export.ExportArray(array, callback) if array ~= nil then for _, value in ipairs(array) do export.Export("- ") Indent(function() callback(value) end) end end end function export.ExportMapping(table, callback) if table ~= nil then for key, value in pairs(table) do export.ExportObject(key, table, function() callback(value) end) end end end return export