local _ENV = mkmodule('json')
local internal = require 'json.internal'

encode_defaults = {
    -- For compatibility with jsonxx (C++)
    pretty = true,
    indent = '\t',
}

function encode(data, options, msg)
    local opts = {}
    for k, v in pairs(encode_defaults) do opts[k] = v end
    for k, v in pairs(options or {}) do opts[k] = v end
    return internal:encode(data, msg, opts)
end

function encode_file(data, path, overwrite, ...)
    if dfhack.filesystem.exists(path) and not overwrite then
        error('File exists: ' .. path)
    end
    if dfhack.filesystem.isdir(path) then
        error('Is a directory: ' .. path)
    end
    local contents = encode(data, ...)
    local f = io.open(path, 'w')
    f:write(contents)
    f:close()
end

function decode(data, msg)
    return internal:decode(data, msg)
end

function decode_file(path, ...)
    local f = io.open(path)
    if not f then
        error('Could not open ' .. path)
    end
    local contents = f:read('*all')
    f:close()
    return decode(contents, ...)
end

return _ENV