Blaze 0.0.1
The ultra high-performance JSON Schema evaluator
Loading...
Searching...
No Matches
codegen.h
1#ifndef SOURCEMETA_BLAZE_CODEGEN_H_
2#define SOURCEMETA_BLAZE_CODEGEN_H_
3
4#ifndef SOURCEMETA_BLAZE_CODEGEN_EXPORT
5#include <sourcemeta/blaze/codegen_export.h>
6#endif
7
8// NOLINTBEGIN(misc-include-cleaner)
9#include <sourcemeta/blaze/codegen_error.h>
10#include <sourcemeta/blaze/codegen_typescript.h>
11// NOLINTEND(misc-include-cleaner)
12
13#include <sourcemeta/core/json.h>
14#include <sourcemeta/core/jsonpointer.h>
15#include <sourcemeta/core/jsonschema.h>
16
17#include <cstdint> // std::uint8_t
18#include <functional> // std::function
19#include <map> // std::map
20#include <optional> // std::optional, std::nullopt
21#include <ostream> // std::ostream
22#include <string> // std::string
23#include <string_view> // std::string_view
24#include <utility> // std::pair
25#include <variant> // std::variant, std::visit
26#include <vector> // std::vector
27
30
31namespace sourcemeta::blaze {
32
34enum class CodegenIRScalarType : std::uint8_t {
35 String,
36 Number,
37 Integer,
38 Boolean,
39 Null
40};
41
44 sourcemeta::core::Pointer pointer;
45 std::vector<std::string> symbol;
46};
47
50 CodegenIRScalarType value;
51};
52
55 std::vector<sourcemeta::core::JSON> values;
56};
57
60 std::vector<CodegenIRType> values;
61};
62
65 std::vector<CodegenIRType> values;
66};
67
70 bool required;
71 bool immutable;
72};
73
76 std::optional<std::string> prefix;
77};
78
81 // To preserve the user's ordering
82 std::vector<std::pair<sourcemeta::core::JSON::String, CodegenIRObjectValue>>
83 members;
84 std::variant<bool, CodegenIRType> additional;
85 std::vector<CodegenIRObjectPatternProperty> pattern;
86};
87
90 std::optional<CodegenIRType> items;
91};
92
95 std::vector<CodegenIRType> items;
96 std::optional<CodegenIRType> additional;
97};
98
101
104
107 CodegenIRType condition;
108 CodegenIRType consequent;
109 CodegenIRType alternative;
110};
111
114 CodegenIRType target;
115};
116
118using CodegenIREntity =
123
125using CodegenIRResult = std::vector<CodegenIREntity>;
126
128using CodegenCompiler = std::function<CodegenIREntity(
129 const sourcemeta::core::JSON &, const sourcemeta::core::SchemaFrame &,
130 const sourcemeta::core::SchemaFrame::Location &,
131 const sourcemeta::core::SchemaResolver &, const sourcemeta::core::JSON &)>;
132
134SOURCEMETA_BLAZE_CODEGEN_EXPORT
135auto default_compiler(const sourcemeta::core::JSON &schema,
136 const sourcemeta::core::SchemaFrame &frame,
137 const sourcemeta::core::SchemaFrame::Location &location,
138 const sourcemeta::core::SchemaResolver &resolver,
139 const sourcemeta::core::JSON &subschema)
140 -> CodegenIREntity;
141
143SOURCEMETA_BLAZE_CODEGEN_EXPORT
144auto compile(const sourcemeta::core::JSON &input,
145 const sourcemeta::core::SchemaWalker &walker,
146 const sourcemeta::core::SchemaResolver &resolver,
147 const CodegenCompiler &compiler,
148 const std::string_view default_dialect = "",
149 const std::string_view default_id = "") -> CodegenIRResult;
150
152SOURCEMETA_BLAZE_CODEGEN_EXPORT
153auto symbol(const sourcemeta::core::SchemaFrame &frame,
154 const sourcemeta::core::SchemaFrame::Location &location)
155 -> std::vector<std::string>;
156
158SOURCEMETA_BLAZE_CODEGEN_EXPORT
159auto mangle(const std::string_view prefix,
160 const sourcemeta::core::Pointer &pointer,
161 const std::vector<std::string> &symbol,
162 std::map<std::string, sourcemeta::core::Pointer> &cache)
163 -> const std::string &;
164
166template <typename T>
167auto generate(std::ostream &output, const CodegenIRResult &result,
168 const std::string_view prefix = "Schema") -> void {
169 T visitor{output, prefix};
170 const char *separator{""};
171 for (const auto &entity : result) {
172 output << separator;
173 separator = "\n";
174 std::visit(visitor, entity);
175 }
176}
177
178} // namespace sourcemeta::blaze
179
180#endif
Definition codegen.h:103
Definition codegen.h:89
Definition codegen.h:80
Definition codegen.h:49
Definition codegen.h:94
Definition codegen.h:43
Definition codegen.h:59