2020-02-09 01:39:54 +01:00
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 )
2020-02-29 12:55:02 +01:00
return load_or_create ( get_path ( modname ) .. " .json " , modlib.mod . get_resource ( modname , " default_config.json " ) , constraints )
2020-02-09 01:39:54 +01:00
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