Add compat lib

This commit is contained in:
Cooldude2606 committed 2024-11-23 14:25:57 +00:00
1 parent 4c64ef9d15
commit 201a201f05
2 files changed
+149

No files matched your search

@@ -19,6 +19,7 @@
"homepage": "https://github.com/clusterio/clusterio",
"description": "Library for interfacing with Clusterio. Warning: work in progress alpha.",
"additional_files": {
"compat.lua": ["..", "..", "modules", "clusterio", "compat.lua"],
"serialize.lua": ["..", "..", "modules", "clusterio", "serialize.lua"]
}
}
+148
View File
@@ -0,0 +1,148 @@
--[[
Adds various functions used to ensure compatibly between version including some polyfills
]]
--- @class LibCompat
local compat = {}
--- @alias VersionTable { [1]: number, [2]: number, [3]: number }
--- Concert a version string into a version table
--- @param version string
--- @return VersionTable
local function version_to_table(version)
local index = 0
local rtn = { 0, 0, 0 }
for part in version:gmatch("%d+") do
index = index + 1
rtn[index] = tonumber(part)
end
return rtn
end
--- The current version of factorio, the earliest supported is 0.17.69
local current_version_str = "0.17.69"
local current_version = version_to_table(current_version_str)
do
local success, base_version = pcall(function()
return script.active_mods.base
end)
if success then
current_version_str = base_version
current_version = version_to_table(current_version_str)
end
end
--- Raise an error because the current version is unsupported
--- @return any
local function unsupported_version()
error("Unsupported version: " .. current_version_str, 3)
end
--- Returns true if the current version is equal to the provided version
--- @param version string Version to compare against
--- @return boolean # True if versions are equal
function compat.version_eq(version)
local version_tbl = version_to_table(version)
for i = 1, 3 do
if version_tbl[i] ~= current_version[i] then
return false
end
end
return true
end
--- Returns true if the current version is greater than or equal to the the provided version
--- @param version string Version to compare against
--- @return boolean # True if the version is greater or equal to provided
function compat.version_ge(version)
local version_tbl = version_to_table(version)
for i = 1, 3 do
if version_tbl[i] > current_version[i] then
return false
elseif version_tbl[i] < current_version[i] then
return true
end
end
return true
end
--- Returns true if the current version is less than or equal to the the provided version
--- @param version string Version to compare against
--- @return boolean # True if the version is less or equal to provided
function compat.version_le(version)
return not compat.version_ge(version)
end
--- The major versions of factorio we support
local major_v2 = compat.version_ge("2.0.0")
local major_v1_1 = not major_v2 and compat.version_ge("1.1.0")
-- local major_v1 = not major_v1_1 and compat.version_ge("1.0.0")
--- Returns the table reference used to store script data
--- @return table script_data
function compat.script_data()
if major_v1_1 then
return global
elseif major_v2 then
return storage
end
return unsupported_version()
end
--- Returns the table reference used to store prototypes
--- @param category string Category of prototype to access, eg "item", "fluid", "recipe"
--- @return table # Table of prototype data
function compat.prototype_data(category)
if major_v1_1 then
return game[category .. "_prototypes"]
elseif major_v2 then
return prototypes[category]
end
return unsupported_version()
end
--- Returns the table reference used to list active mods
--- @return table # Table of active mods
function compat.active_mods()
if major_v1_1 or major_v2 then
return script.active_mods
end
return unsupported_version()
end
--- Converts a table into a json string
--- @param tbl table Table to convert to json
--- @return string # Json string representing the table
function compat.table_to_json(tbl)
return unsupported_version()
end
--- Converts a json string into a table
--- @param json string Json string representing a table
--- @return table # Table created from the string
function compat.json_to_table(tbl)
return unsupported_version()
end
--- Write a file to script output directory
--- @param filename string The name of the file.
--- @param data LocalisedString The content to write to the file.
--- @param append boolean? True if the data will be appended, false will overwrite existing data
--- @param for_player uint? If given, file is only written for this player index, 0 represents the server
--- @return table # Table created from the string
function compat.write_file(filename, data, append, for_player)
return unsupported_version()
end
if major_v1_1 then
-- Game is not always available so it needs to be called within another function
-- TODO maybe include a version that does not require game?
compat.table_to_json = function(...) return game.table_to_json(...) end
compat.json_to_table = function(...) return game.json_to_table(...) end
compat.write_file = function(...) return game.write_file(...) end
elseif major_v2 then
compat.table_to_json = helpers.table_to_json
compat.json_to_table = helpers.json_to_table
compat.write_file = helpers.write_file
end