util/jsonschema.lua
author Kim Alvefur <zash@zash.se>
Sun, 24 Mar 2024 21:32:00 +0100
changeset 13468 2dbc169aae6a
parent 13389 72d7830505f0
permissions -rw-r--r--
util.startup: Abort before initialization of logging when started as root Prevents creation of log files owned by the root user which could be inaccessible once started correctly.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
12583
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
     1
-- This file is generated from teal-src/util/jsonschema.lua
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
     2
13389
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
     3
if not math.type then
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
     4
	require("prosody.util.mathcompat")
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
     5
end
13092
0fbb2b3fd4c0 util.jsonschema: Fix UTF-8ness of 'minLength' and 'maxLength'
Kim Alvefur <zash@zash.se>
parents: 13091
diff changeset
     6
13167
f43d04653bcf util.jsonschema: Silence Teal warnings about utf8 library
Kim Alvefur <zash@zash.se>
parents: 13166
diff changeset
     7
local utf8_enc = rawget(_G, "utf8") or require("prosody.util.encodings").utf8;
f43d04653bcf util.jsonschema: Silence Teal warnings about utf8 library
Kim Alvefur <zash@zash.se>
parents: 13166
diff changeset
     8
local utf8_len = utf8_enc.len or function(s)
13092
0fbb2b3fd4c0 util.jsonschema: Fix UTF-8ness of 'minLength' and 'maxLength'
Kim Alvefur <zash@zash.se>
parents: 13091
diff changeset
     9
	local _, count = s:gsub("[%z\001-\127\194-\253][\128-\191]*", "");
0fbb2b3fd4c0 util.jsonschema: Fix UTF-8ness of 'minLength' and 'maxLength'
Kim Alvefur <zash@zash.se>
parents: 13091
diff changeset
    10
	return count
0fbb2b3fd4c0 util.jsonschema: Fix UTF-8ness of 'minLength' and 'maxLength'
Kim Alvefur <zash@zash.se>
parents: 13091
diff changeset
    11
end;
13389
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
    12
12979
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12764
diff changeset
    13
local json = require("prosody.util.json")
11464
a8b4e04bc044 util.jsonschema: Rename types for improved readability
Kim Alvefur <zash@zash.se>
parents: 11452
diff changeset
    14
local null = json.null;
11438
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    15
12979
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12764
diff changeset
    16
local pointer = require("prosody.util.jsonpointer")
12136
4ff0d33dfb2b util.jsonschema: Add support for $ref pointers
Kim Alvefur <zash@zash.se>
parents: 11464
diff changeset
    17
12583
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    18
local json_schema_object = { xml_t = {} }
11438
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    19
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    20
local function simple_validate(schema, data)
12583
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    21
	if schema == nil then
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    22
		return true
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    23
	elseif schema == "object" and type(data) == "table" then
11438
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    24
		return type(data) == "table" and (next(data) == nil or type((next(data, nil))) == "string")
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    25
	elseif schema == "array" and type(data) == "table" then
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    26
		return type(data) == "table" and (next(data) == nil or type((next(data, nil))) == "number")
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    27
	elseif schema == "integer" then
13389
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
    28
		return math.type(data) == schema
11464
a8b4e04bc044 util.jsonschema: Rename types for improved readability
Kim Alvefur <zash@zash.se>
parents: 11452
diff changeset
    29
	elseif schema == "null" then
a8b4e04bc044 util.jsonschema: Rename types for improved readability
Kim Alvefur <zash@zash.se>
parents: 11452
diff changeset
    30
		return data == null
12583
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    31
	elseif type(schema) == "table" then
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    32
		for _, one in ipairs(schema) do
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    33
			if simple_validate(one, data) then
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    34
				return true
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    35
			end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    36
		end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    37
		return false
11438
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    38
	else
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    39
		return type(data) == schema
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    40
	end
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    41
end
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    42
13389
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
    43
local function mkerr(sloc, iloc, err)
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
    44
	return { schemaLocation = sloc; instanceLocation = iloc; error = err }
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
    45
end
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
    46
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
    47
local function validate(schema, data, root, sloc, iloc, errs)
12583
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    48
	if type(schema) == "boolean" then
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    49
		return schema
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    50
	end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    51
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    52
	if root == nil then
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    53
		root = schema
13389
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
    54
		iloc = ""
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
    55
		sloc = ""
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
    56
		errs = {};
12583
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    57
	end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    58
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    59
	if schema["$ref"] and schema["$ref"]:sub(1, 1) == "#" then
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    60
		local referenced = pointer.resolve(root, schema["$ref"]:sub(2))
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    61
		if referenced ~= nil and referenced ~= root and referenced ~= schema then
13389
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
    62
			if not validate(referenced, data, root, schema["$ref"], iloc, errs) then
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
    63
				table.insert(errs, mkerr(sloc .. "/$ref", iloc, "Subschema failed validation"))
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
    64
				return false, errs
12583
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    65
			end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    66
		end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    67
	end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    68
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    69
	if not simple_validate(schema.type, data) then
13389
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
    70
		table.insert(errs, mkerr(sloc .. "/type", iloc, "unexpected type"));
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
    71
		return false, errs
12583
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    72
	end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    73
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    74
	if schema.type == "object" then
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    75
		if type(data) == "table" then
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    76
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    77
			for k in pairs(data) do
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    78
				if not (type(k) == "string") then
13389
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
    79
					table.insert(errs, mkerr(sloc .. "/type", iloc, "'object' had non-string keys"));
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
    80
					return false, errs
12583
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    81
				end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    82
			end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    83
		end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    84
	end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    85
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    86
	if schema.type == "array" then
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    87
		if type(data) == "table" then
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    88
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    89
			for i in pairs(data) do
13389
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
    90
				if not (math.type(i) == "integer") then
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
    91
					table.insert(errs, mkerr(sloc .. "/type", iloc, "'array' had non-integer keys"));
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
    92
					return false, errs
12583
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    93
				end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    94
			end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    95
		end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    96
	end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    97
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    98
	if schema["enum"] ~= nil then
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
    99
		local match = false
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   100
		for _, v in ipairs(schema["enum"]) do
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   101
			if v == data then
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   102
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   103
				match = true
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   104
				break
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   105
			end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   106
		end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   107
		if not match then
13389
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   108
			table.insert(errs, mkerr(sloc .. "/enum", iloc, "not one of the enumerated values"));
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   109
			return false, errs
12583
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   110
		end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   111
	end
11438
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   112
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   113
	if type(data) == "string" then
13092
0fbb2b3fd4c0 util.jsonschema: Fix UTF-8ness of 'minLength' and 'maxLength'
Kim Alvefur <zash@zash.se>
parents: 13091
diff changeset
   114
		if schema.maxLength and utf8_len(data) > schema.maxLength then
13389
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   115
			table.insert(errs, mkerr(sloc .. "/maxLength", iloc, "string too long"))
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   116
			return false, errs
11438
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   117
		end
13092
0fbb2b3fd4c0 util.jsonschema: Fix UTF-8ness of 'minLength' and 'maxLength'
Kim Alvefur <zash@zash.se>
parents: 13091
diff changeset
   118
		if schema.minLength and utf8_len(data) < schema.minLength then
13389
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   119
			table.insert(errs, mkerr(sloc .. "/maxLength", iloc, "string too short"))
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   120
			return false, errs
11438
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   121
		end
13089
0e17cb78264f util.jsonschema: Implement 'luaPattern' - Lua variant of 'pattern'
Kim Alvefur <zash@zash.se>
parents: 13088
diff changeset
   122
		if schema.luaPattern and not data:match(schema.luaPattern) then
13389
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   123
			table.insert(errs, mkerr(sloc .. "/luaPattern", iloc, "string does not match pattern"))
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   124
			return false, errs
13089
0e17cb78264f util.jsonschema: Implement 'luaPattern' - Lua variant of 'pattern'
Kim Alvefur <zash@zash.se>
parents: 13088
diff changeset
   125
		end
11438
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   126
	end
12583
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   127
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   128
	if type(data) == "number" then
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   129
		if schema.multipleOf and (data == 0 or data % schema.multipleOf ~= 0) then
13389
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   130
			table.insert(errs, mkerr(sloc .. "/luaPattern", iloc, "not a multiple"))
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   131
			return false, errs
12583
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   132
		end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   133
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   134
		if schema.maximum and not (data <= schema.maximum) then
13389
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   135
			table.insert(errs, mkerr(sloc .. "/maximum", iloc, "number exceeds maximum"))
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   136
			return false, errs
12583
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   137
		end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   138
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   139
		if schema.exclusiveMaximum and not (data < schema.exclusiveMaximum) then
13389
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   140
			table.insert(errs, mkerr(sloc .. "/exclusiveMaximum", iloc, "number exceeds exclusive maximum"))
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   141
			return false, errs
12583
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   142
		end
11438
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   143
12583
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   144
		if schema.minimum and not (data >= schema.minimum) then
13389
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   145
			table.insert(errs, mkerr(sloc .. "/minimum", iloc, "number below minimum"))
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   146
			return false, errs
12583
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   147
		end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   148
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   149
		if schema.exclusiveMinimum and not (data > schema.exclusiveMinimum) then
13389
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   150
			table.insert(errs, mkerr(sloc .. "/exclusiveMinimum", iloc, "number below exclusive minimum"))
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   151
			return false, errs
12583
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   152
		end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   153
	end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   154
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   155
	if schema.allOf then
13389
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   156
		for i, sub in ipairs(schema.allOf) do
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   157
			if not validate(sub, data, root, sloc .. "/allOf/" .. i, iloc, errs) then
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   158
				table.insert(errs, mkerr(sloc .. "/allOf", iloc, "did not match all subschemas"))
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   159
				return false, errs
12583
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   160
			end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   161
		end
11438
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   162
	end
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   163
12583
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   164
	if schema.oneOf then
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   165
		local valid = 0
13389
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   166
		for i, sub in ipairs(schema.oneOf) do
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   167
			if validate(sub, data, root, sloc .. "/oneOf" .. i, iloc, errs) then
12583
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   168
				valid = valid + 1
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   169
			end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   170
		end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   171
		if valid ~= 1 then
13389
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   172
			table.insert(errs, mkerr(sloc .. "/oneOf", iloc, "did not match exactly one subschema"))
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   173
			return false, errs
12583
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   174
		end
11438
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   175
	end
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   176
12583
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   177
	if schema.anyOf then
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   178
		local match = false
13389
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   179
		for i, sub in ipairs(schema.anyOf) do
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   180
			if validate(sub, data, root, sloc .. "/anyOf/" .. i, iloc, errs) then
12583
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   181
				match = true
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   182
				break
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   183
			end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   184
		end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   185
		if not match then
13389
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   186
			table.insert(errs, mkerr(sloc .. "/anyOf", iloc, "did not match any subschema"))
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   187
			return false, errs
12583
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   188
		end
11438
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   189
	end
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   190
12583
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   191
	if schema["not"] then
13389
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   192
		if validate(schema["not"], data, root, sloc .. "/not", iloc, errs) then
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   193
			table.insert(errs, mkerr(sloc .. "/not", iloc, "did match subschema"))
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   194
			return false, errs
12583
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   195
		end
11438
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   196
	end
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   197
12583
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   198
	if schema["if"] ~= nil then
13389
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   199
		if validate(schema["if"], data, root, sloc .. "/if", iloc, errs) then
12583
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   200
			if schema["then"] then
13389
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   201
				if not validate(schema["then"], data, root, sloc .. "/then", iloc, errs) then
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   202
					table.insert(errs, mkerr(sloc .. "/then", iloc, "did not match subschema"))
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   203
					return false, errs
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   204
				end
12583
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   205
			end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   206
		else
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   207
			if schema["else"] then
13389
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   208
				if not validate(schema["else"], data, root, sloc .. "/else", iloc, errs) then
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   209
					table.insert(errs, mkerr(sloc .. "/else", iloc, "did not match subschema"))
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   210
					return false, errs
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   211
				end
12583
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   212
			end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   213
		end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   214
	end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   215
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   216
	if schema.const ~= nil and schema.const ~= data then
13389
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   217
		table.insert(errs, mkerr(sloc .. "/const", iloc, "did not match constant value"))
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   218
		return false, errs
11438
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   219
	end
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   220
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   221
	if type(data) == "table" then
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   222
13166
6140aa67c618 util.jsonschema: Silence Teal warnings about counting items in tables
Kim Alvefur <zash@zash.se>
parents: 13092
diff changeset
   223
		if schema.maxItems and #(data) > schema.maxItems then
13389
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   224
			table.insert(errs, mkerr(sloc .. "/maxItems", iloc, "too many items"))
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   225
			return false, errs
11438
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   226
		end
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   227
13166
6140aa67c618 util.jsonschema: Silence Teal warnings about counting items in tables
Kim Alvefur <zash@zash.se>
parents: 13092
diff changeset
   228
		if schema.minItems and #(data) < schema.minItems then
13389
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   229
			table.insert(errs, mkerr(sloc .. "/minItems", iloc, "too few items"))
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   230
			return false, errs
11438
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   231
		end
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   232
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   233
		if schema.required then
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   234
			for _, k in ipairs(schema.required) do
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   235
				if data[k] == nil then
13389
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   236
					table.insert(errs, mkerr(sloc .. "/required", iloc .. "/" .. tostring(k), "missing required property"))
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   237
					return false, errs
11438
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   238
				end
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   239
			end
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   240
		end
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   241
12992
8592770be63a util.jsonschema: Implement 'dependentRequired'
Kim Alvefur <zash@zash.se>
parents: 12979
diff changeset
   242
		if schema.dependentRequired then
8592770be63a util.jsonschema: Implement 'dependentRequired'
Kim Alvefur <zash@zash.se>
parents: 12979
diff changeset
   243
			for k, reqs in pairs(schema.dependentRequired) do
8592770be63a util.jsonschema: Implement 'dependentRequired'
Kim Alvefur <zash@zash.se>
parents: 12979
diff changeset
   244
				if data[k] ~= nil then
8592770be63a util.jsonschema: Implement 'dependentRequired'
Kim Alvefur <zash@zash.se>
parents: 12979
diff changeset
   245
					for _, req in ipairs(reqs) do
8592770be63a util.jsonschema: Implement 'dependentRequired'
Kim Alvefur <zash@zash.se>
parents: 12979
diff changeset
   246
						if data[req] == nil then
13389
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   247
							table.insert(errs, mkerr(sloc .. "/dependentRequired", iloc, "missing dependent required property"))
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   248
							return false, errs
12992
8592770be63a util.jsonschema: Implement 'dependentRequired'
Kim Alvefur <zash@zash.se>
parents: 12979
diff changeset
   249
						end
8592770be63a util.jsonschema: Implement 'dependentRequired'
Kim Alvefur <zash@zash.se>
parents: 12979
diff changeset
   250
					end
8592770be63a util.jsonschema: Implement 'dependentRequired'
Kim Alvefur <zash@zash.se>
parents: 12979
diff changeset
   251
				end
8592770be63a util.jsonschema: Implement 'dependentRequired'
Kim Alvefur <zash@zash.se>
parents: 12979
diff changeset
   252
			end
8592770be63a util.jsonschema: Implement 'dependentRequired'
Kim Alvefur <zash@zash.se>
parents: 12979
diff changeset
   253
		end
8592770be63a util.jsonschema: Implement 'dependentRequired'
Kim Alvefur <zash@zash.se>
parents: 12979
diff changeset
   254
12583
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   255
		if schema.propertyNames ~= nil then
13389
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   256
12583
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   257
			for k in pairs(data) do
13389
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   258
				if not validate(schema.propertyNames, k, root, sloc .. "/propertyNames", iloc .. "/" .. tostring(k), errs) then
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   259
					table.insert(errs, mkerr(sloc .. "/propertyNames", iloc .. "/" .. tostring(k), "a property name did not match subschema"))
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   260
					return false, errs
11438
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   261
				end
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   262
			end
12583
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   263
		end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   264
13088
87f646e353cf util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents: 12993
diff changeset
   265
		local seen_properties = {}
87f646e353cf util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents: 12993
diff changeset
   266
12583
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   267
		if schema.properties then
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   268
			for k, sub in pairs(schema.properties) do
13389
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   269
				if data[k] ~= nil and not validate(sub, data[k], root, sloc .. "/" .. tostring(k), iloc .. "/" .. tostring(k), errs) then
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   270
					table.insert(errs, mkerr(sloc .. "/" .. tostring(k), iloc .. "/" .. tostring(k), "a property did not match subschema"))
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   271
					return false, errs
11450
58c534bac798 util.jsonschema: Implement "propertyNames"
Kim Alvefur <zash@zash.se>
parents: 11449
diff changeset
   272
				end
13088
87f646e353cf util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents: 12993
diff changeset
   273
				seen_properties[k] = true
87f646e353cf util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents: 12993
diff changeset
   274
			end
87f646e353cf util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents: 12993
diff changeset
   275
		end
87f646e353cf util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents: 12993
diff changeset
   276
87f646e353cf util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents: 12993
diff changeset
   277
		if schema.luaPatternProperties then
87f646e353cf util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents: 12993
diff changeset
   278
87f646e353cf util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents: 12993
diff changeset
   279
			for pattern, sub in pairs(schema.luaPatternProperties) do
87f646e353cf util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents: 12993
diff changeset
   280
				for k in pairs(data) do
87f646e353cf util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents: 12993
diff changeset
   281
					if type(k) == "string" and k:match(pattern) then
13389
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   282
						if not validate(sub, data[k], root, sloc .. "/luaPatternProperties", iloc, errs) then
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   283
							table.insert(errs, mkerr(sloc .. "/luaPatternProperties/" .. pattern, iloc .. "/" .. tostring(k), "a property did not match subschema"))
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   284
							return false, errs
13088
87f646e353cf util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents: 12993
diff changeset
   285
						end
87f646e353cf util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents: 12993
diff changeset
   286
						seen_properties[k] = true
87f646e353cf util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents: 12993
diff changeset
   287
					end
87f646e353cf util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents: 12993
diff changeset
   288
				end
12583
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   289
			end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   290
		end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   291
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   292
		if schema.additionalProperties ~= nil then
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   293
			for k, v in pairs(data) do
13088
87f646e353cf util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents: 12993
diff changeset
   294
				if not seen_properties[k] then
13389
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   295
					if not validate(schema.additionalProperties, v, root, sloc .. "/additionalProperties", iloc .. "/" .. tostring(k), errs) then
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   296
						table.insert(errs, mkerr(sloc .. "/additionalProperties", iloc .. "/" .. tostring(k), "additional property did not match subschema"))
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   297
						return false, errs
12583
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   298
					end
11438
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   299
				end
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   300
			end
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   301
		end
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   302
12993
dee080c2441e util.jsonschema: Implement 'dependentSchemas'
Kim Alvefur <zash@zash.se>
parents: 12992
diff changeset
   303
		if schema.dependentSchemas then
dee080c2441e util.jsonschema: Implement 'dependentSchemas'
Kim Alvefur <zash@zash.se>
parents: 12992
diff changeset
   304
			for k, sub in pairs(schema.dependentSchemas) do
13389
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   305
				if data[k] ~= nil and not validate(sub, data, root, sloc .. "/dependentSchemas/" .. k, iloc, errs) then
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   306
					table.insert(errs, mkerr(sloc .. "/dependentSchemas", iloc .. "/" .. tostring(k), "did not match dependent subschema"))
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   307
					return false, errs
12993
dee080c2441e util.jsonschema: Implement 'dependentSchemas'
Kim Alvefur <zash@zash.se>
parents: 12992
diff changeset
   308
				end
dee080c2441e util.jsonschema: Implement 'dependentSchemas'
Kim Alvefur <zash@zash.se>
parents: 12992
diff changeset
   309
			end
dee080c2441e util.jsonschema: Implement 'dependentSchemas'
Kim Alvefur <zash@zash.se>
parents: 12992
diff changeset
   310
		end
dee080c2441e util.jsonschema: Implement 'dependentSchemas'
Kim Alvefur <zash@zash.se>
parents: 12992
diff changeset
   311
11438
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   312
		if schema.uniqueItems then
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   313
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   314
			local values = {}
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   315
			for _, v in pairs(data) do
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   316
				if values[v] then
13389
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   317
					table.insert(errs, mkerr(sloc .. "/uniqueItems", iloc, "had duplicate items"))
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   318
					return false, errs
11438
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   319
				end
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   320
				values[v] = true
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   321
			end
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   322
		end
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   323
11447
a526abef61e6 util.jsonschema: Implement the "prefixItems" keyword
Kim Alvefur <zash@zash.se>
parents: 11446
diff changeset
   324
		local p = 0
12583
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   325
		if schema.prefixItems ~= nil then
11447
a526abef61e6 util.jsonschema: Implement the "prefixItems" keyword
Kim Alvefur <zash@zash.se>
parents: 11446
diff changeset
   326
			for i, s in ipairs(schema.prefixItems) do
12583
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   327
				if data[i] == nil then
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   328
					break
13389
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   329
				elseif validate(s, data[i], root, sloc .. "/prefixItems/" .. i, iloc .. "/" .. i, errs) then
11447
a526abef61e6 util.jsonschema: Implement the "prefixItems" keyword
Kim Alvefur <zash@zash.se>
parents: 11446
diff changeset
   330
					p = i
a526abef61e6 util.jsonschema: Implement the "prefixItems" keyword
Kim Alvefur <zash@zash.se>
parents: 11446
diff changeset
   331
				else
13389
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   332
					table.insert(errs, mkerr(sloc .. "/prefixItems/" .. i, iloc .. "/" .. tostring(i), "did not match subschema"))
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   333
					return false, errs
11447
a526abef61e6 util.jsonschema: Implement the "prefixItems" keyword
Kim Alvefur <zash@zash.se>
parents: 11446
diff changeset
   334
				end
a526abef61e6 util.jsonschema: Implement the "prefixItems" keyword
Kim Alvefur <zash@zash.se>
parents: 11446
diff changeset
   335
			end
a526abef61e6 util.jsonschema: Implement the "prefixItems" keyword
Kim Alvefur <zash@zash.se>
parents: 11446
diff changeset
   336
		end
a526abef61e6 util.jsonschema: Implement the "prefixItems" keyword
Kim Alvefur <zash@zash.se>
parents: 11446
diff changeset
   337
12583
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   338
		if schema.items ~= nil then
13166
6140aa67c618 util.jsonschema: Silence Teal warnings about counting items in tables
Kim Alvefur <zash@zash.se>
parents: 13092
diff changeset
   339
			for i = p + 1, #(data) do
13389
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   340
				if not validate(schema.items, data[i], root, sloc, iloc .. "/" .. i, errs) then
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   341
					table.insert(errs, mkerr(sloc .. "/prefixItems/" .. i, iloc .. "/" .. i, "did not match subschema"))
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   342
					return false, errs
11438
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   343
				end
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   344
			end
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   345
		end
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   346
12583
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   347
		if schema.contains ~= nil then
13091
5d3e8a226840 util.jsonschema: Implement 'minContains' and 'maxContains'
Kim Alvefur <zash@zash.se>
parents: 13089
diff changeset
   348
			local found = 0
13166
6140aa67c618 util.jsonschema: Silence Teal warnings about counting items in tables
Kim Alvefur <zash@zash.se>
parents: 13092
diff changeset
   349
			for i = 1, #(data) do
13389
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   350
				if validate(schema.contains, data[i], root, sloc .. "/contains", iloc .. "/" .. i, errs) then
13091
5d3e8a226840 util.jsonschema: Implement 'minContains' and 'maxContains'
Kim Alvefur <zash@zash.se>
parents: 13089
diff changeset
   351
					found = found + 1
13389
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   352
				else
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   353
					table.insert(errs, mkerr(sloc .. "/contains", iloc .. "/" .. i, "did not match subschema"))
11446
95f0d77175ca util.jsonschema: Implement the "contains" keyword
Kim Alvefur <zash@zash.se>
parents: 11445
diff changeset
   354
				end
95f0d77175ca util.jsonschema: Implement the "contains" keyword
Kim Alvefur <zash@zash.se>
parents: 11445
diff changeset
   355
			end
13389
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   356
			if found < (schema.minContains or 1) then
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   357
				table.insert(errs, mkerr(sloc .. "/minContains", iloc, "too few matches"))
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   358
				return false, errs
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   359
			elseif found > (schema.maxContains or math.huge) then
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   360
				table.insert(errs, mkerr(sloc .. "/maxContains", iloc, "too many matches"))
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13168
diff changeset
   361
				return false, errs
11446
95f0d77175ca util.jsonschema: Implement the "contains" keyword
Kim Alvefur <zash@zash.se>
parents: 11445
diff changeset
   362
			end
95f0d77175ca util.jsonschema: Implement the "contains" keyword
Kim Alvefur <zash@zash.se>
parents: 11445
diff changeset
   363
		end
11438
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   364
	end
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   365
12583
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12504
diff changeset
   366
	return true
11438
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   367
end
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   368
11464
a8b4e04bc044 util.jsonschema: Rename types for improved readability
Kim Alvefur <zash@zash.se>
parents: 11452
diff changeset
   369
json_schema_object.validate = validate;
a8b4e04bc044 util.jsonschema: Rename types for improved readability
Kim Alvefur <zash@zash.se>
parents: 11452
diff changeset
   370
a8b4e04bc044 util.jsonschema: Rename types for improved readability
Kim Alvefur <zash@zash.se>
parents: 11452
diff changeset
   371
return json_schema_object