@@ -14,8 +14,8 @@ enum class AnchorType : std::uint8_t { Static, Dynamic, All };
14
14
15
15
static auto find_anchors (const sourcemeta::core::JSON &schema,
16
16
const sourcemeta::core::Vocabularies &vocabularies)
17
- -> std::map<std::string , AnchorType> {
18
- std::map<std::string , AnchorType> result;
17
+ -> std::map<sourcemeta::core::JSON::String , AnchorType> {
18
+ std::map<sourcemeta::core::JSON::String , AnchorType> result;
19
19
20
20
// 2020-12
21
21
if (schema.is_object () &&
@@ -74,7 +74,8 @@ static auto find_anchors(const sourcemeta::core::JSON &schema,
74
74
const sourcemeta::core::URI identifier (schema.at (" $id" ).to_string ());
75
75
if (identifier.is_fragment_only ()) {
76
76
result.insert (
77
- {std::string{identifier.fragment ().value ()}, AnchorType::Static});
77
+ {sourcemeta::core::JSON::String{identifier.fragment ().value ()},
78
+ AnchorType::Static});
78
79
}
79
80
}
80
81
}
@@ -88,7 +89,8 @@ static auto find_anchors(const sourcemeta::core::JSON &schema,
88
89
const sourcemeta::core::URI identifier (schema.at (" id" ).to_string ());
89
90
if (identifier.is_fragment_only ()) {
90
91
result.insert (
91
- {std::string{identifier.fragment ().value ()}, AnchorType::Static});
92
+ {sourcemeta::core::JSON::String{identifier.fragment ().value ()},
93
+ AnchorType::Static});
92
94
}
93
95
}
94
96
}
@@ -97,10 +99,12 @@ static auto find_anchors(const sourcemeta::core::JSON &schema,
97
99
}
98
100
99
101
static auto find_nearest_bases (
100
- const std::map<sourcemeta::core::Pointer, std::vector<std::string>> &bases,
102
+ const std::map<sourcemeta::core::Pointer,
103
+ std::vector<sourcemeta::core::JSON::String>> &bases,
101
104
const sourcemeta::core::Pointer &pointer,
102
- const std::optional<std::string> &default_base)
103
- -> std::pair<std::vector<std::string>, sourcemeta::core::Pointer> {
105
+ const std::optional<sourcemeta::core::JSON::String> &default_base)
106
+ -> std::pair<std::vector<sourcemeta::core::JSON::String>,
107
+ sourcemeta::core::Pointer> {
104
108
for (const auto &subpointer : sourcemeta::core::SubPointerWalker{pointer}) {
105
109
if (bases.contains (subpointer)) {
106
110
return {bases.at (subpointer), subpointer};
@@ -115,10 +119,14 @@ static auto find_nearest_bases(
115
119
}
116
120
117
121
static auto find_every_base (
118
- const std::map<sourcemeta::core::Pointer, std::vector<std::string>> &bases,
122
+ const std::map<sourcemeta::core::Pointer,
123
+ std::vector<sourcemeta::core::JSON::String>> &bases,
119
124
const sourcemeta::core::Pointer &pointer)
120
- -> std::vector<std::pair<std::string, sourcemeta::core::Pointer>> {
121
- std::vector<std::pair<std::string, sourcemeta::core::Pointer>> result;
125
+ -> std::vector<
126
+ std::pair<sourcemeta::core::JSON::String, sourcemeta::core::Pointer>> {
127
+ std::vector<
128
+ std::pair<sourcemeta::core::JSON::String, sourcemeta::core::Pointer>>
129
+ result;
122
130
123
131
for (const auto &subpointer : sourcemeta::core::SubPointerWalker{pointer}) {
124
132
if (bases.contains (subpointer)) {
@@ -137,8 +145,8 @@ static auto find_every_base(
137
145
return result;
138
146
}
139
147
140
- static auto ref_overrides_adjacent_keywords (const std::string &base_dialect)
141
- -> bool {
148
+ static auto ref_overrides_adjacent_keywords (
149
+ const sourcemeta::core::JSON::String &base_dialect) -> bool {
142
150
// In older drafts, the presence of `$ref` would override any sibling
143
151
// keywords
144
152
// See
@@ -153,7 +161,9 @@ static auto ref_overrides_adjacent_keywords(const std::string &base_dialect)
153
161
base_dialect == " http://json-schema.org/draft-03/hyper-schema#" ;
154
162
}
155
163
156
- static auto supports_id_anchors (const std::string &base_dialect) -> bool {
164
+ static auto
165
+ supports_id_anchors (const sourcemeta::core::JSON::String &base_dialect)
166
+ -> bool {
157
167
return base_dialect == " http://json-schema.org/draft-07/schema#" ||
158
168
base_dialect == " http://json-schema.org/draft-07/hyper-schema#" ||
159
169
base_dialect == " http://json-schema.org/draft-06/schema#" ||
@@ -163,10 +173,10 @@ static auto supports_id_anchors(const std::string &base_dialect) -> bool {
163
173
}
164
174
165
175
static auto fragment_string (const sourcemeta::core::URI &uri)
166
- -> std::optional<std::string > {
176
+ -> std::optional<sourcemeta::core::JSON::String > {
167
177
const auto fragment{uri.fragment ()};
168
178
if (fragment.has_value ()) {
169
- return std::string {fragment.value ()};
179
+ return sourcemeta::core::JSON::String {fragment.value ()};
170
180
}
171
181
172
182
return std::nullopt;
@@ -177,11 +187,13 @@ store(sourcemeta::core::SchemaFrame::Locations &frame,
177
187
sourcemeta::core::SchemaFrame::Instances &instances,
178
188
const sourcemeta::core::SchemaReferenceType type,
179
189
const sourcemeta::core::SchemaFrame::LocationType entry_type,
180
- const std::string &uri, const std::optional<std::string> &root_id,
181
- const std::string &base_id,
190
+ const sourcemeta::core::JSON::String &uri,
191
+ const std::optional<sourcemeta::core::JSON::String> &root_id,
192
+ const sourcemeta::core::JSON::String &base_id,
182
193
const sourcemeta::core::Pointer &pointer_from_root,
183
194
const sourcemeta::core::Pointer &pointer_from_base,
184
- const std::string &dialect, const std::string &base_dialect,
195
+ const sourcemeta::core::JSON::String &dialect,
196
+ const sourcemeta::core::JSON::String &base_dialect,
185
197
const std::vector<sourcemeta::core::PointerTemplate> &instance_locations,
186
198
const std::optional<sourcemeta::core::Pointer> &parent,
187
199
const bool ignore_if_present = false ) -> void {
@@ -206,7 +218,7 @@ store(sourcemeta::core::SchemaFrame::Locations &frame,
206
218
207
219
struct InternalEntry {
208
220
const sourcemeta::core::SchemaIteratorEntry common;
209
- const std::optional<std::string > id;
221
+ const std::optional<sourcemeta::core::JSON::String > id;
210
222
};
211
223
212
224
static auto traverse_origin_instance_locations (
@@ -510,27 +522,27 @@ auto operator<<(std::ostream &stream, const SchemaFrame &frame)
510
522
511
523
auto SchemaFrame::analyse (const JSON &schema, const SchemaWalker &walker,
512
524
const SchemaResolver &resolver,
513
- const std::optional<std::string > &default_dialect,
514
- const std::optional<std::string > &default_id)
525
+ const std::optional<JSON::String > &default_dialect,
526
+ const std::optional<JSON::String > &default_id)
515
527
-> void {
516
528
std::vector<InternalEntry> subschema_entries;
517
529
std::map<Pointer, CacheSubschema> subschemas;
518
- std::map<sourcemeta::core::Pointer, std::vector<std::string >> base_uris;
519
- std::map<sourcemeta::core::Pointer, std::vector<std::string >> base_dialects;
530
+ std::map<sourcemeta::core::Pointer, std::vector<JSON::String >> base_uris;
531
+ std::map<sourcemeta::core::Pointer, std::vector<JSON::String >> base_dialects;
520
532
521
- const std::optional<std::string > root_base_dialect{
533
+ const std::optional<JSON::String > root_base_dialect{
522
534
sourcemeta::core::base_dialect (schema, resolver, default_dialect)};
523
535
if (!root_base_dialect.has_value ()) {
524
536
throw SchemaError (" Could not determine the base dialect of the schema" );
525
537
}
526
538
527
- std::optional<std::string > root_id{sourcemeta::core::identify (
539
+ std::optional<JSON::String > root_id{sourcemeta::core::identify (
528
540
schema, root_base_dialect.value (), default_id)};
529
541
if (root_id.has_value ()) {
530
542
root_id = URI{root_id.value ()}.canonicalize ().recompose ();
531
543
}
532
544
533
- const std::optional<std::string > root_dialect{
545
+ const std::optional<JSON::String > root_dialect{
534
546
sourcemeta::core::dialect (schema, default_dialect)};
535
547
assert (root_dialect.has_value ());
536
548
@@ -568,7 +580,7 @@ auto SchemaFrame::analyse(const JSON &schema, const SchemaWalker &walker,
568
580
assert (entry.base_dialect .has_value ());
569
581
570
582
// Schema identifier
571
- std::optional<std::string > id{sourcemeta::core::identify (
583
+ std::optional<JSON::String > id{sourcemeta::core::identify (
572
584
entry.subschema .get (), entry.base_dialect .value (),
573
585
entry.pointer .empty () ? default_id : std::nullopt)};
574
586
@@ -611,7 +623,7 @@ auto SchemaFrame::analyse(const JSON &schema, const SchemaWalker &walker,
611
623
612
624
const bool maybe_relative_is_absolute{maybe_relative.is_absolute ()};
613
625
maybe_relative.try_resolve_from (base).canonicalize ();
614
- const std::string new_id{maybe_relative.recompose ()};
626
+ const JSON::String new_id{maybe_relative.recompose ()};
615
627
616
628
if (!maybe_relative_is_absolute ||
617
629
!this ->locations_ .contains (
@@ -667,7 +679,7 @@ auto SchemaFrame::analyse(const JSON &schema, const SchemaWalker &walker,
667
679
}
668
680
669
681
metaschema.canonicalize ();
670
- const std::string destination{metaschema.recompose ()};
682
+ const JSON::String destination{metaschema.recompose ()};
671
683
assert (entry.common .subschema .get ().defines (" $schema" ));
672
684
this ->references_ .insert_or_assign (
673
685
{SchemaReferenceType::Static,
@@ -971,17 +983,17 @@ auto SchemaFrame::analyse(const JSON &schema, const SchemaWalker &walker,
971
983
972
984
if (standalone) {
973
985
// Find all dynamic anchors
974
- std::map<std::string , std::vector<std::string >> dynamic_anchors;
986
+ std::map<JSON::String , std::vector<JSON::String >> dynamic_anchors;
975
987
for (const auto &entry : this ->locations_ ) {
976
988
if (entry.first .first != SchemaReferenceType::Dynamic ||
977
989
entry.second .type != SchemaFrame::LocationType::Anchor) {
978
990
continue ;
979
991
}
980
992
981
993
const URI anchor_uri{entry.first .second };
982
- const std::string fragment{anchor_uri.fragment ().value_or (" " )};
994
+ const JSON::String fragment{anchor_uri.fragment ().value_or (" " )};
983
995
if (!dynamic_anchors.contains (fragment)) {
984
- dynamic_anchors.emplace (fragment, std::vector<std::string >{});
996
+ dynamic_anchors.emplace (fragment, std::vector<JSON::String >{});
985
997
}
986
998
987
999
dynamic_anchors[fragment].push_back (entry.first .second );
@@ -1072,7 +1084,7 @@ auto SchemaFrame::vocabularies(const Location &location,
1072
1084
1073
1085
auto SchemaFrame::uri (const Location &location,
1074
1086
const Pointer &relative_schema_location) const
1075
- -> std::string {
1087
+ -> JSON::String {
1076
1088
return to_uri (location.relative_pointer .concat (relative_schema_location),
1077
1089
location.base )
1078
1090
.recompose ();
@@ -1094,7 +1106,7 @@ auto SchemaFrame::traverse(const Location &location,
1094
1106
return dynamic_match->second ;
1095
1107
}
1096
1108
1097
- auto SchemaFrame::traverse (const std::string &uri) const
1109
+ auto SchemaFrame::traverse (const JSON::String &uri) const
1098
1110
-> std::optional<std::reference_wrapper<const Location>> {
1099
1111
const auto static_result{
1100
1112
this ->locations_ .find ({SchemaReferenceType::Static, uri})};
0 commit comments