Annotate

util/jsonschema.lua @ 13872:76582d10bc09 default tip

Merge 13.0->trunk
author Kim Alvefur <zash@zash.se>
date Mon, 05 May 2025 17:30:06 +0200
parent 13866:7f6916088278
parent 13867:eabd38507c1d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
1 -- This file is generated from teal-src/util/jsonschema.lua
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
2
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
3 if not math.type then
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
4 require("prosody.util.mathcompat")
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
5 end
13088
0fbb2b3fd4c0 util.jsonschema: Fix UTF-8ness of 'minLength' and 'maxLength'
Kim Alvefur <zash@zash.se>
parents: 13087
diff changeset
6
13866
7f6916088278 util.jsonschema: Simplify retrieval of UTF-8 length function
Kim Alvefur <zash@zash.se>
parents: 13385
diff changeset
7 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
8
12975
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12760
diff changeset
9 local json = require("prosody.util.json")
11460
a8b4e04bc044 util.jsonschema: Rename types for improved readability
Kim Alvefur <zash@zash.se>
parents: 11448
diff changeset
10 local null = json.null;
11434
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
11
12975
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12760
diff changeset
12 local pointer = require("prosody.util.jsonpointer")
12132
4ff0d33dfb2b util.jsonschema: Add support for $ref pointers
Kim Alvefur <zash@zash.se>
parents: 11460
diff changeset
13
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
14 local json_schema_object = { xml_t = {} }
11434
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
15
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
16 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
17 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
18 return true
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
19 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
20 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
21 elseif schema == "array" and type(data) == "table" then
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
22 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
23 elseif schema == "integer" then
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
24 return math.type(data) == schema
11460
a8b4e04bc044 util.jsonschema: Rename types for improved readability
Kim Alvefur <zash@zash.se>
parents: 11448
diff changeset
25 elseif schema == "null" then
a8b4e04bc044 util.jsonschema: Rename types for improved readability
Kim Alvefur <zash@zash.se>
parents: 11448
diff changeset
26 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
27 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
28 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
29 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
30 return true
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 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
33 return false
11434
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
34 else
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
35 return type(data) == schema
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 end
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
38
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
39 local function mkerr(sloc, iloc, err)
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
40 return { schemaLocation = sloc; instanceLocation = iloc; error = err }
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
41 end
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
42
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
43 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
44 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
45 return schema
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
46 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
47
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
48 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
49 root = schema
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
50 iloc = ""
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
51 sloc = ""
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
52 errs = {};
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
53 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
54
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
55 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
56 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
57 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
58 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
59 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
60 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
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 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
64
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
65 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
66 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
67 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
68 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
69
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
70 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
71 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
72
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
73 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
74 if not (type(k) == "string") then
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
75 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
76 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
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 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
81
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
82 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
83 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
84
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
85 for i in pairs(data) do
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
86 if not (math.type(i) == "integer") then
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
87 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
88 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
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 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
93
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
94 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
95 local match = false
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
96 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
97 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
98
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
99 match = true
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
100 break
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 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
103 if not match then
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
104 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
105 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
106 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
107 end
11434
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
108
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
109 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
110 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
111 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
112 return false, errs
11434
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
113 end
13088
0fbb2b3fd4c0 util.jsonschema: Fix UTF-8ness of 'minLength' and 'maxLength'
Kim Alvefur <zash@zash.se>
parents: 13087
diff changeset
114 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
115 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
116 return false, errs
11434
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
117 end
13085
0e17cb78264f util.jsonschema: Implement 'luaPattern' - Lua variant of 'pattern'
Kim Alvefur <zash@zash.se>
parents: 13084
diff changeset
118 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
119 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
120 return false, errs
13085
0e17cb78264f util.jsonschema: Implement 'luaPattern' - Lua variant of 'pattern'
Kim Alvefur <zash@zash.se>
parents: 13084
diff changeset
121 end
11434
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
122 end
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
123
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
124 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
125 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
126 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
127 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
128 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
129
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
130 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
131 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
132 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
133 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
134
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
135 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
136 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
137 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
138 end
11434
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
139
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
140 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
141 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
142 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
143 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
144
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
145 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
146 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
147 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
148 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
149 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
150
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
151 if schema.allOf then
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
152 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
153 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
154 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
155 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
156 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
157 end
11434
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
158 end
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
159
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
160 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
161 local valid = 0
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
162 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
163 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
164 valid = valid + 1
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 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
167 if valid ~= 1 then
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
168 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
169 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
170 end
11434
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
171 end
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
172
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
173 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
174 local match = false
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
175 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
176 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
177 match = true
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
178 break
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 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
181 if not match then
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
182 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
183 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
184 end
11434
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
185 end
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
186
13867
eabd38507c1d util.jsonschema: Fix handling of `false` as schema
Kim Alvefur <zash@zash.se>
parents: 13385
diff changeset
187 if schema["not"] ~= nil then
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
188 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
189 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
190 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
191 end
11434
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
192 end
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
193
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
194 if schema["if"] ~= nil then
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
195 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
196 if schema["then"] ~= nil then
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
197 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
198 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
199 return false, errs
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
200 end
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
201 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
202 else
13867
eabd38507c1d util.jsonschema: Fix handling of `false` as schema
Kim Alvefur <zash@zash.se>
parents: 13385
diff changeset
203 if schema["else"] ~= nil then
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
204 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
205 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
206 return false, errs
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
207 end
12579
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 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
211
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
212 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
213 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
214 return false, errs
11434
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
215 end
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
216
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
217 if type(data) == "table" then
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
218
13162
6140aa67c618 util.jsonschema: Silence Teal warnings about counting items in tables
Kim Alvefur <zash@zash.se>
parents: 13088
diff changeset
219 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
220 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
221 return false, errs
11434
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
222 end
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
223
13162
6140aa67c618 util.jsonschema: Silence Teal warnings about counting items in tables
Kim Alvefur <zash@zash.se>
parents: 13088
diff changeset
224 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
225 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
226 return false, errs
11434
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
227 end
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
228
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
229 if schema.required then
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
230 for _, k in ipairs(schema.required) do
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
231 if data[k] == nil then
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
232 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
233 return false, errs
11434
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 end
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
237
12988
8592770be63a util.jsonschema: Implement 'dependentRequired'
Kim Alvefur <zash@zash.se>
parents: 12975
diff changeset
238 if schema.dependentRequired then
8592770be63a util.jsonschema: Implement 'dependentRequired'
Kim Alvefur <zash@zash.se>
parents: 12975
diff changeset
239 for k, reqs in pairs(schema.dependentRequired) do
8592770be63a util.jsonschema: Implement 'dependentRequired'
Kim Alvefur <zash@zash.se>
parents: 12975
diff changeset
240 if data[k] ~= nil then
8592770be63a util.jsonschema: Implement 'dependentRequired'
Kim Alvefur <zash@zash.se>
parents: 12975
diff changeset
241 for _, req in ipairs(reqs) do
8592770be63a util.jsonschema: Implement 'dependentRequired'
Kim Alvefur <zash@zash.se>
parents: 12975
diff changeset
242 if data[req] == nil then
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
243 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
244 return false, errs
12988
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 end
8592770be63a util.jsonschema: Implement 'dependentRequired'
Kim Alvefur <zash@zash.se>
parents: 12975
diff changeset
250
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
251 if schema.propertyNames ~= nil then
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
252
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
253 for k in pairs(data) do
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
254 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
255 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
256 return false, errs
11434
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
257 end
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
258 end
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
259 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
260
13084
87f646e353cf util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents: 12989
diff changeset
261 local seen_properties = {}
87f646e353cf util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents: 12989
diff changeset
262
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
263 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
264 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
265 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
266 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
267 return false, errs
11446
58c534bac798 util.jsonschema: Implement "propertyNames"
Kim Alvefur <zash@zash.se>
parents: 11445
diff changeset
268 end
13084
87f646e353cf util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents: 12989
diff changeset
269 seen_properties[k] = true
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 end
87f646e353cf util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents: 12989
diff changeset
272
87f646e353cf util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents: 12989
diff changeset
273 if schema.luaPatternProperties then
87f646e353cf util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents: 12989
diff changeset
274
87f646e353cf util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents: 12989
diff changeset
275 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
276 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
277 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
278 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
279 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
280 return false, errs
13084
87f646e353cf util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents: 12989
diff changeset
281 end
87f646e353cf util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents: 12989
diff changeset
282 seen_properties[k] = true
87f646e353cf util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents: 12989
diff changeset
283 end
87f646e353cf util.jsonschema: Implement 'luaPatternProperties' as Lua variant of 'patternProperties'
Kim Alvefur <zash@zash.se>
parents: 12989
diff changeset
284 end
12579
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 end
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
287
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
288 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
289 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
290 if not seen_properties[k] then
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
291 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
292 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
293 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
294 end
11434
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 end
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
298
12989
dee080c2441e util.jsonschema: Implement 'dependentSchemas'
Kim Alvefur <zash@zash.se>
parents: 12988
diff changeset
299 if schema.dependentSchemas then
dee080c2441e util.jsonschema: Implement 'dependentSchemas'
Kim Alvefur <zash@zash.se>
parents: 12988
diff changeset
300 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
301 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
302 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
303 return false, errs
12989
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 end
dee080c2441e util.jsonschema: Implement 'dependentSchemas'
Kim Alvefur <zash@zash.se>
parents: 12988
diff changeset
307
11434
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
308 if schema.uniqueItems then
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
309
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
310 local values = {}
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
311 for _, v in pairs(data) do
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
312 if values[v] then
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
313 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
314 return false, errs
11434
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
315 end
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
316 values[v] = true
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 end
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
319
11443
a526abef61e6 util.jsonschema: Implement the "prefixItems" keyword
Kim Alvefur <zash@zash.se>
parents: 11442
diff changeset
320 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
321 if schema.prefixItems ~= nil then
11443
a526abef61e6 util.jsonschema: Implement the "prefixItems" keyword
Kim Alvefur <zash@zash.se>
parents: 11442
diff changeset
322 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
323 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
324 break
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
325 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
326 p = i
a526abef61e6 util.jsonschema: Implement the "prefixItems" keyword
Kim Alvefur <zash@zash.se>
parents: 11442
diff changeset
327 else
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
328 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
329 return false, errs
11443
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 end
a526abef61e6 util.jsonschema: Implement the "prefixItems" keyword
Kim Alvefur <zash@zash.se>
parents: 11442
diff changeset
333
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
334 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
335 for i = p + 1, #(data) do
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
336 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
337 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
338 return false, errs
11434
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 end
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
342
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
343 if schema.contains ~= nil then
13087
5d3e8a226840 util.jsonschema: Implement 'minContains' and 'maxContains'
Kim Alvefur <zash@zash.se>
parents: 13085
diff changeset
344 local found = 0
13162
6140aa67c618 util.jsonschema: Silence Teal warnings about counting items in tables
Kim Alvefur <zash@zash.se>
parents: 13088
diff changeset
345 for i = 1, #(data) do
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
346 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
347 found = found + 1
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
348 else
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
349 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
350 end
95f0d77175ca util.jsonschema: Implement the "contains" keyword
Kim Alvefur <zash@zash.se>
parents: 11441
diff changeset
351 end
13385
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
352 if found < (schema.minContains or 1) then
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
353 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
354 return false, errs
72d7830505f0 util.jsonschema: Return basic structured validation response
Kim Alvefur <zash@zash.se>
parents: 13164
diff changeset
355 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
356 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
357 return false, errs
11442
95f0d77175ca util.jsonschema: Implement the "contains" keyword
Kim Alvefur <zash@zash.se>
parents: 11441
diff changeset
358 end
95f0d77175ca util.jsonschema: Implement the "contains" keyword
Kim Alvefur <zash@zash.se>
parents: 11441
diff changeset
359 end
11434
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
360 end
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
361
12579
ca6a43fe0231 util.jsonschema: Fix validation to not assume presence of "type" field
Kim Alvefur <zash@zash.se>
parents: 12500
diff changeset
362 return true
11434
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
363 end
66d4067bdfb2 util.jsonschema: Library for JSON Schema validation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
364
11460
a8b4e04bc044 util.jsonschema: Rename types for improved readability
Kim Alvefur <zash@zash.se>
parents: 11448
diff changeset
365 json_schema_object.validate = validate;
a8b4e04bc044 util.jsonschema: Rename types for improved readability
Kim Alvefur <zash@zash.se>
parents: 11448
diff changeset
366
a8b4e04bc044 util.jsonschema: Rename types for improved readability
Kim Alvefur <zash@zash.se>
parents: 11448
diff changeset
367 return json_schema_object