|
@@ -1,10 +1,12 @@
|
|
|
#pragma once
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
+#include <ios>
|
|
|
#include <map>
|
|
#include <map>
|
|
|
#include <unordered_set>
|
|
#include <unordered_set>
|
|
|
|
|
|
|
|
#include <jvalidate/compat/enumerate.h>
|
|
#include <jvalidate/compat/enumerate.h>
|
|
|
#include <jvalidate/detail/anchor.h>
|
|
#include <jvalidate/detail/anchor.h>
|
|
|
|
|
+#include <jvalidate/detail/debug.h>
|
|
|
#include <jvalidate/detail/dynamic_reference_context.h>
|
|
#include <jvalidate/detail/dynamic_reference_context.h>
|
|
|
#include <jvalidate/detail/expect.h>
|
|
#include <jvalidate/detail/expect.h>
|
|
|
#include <jvalidate/detail/on_block_exit.h>
|
|
#include <jvalidate/detail/on_block_exit.h>
|
|
@@ -166,6 +168,7 @@ public:
|
|
|
* resolutions from the stack when it exits scope.
|
|
* resolutions from the stack when it exits scope.
|
|
|
*/
|
|
*/
|
|
|
auto dynamic_scope(Reference const & ref) {
|
|
auto dynamic_scope(Reference const & ref) {
|
|
|
|
|
+ JVALIDATE_DEBUG("dynamic_scope " << ref);
|
|
|
URI const uri =
|
|
URI const uri =
|
|
|
ref.pointer().empty() ? ref.uri() : references_.relative_to_nearest_anchor(ref).uri();
|
|
ref.pointer().empty() ? ref.uri() : references_.relative_to_nearest_anchor(ref).uri();
|
|
|
return active_dynamic_anchors_.scope(uri, dynamic_anchors_[uri]);
|
|
return active_dynamic_anchors_.scope(uri, dynamic_anchors_[uri]);
|
|
@@ -228,6 +231,8 @@ public:
|
|
|
*/
|
|
*/
|
|
|
Reference canonicalize(Reference const & ref, Reference const & parent,
|
|
Reference canonicalize(Reference const & ref, Reference const & parent,
|
|
|
inout<bool> dynamic_reference) {
|
|
inout<bool> dynamic_reference) {
|
|
|
|
|
+ JVALIDATE_DEBUG("canonicalize " << ref << ", parent=" << parent);
|
|
|
|
|
+ JVALIDATE_DEBUG_INDENTED_SCOPE();
|
|
|
URI const uri = [this, &ref, &parent]() {
|
|
URI const uri = [this, &ref, &parent]() {
|
|
|
// If there are no URIs involed (root schema does not set "$id")
|
|
// If there are no URIs involed (root schema does not set "$id")
|
|
|
// then we don't need to do anything clever
|
|
// then we don't need to do anything clever
|
|
@@ -298,6 +303,8 @@ private:
|
|
|
*/
|
|
*/
|
|
|
std::optional<Reference> dynamic(URI const & uri, Reference const & ref,
|
|
std::optional<Reference> dynamic(URI const & uri, Reference const & ref,
|
|
|
inout<bool> dynamic_reference) {
|
|
inout<bool> dynamic_reference) {
|
|
|
|
|
+ JVALIDATE_DEBUG("dynamic " << uri << ", ref=" << ref << ", dynamic=" << std::boolalpha
|
|
|
|
|
+ << dynamic_reference);
|
|
|
bool const anchor_is_dynamic = active_dynamic_anchors_.contains(ref.anchor());
|
|
bool const anchor_is_dynamic = active_dynamic_anchors_.contains(ref.anchor());
|
|
|
if (not dynamic_reference) {
|
|
if (not dynamic_reference) {
|
|
|
// A normal $ref to an $anchor that matches a $dynamicAnchor breaks the
|
|
// A normal $ref to an $anchor that matches a $dynamicAnchor breaks the
|
|
@@ -433,6 +440,7 @@ private:
|
|
|
|
|
|
|
|
if (Reference & dynamic = dynamic_anchors_[root.uri()][anchor];
|
|
if (Reference & dynamic = dynamic_anchors_[root.uri()][anchor];
|
|
|
dynamic == Reference() || where < dynamic) {
|
|
dynamic == Reference() || where < dynamic) {
|
|
|
|
|
+ JVALIDATE_DEBUG("adding $recursiveAnchor " << root.uri() << "#" << anchor << " " << where);
|
|
|
dynamic = where;
|
|
dynamic = where;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -446,6 +454,7 @@ private:
|
|
|
|
|
|
|
|
if (Reference & dynamic = dynamic_anchors_[root.uri()][anchor];
|
|
if (Reference & dynamic = dynamic_anchors_[root.uri()][anchor];
|
|
|
dynamic == Reference() || where < dynamic) {
|
|
dynamic == Reference() || where < dynamic) {
|
|
|
|
|
+ JVALIDATE_DEBUG("adding $dynamicAnchor " << root.uri() << "#" << anchor << " " << where);
|
|
|
dynamic = where;
|
|
dynamic = where;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|