Software /
code /
prosody
Annotate
util/jsonschema.lua @ 13745:994ea8d54b72 13.0
core.configmanager: Pass name and line number in context
Delays the string interpolation until the warning is logged, which may
slightly lower memory usage.
Allows retrieving the filename and line number easily.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Sat, 22 Feb 2025 00:04:51 +0100 |
parent | 13385:72d7830505f0 |
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 |