Skip to content

Commit 5a2ae7a

Browse files
committed
Add information about schema uri for reference
1 parent ef9907a commit 5a2ae7a

File tree

3 files changed

+29
-10
lines changed

3 files changed

+29
-10
lines changed

src/commonMain/kotlin/io/github/optimumcode/json/schema/internal/RecursiveRefSchemaAssertion.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ internal class RecursiveRefSchemaAssertion(
1616
errorCollector: ErrorCollector,
1717
): Boolean {
1818
return context.getRecursiveRoot()?.validate(element, context, errorCollector) ?: run {
19-
val (refIdPath, refAssertion) = context.referenceResolver.dynamicRef(refId)
19+
val (refIdPath, refAssertion, _) = context.referenceResolver.dynamicRef(refId)
2020
refAssertion.validate(element, context) {
2121
errorCollector.onError(
2222
it.copy(

src/commonMain/kotlin/io/github/optimumcode/json/schema/internal/RefSchemaAssertion.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ internal class RefSchemaAssertion(
2020
): Boolean {
2121
if (!::refAssertion.isInitialized) {
2222
val resolved = context.referenceResolver.ref(refId)
23-
refIdPath = resolved.first
24-
refAssertion = resolved.second
23+
refIdPath = resolved.schemaPath
24+
refAssertion = resolved.assertion
2525
}
2626
return refAssertion.validate(element, context) {
2727
errorCollector.onError(

src/commonMain/kotlin/io/github/optimumcode/json/schema/internal/ReferenceResolver.kt

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,36 @@ import io.github.optimumcode.json.pointer.JsonPointer
55
import io.github.optimumcode.json.pointer.internal.length
66

77
internal interface ReferenceResolver {
8-
fun ref(refId: RefId): Pair<JsonPointer, JsonSchemaAssertion>
8+
fun ref(refId: RefId): ReferenceHolder
99

10-
fun dynamicRef(refId: RefId): Pair<JsonPointer, JsonSchemaAssertion>
10+
fun dynamicRef(refId: RefId): ReferenceHolder
11+
}
12+
13+
internal class ReferenceHolder(
14+
val schemaPath: JsonPointer,
15+
val assertion: JsonSchemaAssertion,
16+
val scopeId: Uri,
17+
) {
18+
operator fun component1(): JsonPointer = schemaPath
19+
20+
operator fun component2(): JsonSchemaAssertion = assertion
21+
22+
operator fun component3(): Uri = scopeId
1123
}
1224

1325
internal class DefaultReferenceResolver(
1426
private val references: Map<RefId, AssertionWithPath>,
1527
private val schemaPathsStack: ArrayDeque<Pair<JsonPointer, Uri>> = ArrayDeque(),
1628
) : ReferenceResolver {
17-
override fun ref(refId: RefId): Pair<JsonPointer, JsonSchemaAssertion> {
29+
override fun ref(refId: RefId): ReferenceHolder {
1830
val resolvedRef = requireNotNull(references[refId]) { "$refId is not found" }
19-
return resolvedRef.schemaPath to resolvedRef.assertion
31+
return resolvedRef.toRefHolder()
2032
}
2133

22-
override fun dynamicRef(refId: RefId): Pair<JsonPointer, JsonSchemaAssertion> {
34+
override fun dynamicRef(refId: RefId): ReferenceHolder {
2335
val originalRef = requireNotNull(references[refId]) { "$refId is not found" }
2436
if (!originalRef.dynamic) {
25-
return originalRef.schemaPath to originalRef.assertion
37+
return originalRef.toRefHolder()
2638
}
2739

2840
val fragment = refId.fragment
@@ -39,7 +51,7 @@ internal class DefaultReferenceResolver(
3951
}
4052
// If no outer anchor found use the original ref
4153
?: originalRef
42-
return resolvedDynamicRef.schemaPath to resolvedDynamicRef.assertion
54+
return resolvedDynamicRef.toRefHolder()
4355
}
4456

4557
fun pushSchemaPath(
@@ -52,4 +64,11 @@ internal class DefaultReferenceResolver(
5264
fun popSchemaPath() {
5365
schemaPathsStack.removeLast()
5466
}
67+
68+
private fun AssertionWithPath.toRefHolder(): ReferenceHolder =
69+
ReferenceHolder(
70+
schemaPath = schemaPath,
71+
assertion = assertion,
72+
scopeId = scopeId,
73+
)
5574
}

0 commit comments

Comments
 (0)