Blaze 0.0.1
The ultra high-performance JSON Schema evaluator
Loading...
Searching...
No Matches
evaluator_instruction.h
1#ifndef SOURCEMETA_BLAZE_EVALUATOR_TEMPLATE_H
2#define SOURCEMETA_BLAZE_EVALUATOR_TEMPLATE_H
3
4#ifndef SOURCEMETA_BLAZE_EVALUATOR_EXPORT
5#include <sourcemeta/blaze/evaluator_export.h>
6#endif
7
8#include <sourcemeta/blaze/evaluator_value.h>
9
10#include <sourcemeta/core/jsonpointer.h>
11
12#include <cstdint> // std::uint8_t
13#include <string> // std::string
14#include <string_view> // std::string_view
15#include <vector> // std::vector
16
17namespace sourcemeta::blaze {
18
19// For fast internal instruction dispatching. It must stay
20// in sync with the variant ordering above
22enum class InstructionIndex : std::uint8_t {
23 AssertionFail = 0,
24 AssertionDefines,
25 AssertionDefinesStrict,
26 AssertionDefinesAll,
27 AssertionDefinesAllStrict,
28 AssertionDefinesExactly,
29 AssertionDefinesExactlyStrict,
30 AssertionDefinesExactlyStrictHash3,
31 AssertionPropertyDependencies,
32 AssertionType,
33 AssertionTypeAny,
34 AssertionTypeStrict,
35 AssertionTypeStrictAny,
36 AssertionNotTypeStrictAny,
37 AssertionTypeStringBounded,
38 AssertionTypeStringUpper,
39 AssertionTypeArrayBounded,
40 AssertionTypeArrayUpper,
41 AssertionTypeObjectBounded,
42 AssertionTypeObjectUpper,
43 AssertionRegex,
44 AssertionStringSizeLess,
45 AssertionStringSizeGreater,
46 AssertionArraySizeLess,
47 AssertionArraySizeGreater,
48 AssertionObjectSizeLess,
49 AssertionObjectSizeGreater,
50 AssertionEqual,
51 AssertionEqualsAny,
52 AssertionEqualsAnyStringHash,
53 AssertionGreaterEqual,
54 AssertionLessEqual,
55 AssertionGreater,
56 AssertionLess,
57 AssertionUnique,
58 AssertionDivisible,
59 AssertionTypeIntegerBounded,
60 AssertionTypeIntegerBoundedStrict,
61 AssertionTypeIntegerLowerBound,
62 AssertionTypeIntegerLowerBoundStrict,
63 AssertionNumberIntegerBounded,
64 AssertionNumberType,
65 AssertionStringType,
66 AssertionPropertyType,
67 AssertionPropertyTypeEvaluate,
68 AssertionPropertyTypeStrict,
69 AssertionPropertyTypeStrictEvaluate,
70 AssertionPropertyTypeStrictAny,
71 AssertionPropertyTypeStrictAnyEvaluate,
72 AssertionPropertyEqual,
73 AssertionArrayPrefix,
74 AssertionArrayPrefixEvaluate,
75 AssertionObjectPropertiesSimple,
76 AnnotationEmit,
77 AnnotationEmitWrapped,
78 AnnotationToParent,
79 AnnotationBasenameToParent,
80 Evaluate,
81 LogicalNot,
82 LogicalNotEvaluate,
83 LogicalOr,
84 LogicalAnd,
85 LogicalXor,
86 LogicalCondition,
87 LogicalWhenType,
88 LogicalWhenDefines,
89 LogicalWhenArraySizeGreater,
90 LoopPropertiesUnevaluated,
91 LoopPropertiesUnevaluatedExcept,
92 LoopPropertiesMatch,
93 LoopPropertiesMatchClosed,
94 LoopProperties,
95 LoopPropertiesEvaluate,
96 LoopPropertiesRegex,
97 LoopPropertiesRegexClosed,
98 LoopPropertiesStartsWith,
99 LoopPropertiesExcept,
100 LoopPropertiesType,
101 LoopPropertiesTypeEvaluate,
102 LoopPropertiesExactlyTypeStrict,
103 LoopPropertiesExactlyTypeStrictHash,
104 LoopPropertiesTypeStrict,
105 LoopPropertiesTypeStrictEvaluate,
106 LoopPropertiesTypeStrictAny,
107 LoopPropertiesTypeStrictAnyEvaluate,
108 LoopKeys,
109 LoopItems,
110 LoopItemsFrom,
111 LoopItemsUnevaluated,
112 LoopItemsType,
113 LoopItemsTypeStrict,
114 LoopItemsTypeStrictAny,
115 LoopItemsPropertiesExactlyTypeStrictHash,
116 LoopItemsPropertiesExactlyTypeStrictHash3,
117 LoopItemsIntegerBounded,
118 LoopItemsIntegerBoundedSized,
119 LoopItemsArrayBoundedTypeStrictAny,
120 LoopContains,
121 ControlGroup,
122 ControlGroupWhenDefines,
123 ControlGroupWhenDefinesDirect,
124 ControlGroupWhenType,
125 ControlEvaluate,
126 ControlDynamicAnchorJump,
127 ControlJump
128};
129
131// NOLINTNEXTLINE(modernize-avoid-c-arrays)
132constexpr std::string_view INSTRUCTION_NAMES[] = {
133 "AssertionFail",
134 "AssertionDefines",
135 "AssertionDefinesStrict",
136 "AssertionDefinesAll",
137 "AssertionDefinesAllStrict",
138 "AssertionDefinesExactly",
139 "AssertionDefinesExactlyStrict",
140 "AssertionDefinesExactlyStrictHash3",
141 "AssertionPropertyDependencies",
142 "AssertionType",
143 "AssertionTypeAny",
144 "AssertionTypeStrict",
145 "AssertionTypeStrictAny",
146 "AssertionNotTypeStrictAny",
147 "AssertionTypeStringBounded",
148 "AssertionTypeStringUpper",
149 "AssertionTypeArrayBounded",
150 "AssertionTypeArrayUpper",
151 "AssertionTypeObjectBounded",
152 "AssertionTypeObjectUpper",
153 "AssertionRegex",
154 "AssertionStringSizeLess",
155 "AssertionStringSizeGreater",
156 "AssertionArraySizeLess",
157 "AssertionArraySizeGreater",
158 "AssertionObjectSizeLess",
159 "AssertionObjectSizeGreater",
160 "AssertionEqual",
161 "AssertionEqualsAny",
162 "AssertionEqualsAnyStringHash",
163 "AssertionGreaterEqual",
164 "AssertionLessEqual",
165 "AssertionGreater",
166 "AssertionLess",
167 "AssertionUnique",
168 "AssertionDivisible",
169 "AssertionTypeIntegerBounded",
170 "AssertionTypeIntegerBoundedStrict",
171 "AssertionTypeIntegerLowerBound",
172 "AssertionTypeIntegerLowerBoundStrict",
173 "AssertionNumberIntegerBounded",
174 "AssertionNumberType",
175 "AssertionStringType",
176 "AssertionPropertyType",
177 "AssertionPropertyTypeEvaluate",
178 "AssertionPropertyTypeStrict",
179 "AssertionPropertyTypeStrictEvaluate",
180 "AssertionPropertyTypeStrictAny",
181 "AssertionPropertyTypeStrictAnyEvaluate",
182 "AssertionPropertyEqual",
183 "AssertionArrayPrefix",
184 "AssertionArrayPrefixEvaluate",
185 "AssertionObjectPropertiesSimple",
186 "AnnotationEmit",
187 "AnnotationEmitWrapped",
188 "AnnotationToParent",
189 "AnnotationBasenameToParent",
190 "Evaluate",
191 "LogicalNot",
192 "LogicalNotEvaluate",
193 "LogicalOr",
194 "LogicalAnd",
195 "LogicalXor",
196 "LogicalCondition",
197 "LogicalWhenType",
198 "LogicalWhenDefines",
199 "LogicalWhenArraySizeGreater",
200 "LoopPropertiesUnevaluated",
201 "LoopPropertiesUnevaluatedExcept",
202 "LoopPropertiesMatch",
203 "LoopPropertiesMatchClosed",
204 "LoopProperties",
205 "LoopPropertiesEvaluate",
206 "LoopPropertiesRegex",
207 "LoopPropertiesRegexClosed",
208 "LoopPropertiesStartsWith",
209 "LoopPropertiesExcept",
210 "LoopPropertiesType",
211 "LoopPropertiesTypeEvaluate",
212 "LoopPropertiesExactlyTypeStrict",
213 "LoopPropertiesExactlyTypeStrictHash",
214 "LoopPropertiesTypeStrict",
215 "LoopPropertiesTypeStrictEvaluate",
216 "LoopPropertiesTypeStrictAny",
217 "LoopPropertiesTypeStrictAnyEvaluate",
218 "LoopKeys",
219 "LoopItems",
220 "LoopItemsFrom",
221 "LoopItemsUnevaluated",
222 "LoopItemsType",
223 "LoopItemsTypeStrict",
224 "LoopItemsTypeStrictAny",
225 "LoopItemsPropertiesExactlyTypeStrictHash",
226 "LoopItemsPropertiesExactlyTypeStrictHash3",
227 "LoopItemsIntegerBounded",
228 "LoopItemsIntegerBoundedSized",
229 "LoopItemsArrayBoundedTypeStrictAny",
230 "LoopContains",
231 "ControlGroup",
232 "ControlGroupWhenDefines",
233 "ControlGroupWhenDefinesDirect",
234 "ControlGroupWhenType",
235 "ControlEvaluate",
236 "ControlDynamicAnchorJump",
237 "ControlJump"};
238
241inline auto is_annotation(const InstructionIndex type) noexcept -> bool {
242 switch (type) {
243 // NOLINTNEXTLINE(bugprone-branch-clone)
244 case InstructionIndex::AnnotationBasenameToParent:
245 return true;
246 case InstructionIndex::AnnotationToParent:
247 return true;
248 case InstructionIndex::AnnotationEmit:
249 return true;
250 case InstructionIndex::AnnotationEmitWrapped:
251 return true;
252 default:
253 return false;
254 }
255}
256
259inline auto is_wrapped_annotation(const InstructionIndex type) noexcept
260 -> bool {
261 switch (type) {
262 case InstructionIndex::AnnotationBasenameToParent:
263 case InstructionIndex::AnnotationEmitWrapped:
264 return true;
265 default:
266 return false;
267 }
268}
269
270// Forward declaration for defining a circular structure
271#ifndef DOXYGEN
272struct Instruction;
273#endif
274
275// Forward declaration, as the template is defined in terms of this header
276#ifndef DOXYGEN
277struct Template;
278#endif
279
282using Instructions = std::vector<Instruction>;
283
287 sourcemeta::core::Pointer relative_schema_location;
288 std::string keyword_location;
289 std::size_t schema_resource;
290 std::size_t vocabulary;
293 std::size_t message;
297 std::size_t message_detail;
298};
299
302// NOLINTNEXTLINE(bugprone-exception-escape)
304 InstructionIndex type;
305 sourcemeta::core::Pointer relative_instance_location;
306 Value value;
307 Instructions children;
308 std::size_t extra_index;
309};
310
318auto SOURCEMETA_BLAZE_EVALUATOR_EXPORT describe(
319 const Template &schema_template, const bool valid, const Instruction &step,
320 const sourcemeta::core::WeakPointer &evaluate_path,
321 const sourcemeta::core::WeakPointer &instance_location,
322 const sourcemeta::core::JSON &instance,
323 const sourcemeta::core::JSON &annotation) -> std::string;
324
325} // namespace sourcemeta::blaze
326
327#endif
std::size_t message_detail
Definition evaluator_instruction.h:297
std::size_t message
Definition evaluator_instruction.h:293
auto is_wrapped_annotation(const InstructionIndex type) noexcept -> bool
Definition evaluator_instruction.h:259
auto is_annotation(const InstructionIndex type) noexcept -> bool
Definition evaluator_instruction.h:241
auto describe(const Template &schema_template, const bool valid, const Instruction &step, const sourcemeta::core::WeakPointer &evaluate_path, const sourcemeta::core::WeakPointer &instance_location, const sourcemeta::core::JSON &instance, const sourcemeta::core::JSON &annotation) -> std::string
std::vector< Instruction > Instructions
Definition evaluator_instruction.h:282
Definition evaluator_instruction.h:303
Definition evaluator_instruction.h:286
Definition evaluator.h:38