Annotate

util/jsonschema.lua @ 13752:49bbdc22846d 13.0

certmanager: Add more debug logging around cert indexing Currently it's not obvious which directories have been indexed (especially when the resulting index is empty), or why certain files have been skipped.
author Matthew Wild <mwild1@gmail.com>
date Mon, 24 Feb 2025 17:48:58 +0000
parent 13385:72d7830505f0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
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: 12500
diff changeset
2
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
3 if not math.type then
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
4 require("prosody.util.mathcompat")
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
5 end
13088
0fbb2b3fd4c0 util.jsonschema: Fix UTF-8ness of 'minLength' and 'maxLength'
Kim Alvefur <zash@zash.se>
parents: 13087
diff changeset
6
13163
f43d04653bcf util.jsonschema: Silence Teal warnings about utf8 library
Kim Alvefur <zash@zash.se>
parents: 13162
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: 13162
diff changeset
8 local utf8_len = utf8_enc.len or function(s)
13088
0fbb2b3fd4c0 util.jsonschema: Fix UTF-8ness of 'minLength' and 'maxLength'
Kim Alvefur <zash@zash.se>
parents: 13087
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: 13087
diff changeset
10 return count
0fbb2b3fd4c0 util.jsonschema: Fix UTF-8ness of 'minLength' and 'maxLength'
Kim Alvefur <zash@zash.se>
parents: 13087
diff changeset
11 end;
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
12
12975
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12760
diff changeset
13 local json = require("prosody.util.json")
11460
a8b4e04bc044 util.jsonschema: Rename types for improved readability
Kim Alvefur <zash@zash.se>
parents: 11448
diff changeset
14 local null = json.null;
11434
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
15
12975
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12760
diff changeset
16 local pointer = require("prosody.util.jsonpointer")
12132
4ff0d33dfb2b util.jsonschema: Add support for $ref pointers
Kim Alvefur <zash@zash.se>
parents: 11460
diff changeset
17
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
18 local json_schema_object = { xml_t = {} }
11434
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)
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
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: 12500
diff changeset
22 return true
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
23 elseif schema == "object" and type(data) == "table" then
11434
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
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
28 return math.type(data) == schema
11460
a8b4e04bc044 util.jsonschema: Rename types for improved readability
Kim Alvefur <zash@zash.se>
parents: 11448
diff changeset
29 elseif schema == "null" then
a8b4e04bc044 util.jsonschema: Rename types for improved readability
Kim Alvefur <zash@zash.se>
parents: 11448
diff changeset
30 return data == null
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
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: 12500
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: 12500
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: 12500
diff changeset
34 return true
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
35 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
36 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
37 return false
11434
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
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
43 local function mkerr(sloc, iloc, err)
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
44 return { schemaLocation = sloc; instanceLocation = iloc; error = err }
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
45 end
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
46
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
47 local function validate(schema, data, root, sloc, iloc, errs)
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
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: 12500
diff changeset
49 return schema
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
50 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
51
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
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: 12500
diff changeset
53 root = schema
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
54 iloc = ""
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
55 sloc = ""
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
56 errs = {};
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
57 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
58
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
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: 12500
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: 12500
diff changeset
61 if referenced ~= nil and referenced ~= root and referenced ~= schema then
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
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: 13164
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: 13164
diff changeset
64 return false, errs
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
65 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
66 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
67 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
68
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
69 if not simple_validate(schema.type, data) then
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
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: 13164
diff changeset
71 return false, errs
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
72 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
73
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
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: 12500
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: 12500
diff changeset
76
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
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: 12500
diff changeset
78 if not (type(k) == "string") then
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
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: 13164
diff changeset
80 return false, errs
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
81 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
82 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
83 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
84 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
85
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
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: 12500
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: 12500
diff changeset
88
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
89 for i in pairs(data) do
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
90 if not (math.type(i) == "integer") then
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
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: 13164
diff changeset
92 return false, errs
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
93 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
94 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
95 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
96 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
97
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
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: 12500
diff changeset
99 local match = false
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
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: 12500
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: 12500
diff changeset
102
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
103 match = true
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
104 break
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
105 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
106 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
107 if not match then
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
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: 13164
diff changeset
109 return false, errs
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
110 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
111 end
11434
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
13088
0fbb2b3fd4c0 util.jsonschema: Fix UTF-8ness of 'minLength' and 'maxLength'
Kim Alvefur <zash@zash.se>
parents: 13087
diff changeset
114 if schema.maxLength and utf8_len(data) > schema.maxLength then
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
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: 13164
diff changeset
116 return false, errs
11434
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
117 end
13088
0fbb2b3fd4c0 util.jsonschema: Fix UTF-8ness of 'minLength' and 'maxLength'
Kim Alvefur <zash@zash.se>
parents: 13087
diff changeset
118 if schema.minLength and utf8_len(data) < schema.minLength then
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
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: 13164
diff changeset
120 return false, errs
11434
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
121 end
13085
0e17cb78264f util.jsonschema: Implement 'luaPattern' - Lua variant of 'pattern'
Kim Alvefur <zash@zash.se>
parents: 13084
diff changeset
122 if schema.luaPattern and not data:match(schema.luaPattern) then
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
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: 13164
diff changeset
124 return false, errs
13085
0e17cb78264f util.jsonschema: Implement 'luaPattern' - Lua variant of 'pattern'
Kim Alvefur <zash@zash.se>
parents: 13084
diff changeset
125 end
11434
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
126 end
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
127
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
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: 12500
diff changeset
129 if schema.multipleOf and (data == 0 or data % schema.multipleOf ~= 0) then
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
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: 13164
diff changeset
131 return false, errs
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
132 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
133
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
134 if schema.maximum and not (data <= schema.maximum) then
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
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: 13164
diff changeset
136 return false, errs
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
137 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
138
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
139 if schema.exclusiveMaximum and not (data < schema.exclusiveMaximum) then
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
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: 13164
diff changeset
141 return false, errs
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
142 end
11434
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
143
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
144 if schema.minimum and not (data >= schema.minimum) then
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
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: 13164
diff changeset
146 return false, errs
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
147 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
148
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
149 if schema.exclusiveMinimum and not (data > schema.exclusiveMinimum) then
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
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: 13164
diff changeset
151 return false, errs
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
152 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
153 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
154
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
155 if schema.allOf then
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
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: 13164
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: 13164
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: 13164
diff changeset
159 return false, errs
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
160 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
161 end
11434
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
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
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: 12500
diff changeset
165 local valid = 0
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
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: 13164
diff changeset
167 if validate(sub, data, root, sloc .. "/oneOf" .. i, iloc, errs) then
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
168 valid = valid + 1
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
169 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
170 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
171 if valid ~= 1 then
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
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: 13164
diff changeset
173 return false, errs
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
174 end
11434
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
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
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: 12500
diff changeset
178 local match = false
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
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: 13164
diff changeset
180 if validate(sub, data, root, sloc .. "/anyOf/" .. i, iloc, errs) then
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
181 match = true
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
182 break
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
183 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
184 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
185 if not match then
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
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: 13164
diff changeset
187 return false, errs
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
188 end
11434
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
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
191 if schema["not"] then
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
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: 13164
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: 13164
diff changeset
194 return false, errs
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
195 end
11434
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
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
198 if schema["if"] ~= nil then
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
199 if validate(schema["if"], data, root, sloc .. "/if", iloc, errs) then
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
200 if schema["then"] then
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
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: 13164
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: 13164
diff changeset
203 return false, errs
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
204 end
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
205 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
206 else
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
207 if schema["else"] then
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
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: 13164
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: 13164
diff changeset
210 return false, errs
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
211 end
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
212 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
213 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
214 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
215
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
216 if schema.const ~= nil and schema.const ~= data then
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
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: 13164
diff changeset
218 return false, errs
11434
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
13162
6140aa67c618 util.jsonschema: Silence Teal warnings about counting items in tables
Kim Alvefur <zash@zash.se>
parents: 13088
diff changeset
223 if schema.maxItems and #(data) > schema.maxItems then
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
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: 13164
diff changeset
225 return false, errs
11434
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
13162
6140aa67c618 util.jsonschema: Silence Teal warnings about counting items in tables
Kim Alvefur <zash@zash.se>
parents: 13088
diff changeset
228 if schema.minItems and #(data) < schema.minItems then
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
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: 13164
diff changeset
230 return false, errs
11434
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
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
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: 13164
diff changeset
237 return false, errs
11434
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
12988
8592770be63a util.jsonschema: Implement 'dependentRequired'
Kim Alvefur <zash@zash.se>
parents: 12975
diff changeset
242 if schema.dependentRequired then
8592770be63a util.jsonschema: Implement 'dependentRequired'
Kim Alvefur <zash@zash.se>
parents: 12975
diff changeset
243 for k, reqs in pairs(schema.dependentRequired) do
8592770be63a util.jsonschema: Implement 'dependentRequired'
Kim Alvefur <zash@zash.se>
parents: 12975
diff changeset
244 if data[k] ~= nil then
8592770be63a util.jsonschema: Implement 'dependentRequired'
Kim Alvefur <zash@zash.se>
parents: 12975
diff changeset
245 for _, req in ipairs(reqs) do
8592770be63a util.jsonschema: Implement 'dependentRequired'
Kim Alvefur <zash@zash.se>
parents: 12975
diff changeset
246 if data[req] == nil then
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
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: 13164
diff changeset
248 return false, errs
12988
8592770be63a util.jsonschema: Implement 'dependentRequired'
Kim Alvefur <zash@zash.se>
parents: 12975
diff changeset
249 end
8592770be63a util.jsonschema: Implement 'dependentRequired'
Kim Alvefur <zash@zash.se>
parents: 12975
diff changeset
250 end
8592770be63a util.jsonschema: Implement 'dependentRequired'
Kim Alvefur <zash@zash.se>
parents: 12975
diff changeset
251 end
8592770be63a util.jsonschema: Implement 'dependentRequired'
Kim Alvefur <zash@zash.se>
parents: 12975
diff changeset
252 end
8592770be63a util.jsonschema: Implement 'dependentRequired'
Kim Alvefur <zash@zash.se>
parents: 12975
diff changeset
253 end
8592770be63a util.jsonschema: Implement 'dependentRequired'
Kim Alvefur <zash@zash.se>
parents: 12975
diff changeset
254
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
255 if schema.propertyNames ~= nil then
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
256
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
257 for k in pairs(data) do
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
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: 13164
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: 13164
diff changeset
260 return false, errs
11434
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
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
263 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
264
13084
87f646e353cf util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents: 12989
diff changeset
265 local seen_properties = {}
87f646e353cf util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents: 12989
diff changeset
266
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
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: 12500
diff changeset
268 for k, sub in pairs(schema.properties) do
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
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: 13164
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: 13164
diff changeset
271 return false, errs
11446
58c534bac798 util.jsonschema: Implement "propertyNames"
Kim Alvefur <zash@zash.se>
parents: 11445
diff changeset
272 end
13084
87f646e353cf util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents: 12989
diff changeset
273 seen_properties[k] = true
87f646e353cf util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents: 12989
diff changeset
274 end
87f646e353cf util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents: 12989
diff changeset
275 end
87f646e353cf util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents: 12989
diff changeset
276
87f646e353cf util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents: 12989
diff changeset
277 if schema.luaPatternProperties then
87f646e353cf util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents: 12989
diff changeset
278
87f646e353cf util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents: 12989
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: 12989
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: 12989
diff changeset
281 if type(k) == "string" and k:match(pattern) then
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
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: 13164
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: 13164
diff changeset
284 return false, errs
13084
87f646e353cf util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents: 12989
diff changeset
285 end
87f646e353cf util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents: 12989
diff changeset
286 seen_properties[k] = true
87f646e353cf util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents: 12989
diff changeset
287 end
87f646e353cf util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents: 12989
diff changeset
288 end
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
289 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
290 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
291
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
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: 12500
diff changeset
293 for k, v in pairs(data) do
13084
87f646e353cf util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents: 12989
diff changeset
294 if not seen_properties[k] then
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
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: 13164
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: 13164
diff changeset
297 return false, errs
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
298 end
11434
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
12989
dee080c2441e util.jsonschema: Implement 'dependentSchemas'
Kim Alvefur <zash@zash.se>
parents: 12988
diff changeset
303 if schema.dependentSchemas then
dee080c2441e util.jsonschema: Implement 'dependentSchemas'
Kim Alvefur <zash@zash.se>
parents: 12988
diff changeset
304 for k, sub in pairs(schema.dependentSchemas) do
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
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: 13164
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: 13164
diff changeset
307 return false, errs
12989
dee080c2441e util.jsonschema: Implement 'dependentSchemas'
Kim Alvefur <zash@zash.se>
parents: 12988
diff changeset
308 end
dee080c2441e util.jsonschema: Implement 'dependentSchemas'
Kim Alvefur <zash@zash.se>
parents: 12988
diff changeset
309 end
dee080c2441e util.jsonschema: Implement 'dependentSchemas'
Kim Alvefur <zash@zash.se>
parents: 12988
diff changeset
310 end
dee080c2441e util.jsonschema: Implement 'dependentSchemas'
Kim Alvefur <zash@zash.se>
parents: 12988
diff changeset
311
11434
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
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
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: 13164
diff changeset
318 return false, errs
11434
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
11443
a526abef61e6 util.jsonschema: Implement the "prefixItems" keyword
Kim Alvefur <zash@zash.se>
parents: 11442
diff changeset
324 local p = 0
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
325 if schema.prefixItems ~= nil then
11443
a526abef61e6 util.jsonschema: Implement the "prefixItems" keyword
Kim Alvefur <zash@zash.se>
parents: 11442
diff changeset
326 for i, s in ipairs(schema.prefixItems) do
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
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: 12500
diff changeset
328 break
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
329 elseif validate(s, data[i], root, sloc .. "/prefixItems/" .. i, iloc .. "/" .. i, errs) then
11443
a526abef61e6 util.jsonschema: Implement the "prefixItems" keyword
Kim Alvefur <zash@zash.se>
parents: 11442
diff changeset
330 p = i
a526abef61e6 util.jsonschema: Implement the "prefixItems" keyword
Kim Alvefur <zash@zash.se>
parents: 11442
diff changeset
331 else
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
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: 13164
diff changeset
333 return false, errs
11443
a526abef61e6 util.jsonschema: Implement the "prefixItems" keyword
Kim Alvefur <zash@zash.se>
parents: 11442
diff changeset
334 end
a526abef61e6 util.jsonschema: Implement the "prefixItems" keyword
Kim Alvefur <zash@zash.se>
parents: 11442
diff changeset
335 end
a526abef61e6 util.jsonschema: Implement the "prefixItems" keyword
Kim Alvefur <zash@zash.se>
parents: 11442
diff changeset
336 end
a526abef61e6 util.jsonschema: Implement the "prefixItems" keyword
Kim Alvefur <zash@zash.se>
parents: 11442
diff changeset
337
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
338 if schema.items ~= nil then
13162
6140aa67c618 util.jsonschema: Silence Teal warnings about counting items in tables
Kim Alvefur <zash@zash.se>
parents: 13088
diff changeset
339 for i = p + 1, #(data) do
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
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: 13164
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: 13164
diff changeset
342 return false, errs
11434
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
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
347 if schema.contains ~= nil then
13087
5d3e8a226840 util.jsonschema: Implement 'minContains' and 'maxContains'
Kim Alvefur <zash@zash.se>
parents: 13085
diff changeset
348 local found = 0
13162
6140aa67c618 util.jsonschema: Silence Teal warnings about counting items in tables
Kim Alvefur <zash@zash.se>
parents: 13088
diff changeset
349 for i = 1, #(data) do
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
350 if validate(schema.contains, data[i], root, sloc .. "/contains", iloc .. "/" .. i, errs) then
13087
5d3e8a226840 util.jsonschema: Implement 'minContains' and 'maxContains'
Kim Alvefur <zash@zash.se>
parents: 13085
diff changeset
351 found = found + 1
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
352 else
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
353 table.insert(errs, mkerr(sloc .. "/contains", iloc .. "/" .. i, "did not match subschema"))
11442
95f0d77175ca util.jsonschema: Implement the "contains" keyword
Kim Alvefur <zash@zash.se>
parents: 11441
diff changeset
354 end
95f0d77175ca util.jsonschema: Implement the "contains" keyword
Kim Alvefur <zash@zash.se>
parents: 11441
diff changeset
355 end
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
356 if found < (schema.minContains or 1) then
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
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: 13164
diff changeset
358 return false, errs
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
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: 13164
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: 13164
diff changeset
361 return false, errs
11442
95f0d77175ca util.jsonschema: Implement the "contains" keyword
Kim Alvefur <zash@zash.se>
parents: 11441
diff changeset
362 end
95f0d77175ca util.jsonschema: Implement the "contains" keyword
Kim Alvefur <zash@zash.se>
parents: 11441
diff changeset
363 end
11434
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
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
366 return true
11434
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
11460
a8b4e04bc044 util.jsonschema: Rename types for improved readability
Kim Alvefur <zash@zash.se>
parents: 11448
diff changeset
369 json_schema_object.validate = validate;
a8b4e04bc044 util.jsonschema: Rename types for improved readability
Kim Alvefur <zash@zash.se>
parents: 11448
diff changeset
370
a8b4e04bc044 util.jsonschema: Rename types for improved readability
Kim Alvefur <zash@zash.se>
parents: 11448
diff changeset
371 return json_schema_object