modlib/conf.lua
2020-04-05 10:42:44 +02:00

101 lines
4.2 KiB
Lua

minetest.mkdir(minetest.get_worldpath().."/config")
function get_path(confname)
return minetest.get_worldpath().."/config/"..confname
end
function load (filename, constraints)
local config = minetest.parse_json(modlib.file.read(filename))
if constraints then
local error_message = check_constraints(config, constraints)
if error_message then
error("Configuration - "..filename.." doesn't satisfy constraints: "..error_message)
end
end
return config
end
function load_or_create(filename, replacement_file, constraints)
modlib.file.create_if_not_exists_from_file(filename, replacement_file)
return load(filename, constraints)
end
function import(modname, constraints)
return load_or_create(get_path(modname)..".json", modlib.mod.get_resource(modname, "default_config.json"), constraints)
end
function check_constraints(value, constraints)
local t=type(value)
if constraints.func then
local possible_errors=constraints.func(value)
if possible_errors then
return possible_errors
end
end
if constraints.type and constraints.type~=t then
return "Wrong type: Expected "..constraints.type..", found "..t
end
if (t == "number" or t == "string") and constraints.range then
if value < constraints.range[1] or (constraints.range[2] and value > constraints.range[2]) then
return "Not inside range: Expected value >= "..constraints.range[1].." and <= "..constraints.range[1]..", found "..minetest.write_json(value)
end
end
if constraints.possible_values and not constraints.possible_values[value] then
return "None of the possible values: Expected one of "..minetest.write_json(modlib.table.keys(constraints.possible_values))..", found "..minetest.write_json(value)
end
if t == "table" then
if constraints.children then
for k, v in pairs(value) do
local child=constraints.children[k]
if not child then
return "Unexpected table entry: Expected one of "..minetest.write_json(modlib.table.keys(constraints.children))..", found "..minetest.write_json(k)
else
local possible_errors=check_constraints(v, child)
if possible_errors then
return possible_errors
end
end
end
for k, _ in pairs(constraints.children) do
if value[k] == nil then
return "Table entry missing: Expected key "..minetest.write_json(k).." to be present in table "..minetest.write_json(value)
end
end
end
if constraints.required_children then
for k,v_constraints in pairs(constraints.required_children) do
local v=value[k]
if v then
local possible_errors=check_constraints(v, v_constraints)
if possible_errors then
return possible_errors
end
else
return "Table entry missing: Expected key "..minetest.write_json(k).." to be present in table "..minetest.write_json(value)
end
end
end
if constraints.possible_children then
for k,v_constraints in pairs(constraints.possible_children) do
local v=value[k]
if v then
local possible_errors=check_constraints(v, v_constraints)
if possible_errors then
return possible_errors
end
end
end
end
if constraints.keys then
for k,_ in pairs(value) do
local possible_errors=check_constraints(k, constraints.keys)
if possible_errors then
return possible_errors
end
end
end
if constraints.values then
for _,v in pairs(value) do
local possible_errors=check_constraints(v, constraints.values)
if possible_errors then
return possible_errors
end
end
end
end
end