@@ -5,24 +5,36 @@ import io.github.optimumcode.json.pointer.JsonPointer
5
5
import io.github.optimumcode.json.pointer.internal.length
6
6
7
7
internal interface ReferenceResolver {
8
- fun ref (refId : RefId ): Pair < JsonPointer , JsonSchemaAssertion >
8
+ fun ref (refId : RefId ): ReferenceHolder
9
9
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
11
23
}
12
24
13
25
internal class DefaultReferenceResolver (
14
26
private val references : Map <RefId , AssertionWithPath >,
15
27
private val schemaPathsStack : ArrayDeque <Pair <JsonPointer , Uri >> = ArrayDeque (),
16
28
) : ReferenceResolver {
17
- override fun ref (refId : RefId ): Pair < JsonPointer , JsonSchemaAssertion > {
29
+ override fun ref (refId : RefId ): ReferenceHolder {
18
30
val resolvedRef = requireNotNull(references[refId]) { " $refId is not found" }
19
- return resolvedRef.schemaPath to resolvedRef.assertion
31
+ return resolvedRef.toRefHolder()
20
32
}
21
33
22
- override fun dynamicRef (refId : RefId ): Pair < JsonPointer , JsonSchemaAssertion > {
34
+ override fun dynamicRef (refId : RefId ): ReferenceHolder {
23
35
val originalRef = requireNotNull(references[refId]) { " $refId is not found" }
24
36
if (! originalRef.dynamic ) {
25
- return originalRef.schemaPath to originalRef.assertion
37
+ return originalRef.toRefHolder()
26
38
}
27
39
28
40
val fragment = refId.fragment
@@ -39,7 +51,7 @@ internal class DefaultReferenceResolver(
39
51
}
40
52
// If no outer anchor found use the original ref
41
53
? : originalRef
42
- return resolvedDynamicRef.schemaPath to resolvedDynamicRef.assertion
54
+ return resolvedDynamicRef.toRefHolder()
43
55
}
44
56
45
57
fun pushSchemaPath (
@@ -52,4 +64,11 @@ internal class DefaultReferenceResolver(
52
64
fun popSchemaPath () {
53
65
schemaPathsStack.removeLast()
54
66
}
67
+
68
+ private fun AssertionWithPath.toRefHolder (): ReferenceHolder =
69
+ ReferenceHolder (
70
+ schemaPath = schemaPath,
71
+ assertion = assertion,
72
+ scopeId = scopeId,
73
+ )
55
74
}
0 commit comments