diff --git a/DEPENDENCIES b/DEPENDENCIES index 2b97d74..84b1bfe 100644 --- a/DEPENDENCIES +++ b/DEPENDENCIES @@ -1,7 +1,7 @@ vendorpull https://github.com/sourcemeta/vendorpull dea311b5bfb53b6926a4140267959ae334d3ecf4 noa https://github.com/sourcemeta/noa 924f5cc8549af7f12227869dcbab4259029ac650 jsontoolkit https://github.com/sourcemeta/jsontoolkit 155f7dfe71259a3bd18cf51155ef7d63540df3f5 -blaze https://github.com/sourcemeta/blaze 443261eef6226c034590e330e6327e6ca145d8fa +blaze https://github.com/sourcemeta/blaze a906d6601bc5d7afd4ddb6cbf9f64326aeee1b0c hydra https://github.com/sourcemeta/hydra c31b5b612beb3e6a870deb2581ae437fc5183f47 bootstrap https://github.com/twbs/bootstrap v5.3.3 bootstrap-icons https://github.com/twbs/icons v1.11.3 diff --git a/vendor/blaze/src/compiler/compile.cc b/vendor/blaze/src/compiler/compile.cc index 1c82ff2..a3708b5 100644 --- a/vendor/blaze/src/compiler/compile.cc +++ b/vendor/blaze/src/compiler/compile.cc @@ -46,7 +46,8 @@ auto compile_subschema(const sourcemeta::blaze::Context &context, // TODO: This represents a copy schema_context.labels, schema_context.references}, {keyword, dynamic_context.base_schema_location, - dynamic_context.base_instance_location}, + dynamic_context.base_instance_location, + dynamic_context.property_as_target}, steps)) { // Just a sanity check to ensure every keyword location is indeed valid assert(context.frame.locations().contains( @@ -91,7 +92,7 @@ auto precompile( nested_schema_context, dynamic_context, sourcemeta::blaze::ValueUnsignedInteger{label}, sourcemeta::blaze::compile(context, nested_schema_context, - sourcemeta::blaze::relative_dynamic_context, + sourcemeta::blaze::relative_dynamic_context(), sourcemeta::jsontoolkit::empty_pointer, sourcemeta::jsontoolkit::empty_pointer, entry.first.second))}; @@ -221,7 +222,7 @@ auto compile(const sourcemeta::jsontoolkit::JSON &schema, uses_dynamic_scopes, std::move(unevaluated), std::move(precompiled_static_schemas)}; - const DynamicContext dynamic_context{relative_dynamic_context}; + const DynamicContext dynamic_context{relative_dynamic_context()}; Instructions compiler_template; for (const auto &destination : context.precompiled_static_schemas) { @@ -327,7 +328,8 @@ auto compile(const Context &context, const SchemaContext &schema_context, // TODO: This represents a copy schema_context.labels, schema_context.references}, {dynamic_context.keyword, destination_pointer, - dynamic_context.base_instance_location.concat(instance_suffix)}, + dynamic_context.base_instance_location.concat(instance_suffix), + dynamic_context.property_as_target}, entry.dialect); } diff --git a/vendor/blaze/src/compiler/compile_helpers.h b/vendor/blaze/src/compiler/compile_helpers.h index be63011..8aef465 100644 --- a/vendor/blaze/src/compiler/compile_helpers.h +++ b/vendor/blaze/src/compiler/compile_helpers.h @@ -13,9 +13,22 @@ namespace sourcemeta::blaze { -static const DynamicContext relative_dynamic_context{ - "", sourcemeta::jsontoolkit::empty_pointer, - sourcemeta::jsontoolkit::empty_pointer}; +inline auto relative_dynamic_context() -> DynamicContext { + return {"", sourcemeta::jsontoolkit::empty_pointer, + sourcemeta::jsontoolkit::empty_pointer, false}; +} + +inline auto relative_dynamic_context(const DynamicContext &dynamic_context) + -> DynamicContext { + return {"", sourcemeta::jsontoolkit::empty_pointer, + sourcemeta::jsontoolkit::empty_pointer, + dynamic_context.property_as_target}; +} + +inline auto property_relative_dynamic_context() -> DynamicContext { + return {"", sourcemeta::jsontoolkit::empty_pointer, + sourcemeta::jsontoolkit::empty_pointer, true}; +} inline auto schema_resource_id(const Context &context, const std::string &resource) -> std::size_t { diff --git a/vendor/blaze/src/compiler/default_compiler_2019_09.h b/vendor/blaze/src/compiler/default_compiler_2019_09.h index a4c1710..17c526d 100644 --- a/vendor/blaze/src/compiler/default_compiler_2019_09.h +++ b/vendor/blaze/src/compiler/default_compiler_2019_09.h @@ -39,11 +39,13 @@ auto compiler_2019_09_applicator_dependentschemas( } if (!dependency.is_boolean() || !dependency.to_boolean()) { - children.push_back(make( - sourcemeta::blaze::InstructionIndex::LogicalWhenDefines, context, - schema_context, relative_dynamic_context, make_property(dependent), - compile(context, schema_context, relative_dynamic_context, - {dependent}, sourcemeta::jsontoolkit::empty_pointer))); + children.push_back( + make(sourcemeta::blaze::InstructionIndex::LogicalWhenDefines, context, + schema_context, relative_dynamic_context(dynamic_context), + make_property(dependent), + compile(context, schema_context, + relative_dynamic_context(dynamic_context), {dependent}, + sourcemeta::jsontoolkit::empty_pointer))); } } @@ -149,14 +151,15 @@ auto compiler_2019_09_applicator_contains_with_options( } Instructions children{compile(context, schema_context, - relative_dynamic_context, + relative_dynamic_context(dynamic_context), sourcemeta::jsontoolkit::empty_pointer, sourcemeta::jsontoolkit::empty_pointer)}; if (annotate) { children.push_back( make(sourcemeta::blaze::InstructionIndex::AnnotationBasenameToParent, - context, schema_context, relative_dynamic_context, ValueNone{})); + context, schema_context, relative_dynamic_context(dynamic_context), + ValueNone{})); // TODO: If after emitting the above annotation, the number of annotations // for the current schema location + instance location is equal to the @@ -167,7 +170,8 @@ auto compiler_2019_09_applicator_contains_with_options( if (track_evaluation) { children.push_back( make(sourcemeta::blaze::InstructionIndex::ControlEvaluate, context, - schema_context, relative_dynamic_context, ValuePointer{})); + schema_context, relative_dynamic_context(dynamic_context), + ValuePointer{})); } if (children.empty()) { @@ -274,14 +278,14 @@ auto compiler_2019_09_applicator_unevaluateditems( } Instructions children{compile(context, schema_context, - relative_dynamic_context, + relative_dynamic_context(dynamic_context), sourcemeta::jsontoolkit::empty_pointer, sourcemeta::jsontoolkit::empty_pointer)}; if (context.mode == Mode::Exhaustive) { children.push_back( make(sourcemeta::blaze::InstructionIndex::AnnotationToParent, context, - schema_context, relative_dynamic_context, + schema_context, relative_dynamic_context(dynamic_context), sourcemeta::jsontoolkit::JSON{true})); } @@ -314,14 +318,15 @@ auto compiler_2019_09_applicator_unevaluatedproperties( } Instructions children{compile(context, schema_context, - relative_dynamic_context, + relative_dynamic_context(dynamic_context), sourcemeta::jsontoolkit::empty_pointer, sourcemeta::jsontoolkit::empty_pointer)}; if (context.mode == Mode::Exhaustive) { children.push_back( make(sourcemeta::blaze::InstructionIndex::AnnotationBasenameToParent, - context, schema_context, relative_dynamic_context, ValueNone{})); + context, schema_context, relative_dynamic_context(dynamic_context), + ValueNone{})); } ValueStringSet filter_strings; diff --git a/vendor/blaze/src/compiler/default_compiler_draft4.h b/vendor/blaze/src/compiler/default_compiler_draft4.h index 01380b1..834589f 100644 --- a/vendor/blaze/src/compiler/default_compiler_draft4.h +++ b/vendor/blaze/src/compiler/default_compiler_draft4.h @@ -223,21 +223,21 @@ auto compiler_draft4_core_ref(const Context &context, sourcemeta::jsontoolkit::empty_pointer, reference.destination); } else { - return { - make(sourcemeta::blaze::InstructionIndex::LogicalAnd, context, - schema_context, dynamic_context, ValueNone{}, - compile(context, new_schema_context, relative_dynamic_context, - sourcemeta::jsontoolkit::empty_pointer, - sourcemeta::jsontoolkit::empty_pointer, - reference.destination))}; + return {make(sourcemeta::blaze::InstructionIndex::LogicalAnd, context, + schema_context, dynamic_context, ValueNone{}, + compile(context, new_schema_context, + relative_dynamic_context(dynamic_context), + sourcemeta::jsontoolkit::empty_pointer, + sourcemeta::jsontoolkit::empty_pointer, + reference.destination))}; } } new_schema_context.labels.insert(label); - Instructions children{ - compile(context, new_schema_context, relative_dynamic_context, - sourcemeta::jsontoolkit::empty_pointer, - sourcemeta::jsontoolkit::empty_pointer, reference.destination)}; + Instructions children{compile( + context, new_schema_context, relative_dynamic_context(dynamic_context), + sourcemeta::jsontoolkit::empty_pointer, + sourcemeta::jsontoolkit::empty_pointer, reference.destination)}; // If we ended up not using the label after all, then we can ignore the // wrapper, at the expense of compiling the reference instructions once more @@ -545,7 +545,7 @@ auto compiler_draft4_validation_required(const Context &context, schema_context.references}; const DynamicContext new_dynamic_context{ "properties", sourcemeta::jsontoolkit::empty_pointer, - sourcemeta::jsontoolkit::empty_pointer}; + sourcemeta::jsontoolkit::empty_pointer, false}; auto properties{compile_properties(context, new_schema_context, new_dynamic_context, current)}; if (std::all_of(properties.cbegin(), properties.cend(), @@ -632,7 +632,8 @@ auto compiler_draft4_applicator_allof(const Context &context, index < schema_context.schema.at(dynamic_context.keyword).size(); index++) { for (auto &&step : - compile(context, schema_context, relative_dynamic_context, + compile(context, schema_context, + relative_dynamic_context(dynamic_context), {static_cast( index)})) { children.push_back(std::move(step)); @@ -658,8 +659,9 @@ auto compiler_draft4_applicator_anyof(const Context &context, index++) { disjunctors.push_back(make( sourcemeta::blaze::InstructionIndex::ControlGroup, context, - schema_context, relative_dynamic_context, ValueNone{}, - compile(context, schema_context, relative_dynamic_context, + schema_context, relative_dynamic_context(dynamic_context), ValueNone{}, + compile(context, schema_context, + relative_dynamic_context(dynamic_context), {static_cast( index)}))); } @@ -726,8 +728,9 @@ auto compiler_draft4_applicator_oneof(const Context &context, index++) { disjunctors.push_back(make( sourcemeta::blaze::InstructionIndex::ControlGroup, context, - schema_context, relative_dynamic_context, ValueNone{}, - compile(context, schema_context, relative_dynamic_context, + schema_context, relative_dynamic_context(dynamic_context), ValueNone{}, + compile(context, schema_context, + relative_dynamic_context(dynamic_context), {static_cast( index)}))); } @@ -854,25 +857,28 @@ auto compiler_draft4_applicator_properties_with_options( std::size_t cursor = 0; for (auto &&[name, substeps] : compile_properties( - context, schema_context, relative_dynamic_context, current)) { + context, schema_context, relative_dynamic_context(dynamic_context), + current)) { indexes.assign(name, cursor); if (track_evaluation) { substeps.push_back( make(sourcemeta::blaze::InstructionIndex::ControlEvaluate, context, - schema_context, relative_dynamic_context, ValuePointer{name})); + schema_context, relative_dynamic_context(dynamic_context), + ValuePointer{name})); } if (annotate) { substeps.push_back( make(sourcemeta::blaze::InstructionIndex::AnnotationEmit, context, - schema_context, relative_dynamic_context, + schema_context, relative_dynamic_context(dynamic_context), sourcemeta::jsontoolkit::JSON{name})); } // Note that the evaluator completely ignores this wrapper anyway children.push_back(make(sourcemeta::blaze::InstructionIndex::ControlGroup, - context, schema_context, relative_dynamic_context, + context, schema_context, + relative_dynamic_context(dynamic_context), ValueNone{}, std::move(substeps))); cursor += 1; } @@ -895,9 +901,10 @@ auto compiler_draft4_applicator_properties_with_options( Instructions children; - const auto effective_dynamic_context{context.mode == Mode::FastValidation - ? dynamic_context - : relative_dynamic_context}; + const auto effective_dynamic_context{ + context.mode == Mode::FastValidation + ? dynamic_context + : relative_dynamic_context(dynamic_context)}; const auto assume_object{schema_context.schema.defines("type") && schema_context.schema.at("type").is_string() && @@ -1148,19 +1155,22 @@ auto compiler_draft4_applicator_patternproperties_with_options( // For each regular expression and corresponding subschema in the object for (const auto &pattern : patterns) { - auto substeps{compile(context, schema_context, relative_dynamic_context, - {pattern}, {})}; + auto substeps{compile(context, schema_context, + relative_dynamic_context(dynamic_context), {pattern}, + {})}; if (annotate) { substeps.push_back( make(sourcemeta::blaze::InstructionIndex::AnnotationBasenameToParent, - context, schema_context, relative_dynamic_context, ValueNone{})); + context, schema_context, + relative_dynamic_context(dynamic_context), ValueNone{})); } if (track_evaluation) { substeps.push_back( make(sourcemeta::blaze::InstructionIndex::ControlEvaluate, context, - schema_context, relative_dynamic_context, ValuePointer{})); + schema_context, relative_dynamic_context(dynamic_context), + ValuePointer{})); } if (context.mode == Mode::FastValidation && !track_evaluation && @@ -1219,14 +1229,15 @@ auto compiler_draft4_applicator_additionalproperties_with_options( } Instructions children{compile(context, schema_context, - relative_dynamic_context, + relative_dynamic_context(dynamic_context), sourcemeta::jsontoolkit::empty_pointer, sourcemeta::jsontoolkit::empty_pointer)}; if (annotate) { children.push_back( make(sourcemeta::blaze::InstructionIndex::AnnotationBasenameToParent, - context, schema_context, relative_dynamic_context, ValueNone{})); + context, schema_context, relative_dynamic_context(dynamic_context), + ValueNone{})); } ValueStringSet filter_strings; @@ -1291,7 +1302,8 @@ auto compiler_draft4_applicator_additionalproperties_with_options( if (track_evaluation) { children.push_back( make(sourcemeta::blaze::InstructionIndex::ControlEvaluate, context, - schema_context, relative_dynamic_context, ValuePointer{})); + schema_context, relative_dynamic_context(dynamic_context), + ValuePointer{})); } return {make(sourcemeta::blaze::InstructionIndex::LoopPropertiesExcept, @@ -1452,7 +1464,7 @@ auto compiler_draft4_applicator_not(const Context &context, } Instructions children{compile(context, schema_context, - relative_dynamic_context, + relative_dynamic_context(dynamic_context), sourcemeta::jsontoolkit::empty_pointer, sourcemeta::jsontoolkit::empty_pointer)}; @@ -1504,8 +1516,8 @@ auto compiler_draft4_applicator_items_array( schema_context.schema.at(dynamic_context.keyword).as_array()}; for (auto iterator{array.cbegin()}; iterator != array.cend(); ++iterator) { subschemas.push_back(compile(context, schema_context, - relative_dynamic_context, {subschemas.size()}, - {subschemas.size()})); + relative_dynamic_context(dynamic_context), + {subschemas.size()}, {subschemas.size()})); } Instructions children; @@ -1520,12 +1532,13 @@ auto compiler_draft4_applicator_items_array( if (annotate) { subchildren.push_back( make(sourcemeta::blaze::InstructionIndex::AnnotationEmit, context, - schema_context, relative_dynamic_context, + schema_context, relative_dynamic_context(dynamic_context), sourcemeta::jsontoolkit::JSON{cursor})); } children.push_back(make(sourcemeta::blaze::InstructionIndex::ControlGroup, - context, schema_context, relative_dynamic_context, + context, schema_context, + relative_dynamic_context(dynamic_context), ValueNone{}, std::move(subchildren))); } @@ -1538,15 +1551,18 @@ auto compiler_draft4_applicator_items_array( if (annotate) { tail.push_back(make(sourcemeta::blaze::InstructionIndex::AnnotationEmit, - context, schema_context, relative_dynamic_context, + context, schema_context, + relative_dynamic_context(dynamic_context), sourcemeta::jsontoolkit::JSON{children.size() - 1})); tail.push_back(make(sourcemeta::blaze::InstructionIndex::AnnotationEmit, - context, schema_context, relative_dynamic_context, + context, schema_context, + relative_dynamic_context(dynamic_context), sourcemeta::jsontoolkit::JSON{true})); } children.push_back(make(sourcemeta::blaze::InstructionIndex::ControlGroup, - context, schema_context, relative_dynamic_context, + context, schema_context, + relative_dynamic_context(dynamic_context), ValueNone{}, std::move(tail))); if (track_evaluation) { @@ -1573,10 +1589,10 @@ auto compiler_draft4_applicator_items_with_options( if (is_schema(schema_context.schema.at(dynamic_context.keyword))) { if (annotate || track_evaluation) { - Instructions subchildren{compile(context, schema_context, - relative_dynamic_context, - sourcemeta::jsontoolkit::empty_pointer, - sourcemeta::jsontoolkit::empty_pointer)}; + Instructions subchildren{compile( + context, schema_context, relative_dynamic_context(dynamic_context), + sourcemeta::jsontoolkit::empty_pointer, + sourcemeta::jsontoolkit::empty_pointer)}; Instructions children; @@ -1594,14 +1610,16 @@ auto compiler_draft4_applicator_items_with_options( if (annotate) { tail.push_back(make(sourcemeta::blaze::InstructionIndex::AnnotationEmit, - context, schema_context, relative_dynamic_context, + context, schema_context, + relative_dynamic_context(dynamic_context), sourcemeta::jsontoolkit::JSON{true})); } if (track_evaluation) { tail.push_back( make(sourcemeta::blaze::InstructionIndex::ControlEvaluate, context, - schema_context, relative_dynamic_context, ValuePointer{})); + schema_context, relative_dynamic_context(dynamic_context), + ValuePointer{})); } children.push_back( @@ -1613,13 +1631,14 @@ auto compiler_draft4_applicator_items_with_options( } Instructions children{compile(context, schema_context, - relative_dynamic_context, + relative_dynamic_context(dynamic_context), sourcemeta::jsontoolkit::empty_pointer, sourcemeta::jsontoolkit::empty_pointer)}; if (track_evaluation) { children.push_back( make(sourcemeta::blaze::InstructionIndex::ControlEvaluate, context, - schema_context, relative_dynamic_context, ValuePointer{})); + schema_context, relative_dynamic_context(dynamic_context), + ValuePointer{})); } if (children.empty()) { @@ -1685,7 +1704,7 @@ auto compiler_draft4_applicator_additionalitems_from_cursor( } Instructions subchildren{compile(context, schema_context, - relative_dynamic_context, + relative_dynamic_context(dynamic_context), sourcemeta::jsontoolkit::empty_pointer, sourcemeta::jsontoolkit::empty_pointer)}; @@ -1707,13 +1726,15 @@ auto compiler_draft4_applicator_additionalitems_from_cursor( if (annotate) { tail.push_back(make(sourcemeta::blaze::InstructionIndex::AnnotationEmit, - context, schema_context, relative_dynamic_context, + context, schema_context, + relative_dynamic_context(dynamic_context), sourcemeta::jsontoolkit::JSON{true})); } if (track_evaluation) { tail.push_back(make(sourcemeta::blaze::InstructionIndex::ControlEvaluate, - context, schema_context, relative_dynamic_context, + context, schema_context, + relative_dynamic_context(dynamic_context), ValuePointer{})); } @@ -1783,8 +1804,9 @@ auto compiler_draft4_applicator_dependencies( children.push_back(make( sourcemeta::blaze::InstructionIndex::LogicalWhenDefines, context, schema_context, dynamic_context, make_property(entry.first), - compile(context, schema_context, relative_dynamic_context, - {entry.first}, sourcemeta::jsontoolkit::empty_pointer))); + compile(context, schema_context, + relative_dynamic_context(dynamic_context), {entry.first}, + sourcemeta::jsontoolkit::empty_pointer))); } } else if (entry.second.is_array()) { std::vector properties; diff --git a/vendor/blaze/src/compiler/default_compiler_draft6.h b/vendor/blaze/src/compiler/default_compiler_draft6.h index e9fe5b7..85237a4 100644 --- a/vendor/blaze/src/compiler/default_compiler_draft6.h +++ b/vendor/blaze/src/compiler/default_compiler_draft6.h @@ -189,6 +189,10 @@ auto compiler_draft6_validation_type(const Context &context, schema_context, dynamic_context, sourcemeta::jsontoolkit::JSON::Type::Integer)}; } else if (type == "string") { + if (dynamic_context.property_as_target) { + return {}; + } + const auto minimum{ unsigned_integer_property(schema_context.schema, "minLength", 0)}; const auto maximum{ @@ -263,6 +267,10 @@ auto compiler_draft6_validation_type(const Context &context, schema_context, dynamic_context, sourcemeta::jsontoolkit::JSON::Type::Integer)}; } else if (type == "string") { + if (dynamic_context.property_as_target) { + return {}; + } + return {make(sourcemeta::blaze::InstructionIndex::AssertionTypeStrict, context, schema_context, dynamic_context, sourcemeta::jsontoolkit::JSON::Type::String)}; @@ -289,6 +297,10 @@ auto compiler_draft6_validation_type(const Context &context, } else if (type_string == "integer") { types.push_back(sourcemeta::jsontoolkit::JSON::Type::Integer); } else if (type_string == "string") { + if (dynamic_context.property_as_target) { + continue; + } + types.push_back(sourcemeta::jsontoolkit::JSON::Type::String); } } @@ -361,7 +373,7 @@ auto compiler_draft6_applicator_contains(const Context &context, } Instructions children{compile(context, schema_context, - relative_dynamic_context, + relative_dynamic_context(dynamic_context), sourcemeta::jsontoolkit::empty_pointer, sourcemeta::jsontoolkit::empty_pointer)}; @@ -388,7 +400,7 @@ auto compiler_draft6_validation_propertynames( } Instructions children{compile(context, schema_context, - relative_dynamic_context, + property_relative_dynamic_context(), sourcemeta::jsontoolkit::empty_pointer, sourcemeta::jsontoolkit::empty_pointer)}; diff --git a/vendor/blaze/src/compiler/default_compiler_draft7.h b/vendor/blaze/src/compiler/default_compiler_draft7.h index bcc605b..923730a 100644 --- a/vendor/blaze/src/compiler/default_compiler_draft7.h +++ b/vendor/blaze/src/compiler/default_compiler_draft7.h @@ -15,7 +15,7 @@ auto compiler_draft7_applicator_if(const Context &context, const Instructions &) -> Instructions { // `if` Instructions children{compile(context, schema_context, - relative_dynamic_context, + relative_dynamic_context(dynamic_context), sourcemeta::jsontoolkit::empty_pointer, sourcemeta::jsontoolkit::empty_pointer)}; @@ -31,7 +31,8 @@ auto compiler_draft7_applicator_if(const Context &context, {sourcemeta::jsontoolkit::ReferenceType::Static, destination})); DynamicContext new_dynamic_context{"then", dynamic_context.base_schema_location, - sourcemeta::jsontoolkit::empty_pointer}; + sourcemeta::jsontoolkit::empty_pointer, + dynamic_context.property_as_target}; for (auto &&step : compile(context, schema_context, new_dynamic_context, sourcemeta::jsontoolkit::empty_pointer, @@ -57,7 +58,8 @@ auto compiler_draft7_applicator_if(const Context &context, {sourcemeta::jsontoolkit::ReferenceType::Static, destination})); DynamicContext new_dynamic_context{"else", dynamic_context.base_schema_location, - sourcemeta::jsontoolkit::empty_pointer}; + sourcemeta::jsontoolkit::empty_pointer, + dynamic_context.property_as_target}; for (auto &&step : compile(context, schema_context, new_dynamic_context, sourcemeta::jsontoolkit::empty_pointer, diff --git a/vendor/blaze/src/compiler/include/sourcemeta/blaze/compiler.h b/vendor/blaze/src/compiler/include/sourcemeta/blaze/compiler.h index fb8d4f3..49ba3e0 100644 --- a/vendor/blaze/src/compiler/include/sourcemeta/blaze/compiler.h +++ b/vendor/blaze/src/compiler/include/sourcemeta/blaze/compiler.h @@ -52,11 +52,13 @@ struct SchemaContext { /// disposal to implement a keyword struct DynamicContext { /// The schema keyword - const std::string &keyword; + const std::string keyword; /// The schema base keyword path const sourcemeta::jsontoolkit::Pointer &base_schema_location; /// The base instance location that the keyword must be evaluated to const sourcemeta::jsontoolkit::Pointer &base_instance_location; + /// Whether the instance location property acts as the target + const bool property_as_target; }; #if !defined(DOXYGEN)