Mercurial > prosody-hg
annotate util/jsonschema.lua @ 13946:f5e8ab42c708
mod_http_file_share: Check that files are still there with correct size
Failed uploads can leave behind unused slots. Files shouldn't change
size after they have been successfully uploaded, but might as well
double check it.
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Sat, 04 Dec 2021 18:56:51 +0100 |
| parents | b713da7527d2 |
| children | d975d280baec |
| rev | line source |
|---|---|
| 13883 | 1 -- This file is generated from teal-src/prosody/util/jsonschema.tl |
|
13385
72d7830505f0
util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents:
13164
diff
changeset
|
2 if not math.type then |
|
72d7830505f0
util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents:
13164
diff
changeset
|
3 require("prosody.util.mathcompat") |
|
72d7830505f0
util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents:
13164
diff
changeset
|
4 end |
|
13088
0fbb2b3fd4c0
util.jsonschema: Fix UTF-8ness of 'minLength' and 'maxLength'
Kim Alvefur <zash@zash.se>
parents:
13087
diff
changeset
|
5 |
|
13866
7f6916088278
util.jsonschema: Simplify retrieval of UTF-8 length function
Kim Alvefur <zash@zash.se>
parents:
13385
diff
changeset
|
6 local utf8_len = rawget(_G, "utf8") and utf8.len or require("prosody.util.encodings").utf8.length; |
|
13385
72d7830505f0
util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents:
13164
diff
changeset
|
7 |
|
12975
d10957394a3c
util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12760
diff
changeset
|
8 local json = require("prosody.util.json") |
|
11460
a8b4e04bc044
util.jsonschema: Rename types for improved readability
Kim Alvefur <zash@zash.se>
parents:
11448
diff
changeset
|
9 local null = json.null; |
|
11434
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
10 |
|
12975
d10957394a3c
util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12760
diff
changeset
|
11 local pointer = require("prosody.util.jsonpointer") |
|
12132
4ff0d33dfb2b
util.jsonschema: Add support for $ref pointers
Kim Alvefur <zash@zash.se>
parents:
11460
diff
changeset
|
12 |
|
12579
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
13 local json_schema_object = { xml_t = {} } |
|
11434
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
14 |
|
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
15 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
|
16 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
|
17 return true |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
18 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
|
19 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
|
20 elseif schema == "array" and type(data) == "table" then |
|
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
21 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
|
22 elseif schema == "integer" then |
|
13385
72d7830505f0
util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents:
13164
diff
changeset
|
23 return math.type(data) == schema |
|
11460
a8b4e04bc044
util.jsonschema: Rename types for improved readability
Kim Alvefur <zash@zash.se>
parents:
11448
diff
changeset
|
24 elseif schema == "null" then |
|
a8b4e04bc044
util.jsonschema: Rename types for improved readability
Kim Alvefur <zash@zash.se>
parents:
11448
diff
changeset
|
25 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
|
26 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
|
27 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
|
28 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
|
29 return true |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
30 end |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
31 end |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
32 return false |
|
11434
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
33 else |
|
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
34 return type(data) == schema |
|
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
35 end |
|
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
36 end |
|
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
37 |
|
13385
72d7830505f0
util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents:
13164
diff
changeset
|
38 local function mkerr(sloc, iloc, err) |
|
72d7830505f0
util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents:
13164
diff
changeset
|
39 return { schemaLocation = sloc; instanceLocation = iloc; error = err } |
|
72d7830505f0
util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents:
13164
diff
changeset
|
40 end |
|
72d7830505f0
util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents:
13164
diff
changeset
|
41 |
|
72d7830505f0
util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents:
13164
diff
changeset
|
42 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
|
43 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
|
44 return schema |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
45 end |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
46 |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
47 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
|
48 root = schema |
|
13385
72d7830505f0
util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents:
13164
diff
changeset
|
49 iloc = "" |
|
72d7830505f0
util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents:
13164
diff
changeset
|
50 sloc = "" |
|
72d7830505f0
util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents:
13164
diff
changeset
|
51 errs = {}; |
|
12579
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
52 end |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
53 |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
54 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
|
55 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
|
56 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
|
57 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
|
58 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
|
59 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
|
60 end |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
61 end |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
62 end |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
63 |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
64 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
|
65 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
|
66 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
|
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 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
|
70 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
|
71 |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
72 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
|
73 if not (type(k) == "string") then |
|
13385
72d7830505f0
util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents:
13164
diff
changeset
|
74 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
|
75 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
|
76 end |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
77 end |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
78 end |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
79 end |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
80 |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
81 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
|
82 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
|
83 |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
84 for i in pairs(data) do |
|
13385
72d7830505f0
util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents:
13164
diff
changeset
|
85 if not (math.type(i) == "integer") then |
|
72d7830505f0
util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents:
13164
diff
changeset
|
86 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
|
87 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
|
88 end |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
89 end |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
90 end |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
91 end |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
92 |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
93 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
|
94 local match = false |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
95 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
|
96 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
|
97 |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
98 match = true |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
99 break |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
100 end |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
101 end |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
102 if not match then |
|
13385
72d7830505f0
util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents:
13164
diff
changeset
|
103 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
|
104 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
|
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 |
|
11434
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
107 |
|
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
108 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
|
109 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
|
110 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
|
111 return false, errs |
|
11434
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
112 end |
|
13088
0fbb2b3fd4c0
util.jsonschema: Fix UTF-8ness of 'minLength' and 'maxLength'
Kim Alvefur <zash@zash.se>
parents:
13087
diff
changeset
|
113 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
|
114 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
|
115 return false, errs |
|
11434
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
116 end |
|
13085
0e17cb78264f
util.jsonschema: Implement 'luaPattern' - Lua variant of 'pattern'
Kim Alvefur <zash@zash.se>
parents:
13084
diff
changeset
|
117 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
|
118 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
|
119 return false, errs |
|
13085
0e17cb78264f
util.jsonschema: Implement 'luaPattern' - Lua variant of 'pattern'
Kim Alvefur <zash@zash.se>
parents:
13084
diff
changeset
|
120 end |
|
11434
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
121 end |
|
12579
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
122 |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
123 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
|
124 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
|
125 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
|
126 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
|
127 end |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
128 |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
129 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
|
130 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
|
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.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
|
135 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
|
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 |
|
11434
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
138 |
|
12579
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
139 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
|
140 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
|
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 |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
143 |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
144 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
|
145 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
|
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 end |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
149 |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
150 if schema.allOf then |
|
13385
72d7830505f0
util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents:
13164
diff
changeset
|
151 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
|
152 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
|
153 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
|
154 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
|
155 end |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
156 end |
|
11434
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
157 end |
|
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
158 |
|
12579
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
159 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
|
160 local valid = 0 |
|
13385
72d7830505f0
util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents:
13164
diff
changeset
|
161 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
|
162 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
|
163 valid = valid + 1 |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
164 end |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
165 end |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
166 if valid ~= 1 then |
|
13385
72d7830505f0
util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents:
13164
diff
changeset
|
167 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
|
168 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
|
169 end |
|
11434
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
170 end |
|
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
171 |
|
12579
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
172 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
|
173 local match = false |
|
13385
72d7830505f0
util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents:
13164
diff
changeset
|
174 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
|
175 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
|
176 match = true |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
177 break |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
178 end |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
179 end |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
180 if not match then |
|
13385
72d7830505f0
util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents:
13164
diff
changeset
|
181 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
|
182 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
|
183 end |
|
11434
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
184 end |
|
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
185 |
|
13867
eabd38507c1d
util.jsonschema: Fix handling of `false` as schema
Kim Alvefur <zash@zash.se>
parents:
13385
diff
changeset
|
186 if schema["not"] ~= nil then |
|
13385
72d7830505f0
util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents:
13164
diff
changeset
|
187 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
|
188 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
|
189 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
|
190 end |
|
11434
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
191 end |
|
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
192 |
|
12579
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
193 if schema["if"] ~= nil then |
|
13385
72d7830505f0
util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents:
13164
diff
changeset
|
194 if validate(schema["if"], data, root, sloc .. "/if", iloc, errs) then |
|
13867
eabd38507c1d
util.jsonschema: Fix handling of `false` as schema
Kim Alvefur <zash@zash.se>
parents:
13385
diff
changeset
|
195 if schema["then"] ~= nil then |
|
13385
72d7830505f0
util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents:
13164
diff
changeset
|
196 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
|
197 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
|
198 return false, errs |
|
72d7830505f0
util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents:
13164
diff
changeset
|
199 end |
|
12579
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
200 end |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
201 else |
|
13867
eabd38507c1d
util.jsonschema: Fix handling of `false` as schema
Kim Alvefur <zash@zash.se>
parents:
13385
diff
changeset
|
202 if schema["else"] ~= nil then |
|
13385
72d7830505f0
util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents:
13164
diff
changeset
|
203 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
|
204 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
|
205 return false, errs |
|
72d7830505f0
util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents:
13164
diff
changeset
|
206 end |
|
12579
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
207 end |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
208 end |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
209 end |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
210 |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
211 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
|
212 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
|
213 return false, errs |
|
11434
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
214 end |
|
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
215 |
|
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
216 if type(data) == "table" then |
|
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
217 |
|
13162
6140aa67c618
util.jsonschema: Silence Teal warnings about counting items in tables
Kim Alvefur <zash@zash.se>
parents:
13088
diff
changeset
|
218 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
|
219 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
|
220 return false, errs |
|
11434
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
221 end |
|
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.minItems and #(data) < schema.minItems 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 .. "/minItems", iloc, "too few 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 |
|
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
228 if schema.required then |
|
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
229 for _, k in ipairs(schema.required) do |
|
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
230 if data[k] == nil then |
|
13385
72d7830505f0
util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents:
13164
diff
changeset
|
231 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
|
232 return false, errs |
|
11434
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
233 end |
|
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
234 end |
|
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
235 end |
|
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
236 |
|
12988
8592770be63a
util.jsonschema: Implement 'dependentRequired'
Kim Alvefur <zash@zash.se>
parents:
12975
diff
changeset
|
237 if schema.dependentRequired then |
|
8592770be63a
util.jsonschema: Implement 'dependentRequired'
Kim Alvefur <zash@zash.se>
parents:
12975
diff
changeset
|
238 for k, reqs in pairs(schema.dependentRequired) do |
|
8592770be63a
util.jsonschema: Implement 'dependentRequired'
Kim Alvefur <zash@zash.se>
parents:
12975
diff
changeset
|
239 if data[k] ~= nil then |
|
8592770be63a
util.jsonschema: Implement 'dependentRequired'
Kim Alvefur <zash@zash.se>
parents:
12975
diff
changeset
|
240 for _, req in ipairs(reqs) do |
|
8592770be63a
util.jsonschema: Implement 'dependentRequired'
Kim Alvefur <zash@zash.se>
parents:
12975
diff
changeset
|
241 if data[req] == nil then |
|
13385
72d7830505f0
util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents:
13164
diff
changeset
|
242 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
|
243 return false, errs |
|
12988
8592770be63a
util.jsonschema: Implement 'dependentRequired'
Kim Alvefur <zash@zash.se>
parents:
12975
diff
changeset
|
244 end |
|
8592770be63a
util.jsonschema: Implement 'dependentRequired'
Kim Alvefur <zash@zash.se>
parents:
12975
diff
changeset
|
245 end |
|
8592770be63a
util.jsonschema: Implement 'dependentRequired'
Kim Alvefur <zash@zash.se>
parents:
12975
diff
changeset
|
246 end |
|
8592770be63a
util.jsonschema: Implement 'dependentRequired'
Kim Alvefur <zash@zash.se>
parents:
12975
diff
changeset
|
247 end |
|
8592770be63a
util.jsonschema: Implement 'dependentRequired'
Kim Alvefur <zash@zash.se>
parents:
12975
diff
changeset
|
248 end |
|
8592770be63a
util.jsonschema: Implement 'dependentRequired'
Kim Alvefur <zash@zash.se>
parents:
12975
diff
changeset
|
249 |
|
12579
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
250 if schema.propertyNames ~= nil then |
|
13385
72d7830505f0
util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents:
13164
diff
changeset
|
251 |
|
12579
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
252 for k in pairs(data) do |
|
13385
72d7830505f0
util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents:
13164
diff
changeset
|
253 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
|
254 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
|
255 return false, errs |
|
11434
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
256 end |
|
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
257 end |
|
12579
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
258 end |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
259 |
|
13084
87f646e353cf
util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents:
12989
diff
changeset
|
260 local seen_properties = {} |
|
87f646e353cf
util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents:
12989
diff
changeset
|
261 |
|
12579
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
262 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
|
263 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
|
264 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
|
265 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
|
266 return false, errs |
|
11446
58c534bac798
util.jsonschema: Implement "propertyNames"
Kim Alvefur <zash@zash.se>
parents:
11445
diff
changeset
|
267 end |
|
13084
87f646e353cf
util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents:
12989
diff
changeset
|
268 seen_properties[k] = true |
|
87f646e353cf
util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents:
12989
diff
changeset
|
269 end |
|
87f646e353cf
util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents:
12989
diff
changeset
|
270 end |
|
87f646e353cf
util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents:
12989
diff
changeset
|
271 |
|
87f646e353cf
util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents:
12989
diff
changeset
|
272 if schema.luaPatternProperties then |
|
87f646e353cf
util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents:
12989
diff
changeset
|
273 |
|
87f646e353cf
util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents:
12989
diff
changeset
|
274 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
|
275 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
|
276 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
|
277 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
|
278 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
|
279 return false, errs |
|
13084
87f646e353cf
util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents:
12989
diff
changeset
|
280 end |
|
87f646e353cf
util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents:
12989
diff
changeset
|
281 seen_properties[k] = true |
|
87f646e353cf
util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents:
12989
diff
changeset
|
282 end |
|
87f646e353cf
util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents:
12989
diff
changeset
|
283 end |
|
12579
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
284 end |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
285 end |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
286 |
|
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
287 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
|
288 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
|
289 if not seen_properties[k] then |
|
13385
72d7830505f0
util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents:
13164
diff
changeset
|
290 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
|
291 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
|
292 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
|
293 end |
|
11434
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
294 end |
|
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
295 end |
|
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
296 end |
|
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
297 |
|
12989
dee080c2441e
util.jsonschema: Implement 'dependentSchemas'
Kim Alvefur <zash@zash.se>
parents:
12988
diff
changeset
|
298 if schema.dependentSchemas then |
|
dee080c2441e
util.jsonschema: Implement 'dependentSchemas'
Kim Alvefur <zash@zash.se>
parents:
12988
diff
changeset
|
299 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
|
300 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
|
301 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
|
302 return false, errs |
|
12989
dee080c2441e
util.jsonschema: Implement 'dependentSchemas'
Kim Alvefur <zash@zash.se>
parents:
12988
diff
changeset
|
303 end |
|
dee080c2441e
util.jsonschema: Implement 'dependentSchemas'
Kim Alvefur <zash@zash.se>
parents:
12988
diff
changeset
|
304 end |
|
dee080c2441e
util.jsonschema: Implement 'dependentSchemas'
Kim Alvefur <zash@zash.se>
parents:
12988
diff
changeset
|
305 end |
|
dee080c2441e
util.jsonschema: Implement 'dependentSchemas'
Kim Alvefur <zash@zash.se>
parents:
12988
diff
changeset
|
306 |
|
11434
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
307 if schema.uniqueItems then |
|
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
308 |
|
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
309 local values = {} |
|
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
310 for _, v in pairs(data) do |
|
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
311 if values[v] then |
|
13385
72d7830505f0
util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents:
13164
diff
changeset
|
312 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
|
313 return false, errs |
|
11434
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
314 end |
|
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
315 values[v] = true |
|
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
316 end |
|
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
317 end |
|
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
318 |
|
11443
a526abef61e6
util.jsonschema: Implement the "prefixItems" keyword
Kim Alvefur <zash@zash.se>
parents:
11442
diff
changeset
|
319 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
|
320 if schema.prefixItems ~= nil then |
|
11443
a526abef61e6
util.jsonschema: Implement the "prefixItems" keyword
Kim Alvefur <zash@zash.se>
parents:
11442
diff
changeset
|
321 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
|
322 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
|
323 break |
|
13385
72d7830505f0
util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents:
13164
diff
changeset
|
324 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
|
325 p = i |
|
a526abef61e6
util.jsonschema: Implement the "prefixItems" keyword
Kim Alvefur <zash@zash.se>
parents:
11442
diff
changeset
|
326 else |
|
13385
72d7830505f0
util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents:
13164
diff
changeset
|
327 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
|
328 return false, errs |
|
11443
a526abef61e6
util.jsonschema: Implement the "prefixItems" keyword
Kim Alvefur <zash@zash.se>
parents:
11442
diff
changeset
|
329 end |
|
a526abef61e6
util.jsonschema: Implement the "prefixItems" keyword
Kim Alvefur <zash@zash.se>
parents:
11442
diff
changeset
|
330 end |
|
a526abef61e6
util.jsonschema: Implement the "prefixItems" keyword
Kim Alvefur <zash@zash.se>
parents:
11442
diff
changeset
|
331 end |
|
a526abef61e6
util.jsonschema: Implement the "prefixItems" keyword
Kim Alvefur <zash@zash.se>
parents:
11442
diff
changeset
|
332 |
|
12579
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
333 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
|
334 for i = p + 1, #(data) do |
|
13385
72d7830505f0
util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents:
13164
diff
changeset
|
335 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
|
336 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
|
337 return false, errs |
|
11434
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
338 end |
|
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
339 end |
|
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
340 end |
|
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
341 |
|
12579
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
342 if schema.contains ~= nil then |
|
13087
5d3e8a226840
util.jsonschema: Implement 'minContains' and 'maxContains'
Kim Alvefur <zash@zash.se>
parents:
13085
diff
changeset
|
343 local found = 0 |
|
13162
6140aa67c618
util.jsonschema: Silence Teal warnings about counting items in tables
Kim Alvefur <zash@zash.se>
parents:
13088
diff
changeset
|
344 for i = 1, #(data) do |
|
13385
72d7830505f0
util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents:
13164
diff
changeset
|
345 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
|
346 found = found + 1 |
|
13385
72d7830505f0
util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents:
13164
diff
changeset
|
347 else |
|
72d7830505f0
util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents:
13164
diff
changeset
|
348 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
|
349 end |
|
95f0d77175ca
util.jsonschema: Implement the "contains" keyword
Kim Alvefur <zash@zash.se>
parents:
11441
diff
changeset
|
350 end |
|
13385
72d7830505f0
util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents:
13164
diff
changeset
|
351 if found < (schema.minContains or 1) then |
|
72d7830505f0
util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents:
13164
diff
changeset
|
352 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
|
353 return false, errs |
|
72d7830505f0
util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents:
13164
diff
changeset
|
354 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
|
355 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
|
356 return false, errs |
|
11442
95f0d77175ca
util.jsonschema: Implement the "contains" keyword
Kim Alvefur <zash@zash.se>
parents:
11441
diff
changeset
|
357 end |
|
95f0d77175ca
util.jsonschema: Implement the "contains" keyword
Kim Alvefur <zash@zash.se>
parents:
11441
diff
changeset
|
358 end |
|
11434
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
359 end |
|
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
360 |
|
12579
ca6a43fe0231
util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents:
12500
diff
changeset
|
361 return true |
|
11434
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
362 end |
|
66d4067bdfb2
util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
363 |
|
11460
a8b4e04bc044
util.jsonschema: Rename types for improved readability
Kim Alvefur <zash@zash.se>
parents:
11448
diff
changeset
|
364 json_schema_object.validate = validate; |
|
a8b4e04bc044
util.jsonschema: Rename types for improved readability
Kim Alvefur <zash@zash.se>
parents:
11448
diff
changeset
|
365 |
|
a8b4e04bc044
util.jsonschema: Rename types for improved readability
Kim Alvefur <zash@zash.se>
parents:
11448
diff
changeset
|
366 return json_schema_object |
