Skip to content

Commit cb5392a

Browse files
committed
Add serizalization for absolute location
1 parent 1d94477 commit cb5392a

File tree

3 files changed

+91
-6
lines changed

3 files changed

+91
-6
lines changed
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package io.github.optimumcode.json.schema
2+
3+
import com.eygraber.uri.Uri
4+
import io.github.optimumcode.json.pointer.JsonPointer
5+
import kotlinx.serialization.KSerializer
6+
import kotlinx.serialization.Serializable
7+
import kotlinx.serialization.descriptors.PrimitiveKind
8+
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
9+
import kotlinx.serialization.descriptors.SerialDescriptor
10+
import kotlinx.serialization.encoding.Decoder
11+
import kotlinx.serialization.encoding.Encoder
12+
13+
@Serializable(AbsoluteLocationSerializer::class)
14+
public data class AbsoluteLocation(
15+
val uri: Uri,
16+
val path: JsonPointer,
17+
)
18+
19+
public object AbsoluteLocationSerializer : KSerializer<AbsoluteLocation> {
20+
override val descriptor: SerialDescriptor =
21+
PrimitiveSerialDescriptor(
22+
"com.optimumcode.json.schema.AbsoluteLocation",
23+
PrimitiveKind.STRING,
24+
)
25+
26+
override fun deserialize(decoder: Decoder): AbsoluteLocation {
27+
val uri = Uri.parse(decoder.decodeString())
28+
val fragment = uri.fragment
29+
return AbsoluteLocation(
30+
// if builder is not invoked empty fragment won't be removed
31+
uri = uri.buildUpon().encodedFragment(null).build(),
32+
path = if (fragment.isNullOrEmpty()) JsonPointer.ROOT else JsonPointer(fragment),
33+
)
34+
}
35+
36+
override fun serialize(
37+
encoder: Encoder,
38+
value: AbsoluteLocation,
39+
) {
40+
val result =
41+
value.uri.buildUpon()
42+
.encodedFragment(value.path.toString())
43+
.build().toString()
44+
encoder.encodeString(
45+
if (value.path == JsonPointer.ROOT) {
46+
"$result#"
47+
} else {
48+
result
49+
},
50+
)
51+
}
52+
}

src/commonMain/kotlin/io/github/optimumcode/json/schema/ValidationError.kt

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package io.github.optimumcode.json.schema
22

3-
import com.eygraber.uri.Uri
43
import io.github.optimumcode.json.pointer.JsonPointer
54

65
/**
@@ -27,9 +26,4 @@ public data class ValidationError(
2726
* The absolute path to triggered assertion if the $ref was used
2827
*/
2928
val absoluteLocation: AbsoluteLocation? = null,
30-
)
31-
32-
public data class AbsoluteLocation(
33-
val uri: Uri,
34-
val path: JsonPointer,
3529
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package io.github.optimumcode.json.schema.serialization
2+
3+
import com.eygraber.uri.Uri
4+
import io.github.optimumcode.json.pointer.JsonPointer
5+
import io.github.optimumcode.json.schema.AbsoluteLocation
6+
import io.kotest.core.spec.style.FunSpec
7+
import io.kotest.matchers.shouldBe
8+
import kotlinx.serialization.encodeToString
9+
import kotlinx.serialization.json.Json
10+
11+
class AbsoluteLocationSerializationTest : FunSpec() {
12+
init {
13+
listOf(
14+
AbsoluteLocation(
15+
uri = Uri.EMPTY,
16+
path = JsonPointer.ROOT,
17+
) to "#",
18+
AbsoluteLocation(
19+
uri = Uri.EMPTY,
20+
path = JsonPointer("/test/\$ref"),
21+
) to "#/test/\$ref",
22+
AbsoluteLocation(
23+
uri = Uri.parse("https://test.com"),
24+
path = JsonPointer.ROOT,
25+
) to "https://test.com#",
26+
AbsoluteLocation(
27+
uri = Uri.parse("https://test.com"),
28+
path = JsonPointer("/test/\$ref"),
29+
) to "https://test.com#/test/\$ref",
30+
).forEach { (location, expected) ->
31+
test("absolute location $location serialized") {
32+
Json.encodeToString(location) shouldBe "\"$expected\""
33+
}
34+
test("absolute location $location can be deserialized") {
35+
Json.decodeFromString(AbsoluteLocation.serializer(), "\"$expected\"") shouldBe location
36+
}
37+
}
38+
}
39+
}

0 commit comments

Comments
 (0)