@@ -52,19 +52,14 @@ auto is_official_metaschema_reference(
52
52
auto bundle_schema (sourcemeta::jsontoolkit::JSON &root,
53
53
const std::string &container,
54
54
const sourcemeta::jsontoolkit::JSON &subschema,
55
- sourcemeta::jsontoolkit::FrameLocations &frame,
56
- sourcemeta::jsontoolkit::FrameReferences &references,
55
+ sourcemeta::jsontoolkit::Frame &frame,
57
56
const sourcemeta::jsontoolkit::SchemaWalker &walker,
58
57
const sourcemeta::jsontoolkit::SchemaResolver &resolver,
59
58
const std::optional<std::string> &default_dialect) -> void {
60
- sourcemeta::jsontoolkit::frame (subschema, frame, references, walker, resolver,
61
- default_dialect);
59
+ frame.analyse (subschema, walker, resolver, default_dialect);
62
60
63
- for (const auto &[key, reference] : references) {
64
- if (frame.contains ({sourcemeta::jsontoolkit::ReferenceType::Static,
65
- reference.destination }) ||
66
- frame.contains ({sourcemeta::jsontoolkit::ReferenceType::Dynamic,
67
- reference.destination }) ||
61
+ for (const auto &[key, reference] : frame.references ()) {
62
+ if (frame.traverse (reference.destination ).has_value () ||
68
63
69
64
// We don't want to bundle official schemas, as we can expect
70
65
// virtually all implementations to understand them out of the box
@@ -74,15 +69,11 @@ auto bundle_schema(sourcemeta::jsontoolkit::JSON &root,
74
69
75
70
// If we can't find the destination but there is a base and we can
76
71
// find base, then we are facing an unresolved fragment
77
- if (reference.base .has_value ()) {
78
- if (frame.contains ({sourcemeta::jsontoolkit::ReferenceType::Static,
79
- reference.base .value ()}) ||
80
- frame.contains ({sourcemeta::jsontoolkit::ReferenceType::Dynamic,
81
- reference.base .value ()})) {
82
- throw sourcemeta::jsontoolkit::SchemaReferenceError (
83
- reference.destination , key.second ,
84
- " Could not resolve schema reference" );
85
- }
72
+ if (reference.base .has_value () &&
73
+ frame.traverse (reference.base .value ()).has_value ()) {
74
+ throw sourcemeta::jsontoolkit::SchemaReferenceError (
75
+ reference.destination , key.second ,
76
+ " Could not resolve schema reference" );
86
77
}
87
78
88
79
root.assign_if_missing (container,
@@ -98,10 +89,7 @@ auto bundle_schema(sourcemeta::jsontoolkit::JSON &root,
98
89
const auto identifier{reference.base .value ()};
99
90
const auto remote{resolver (identifier)};
100
91
if (!remote.has_value ()) {
101
- if (frame.contains (
102
- {sourcemeta::jsontoolkit::ReferenceType::Static, identifier}) ||
103
- frame.contains (
104
- {sourcemeta::jsontoolkit::ReferenceType::Dynamic, identifier})) {
92
+ if (frame.traverse (identifier).has_value ()) {
105
93
throw sourcemeta::jsontoolkit::SchemaReferenceError (
106
94
reference.destination , key.second ,
107
95
" Could not resolve schema reference" );
@@ -134,7 +122,7 @@ auto bundle_schema(sourcemeta::jsontoolkit::JSON &root,
134
122
}
135
123
136
124
embed_schema (root.at (container), identifier, copy);
137
- bundle_schema (root, container, copy, frame, references, walker, resolver,
125
+ bundle_schema (root, container, copy, frame, walker, resolver,
138
126
default_dialect);
139
127
}
140
128
}
@@ -145,10 +133,8 @@ auto remove_identifiers(sourcemeta::jsontoolkit::JSON &schema,
145
133
const std::optional<std::string> &default_dialect)
146
134
-> void {
147
135
// (1) Re-frame before changing anything
148
- sourcemeta::jsontoolkit::FrameLocations frame;
149
- sourcemeta::jsontoolkit::FrameReferences references;
150
- sourcemeta::jsontoolkit::frame (schema, frame, references, walker, resolver,
151
- default_dialect);
136
+ sourcemeta::jsontoolkit::Frame frame;
137
+ frame.analyse (schema, walker, resolver, default_dialect);
152
138
153
139
// (2) Remove all identifiers and anchors
154
140
for (const auto &entry : sourcemeta::jsontoolkit::SchemaIterator{
@@ -175,28 +161,20 @@ auto remove_identifiers(sourcemeta::jsontoolkit::JSON &schema,
175
161
}
176
162
177
163
// (3) Fix-up reference based on pointers from the root
178
- for (const auto &[key, reference] : references) {
164
+ for (const auto &[key, reference] : frame. references () ) {
179
165
// We don't want to bundle official schemas, as we can expect
180
166
// virtually all implementations to understand them out of the box
181
167
if (is_official_metaschema_reference (key.second , reference.destination )) {
182
168
continue ;
183
169
}
184
170
185
- assert (frame.contains ({sourcemeta::jsontoolkit::ReferenceType::Static,
186
- reference.destination }) ||
187
- frame.contains ({sourcemeta::jsontoolkit::ReferenceType::Dynamic,
188
- reference.destination }));
189
- const auto &entry{
190
- frame.contains ({sourcemeta::jsontoolkit::ReferenceType::Static,
191
- reference.destination })
192
- ? frame.at ({sourcemeta::jsontoolkit::ReferenceType::Static,
193
- reference.destination })
194
- : frame.at ({sourcemeta::jsontoolkit::ReferenceType::Dynamic,
195
- reference.destination })};
171
+ const auto result{frame.traverse (reference.destination )};
172
+ assert (result.has_value ());
196
173
sourcemeta::jsontoolkit::set (
197
174
schema, key.second ,
198
175
sourcemeta::jsontoolkit::JSON{
199
- sourcemeta::jsontoolkit::to_uri (entry.pointer ).recompose ()});
176
+ sourcemeta::jsontoolkit::to_uri (result.value ().get ().pointer )
177
+ .recompose ()});
200
178
}
201
179
}
202
180
@@ -209,10 +187,9 @@ auto bundle(sourcemeta::jsontoolkit::JSON &schema, const SchemaWalker &walker,
209
187
const std::optional<std::string> &default_dialect) -> void {
210
188
const auto vocabularies{
211
189
sourcemeta::jsontoolkit::vocabularies (schema, resolver, default_dialect)};
212
- sourcemeta::jsontoolkit::FrameLocations frame;
213
- sourcemeta::jsontoolkit::FrameReferences references;
190
+ sourcemeta::jsontoolkit::Frame frame;
214
191
bundle_schema (schema, definitions_keyword (vocabularies), schema, frame,
215
- references, walker, resolver, default_dialect);
192
+ walker, resolver, default_dialect);
216
193
217
194
if (options == BundleOptions::WithoutIdentifiers) {
218
195
remove_identifiers (schema, walker, resolver, default_dialect);
0 commit comments