@@ -14,13 +14,22 @@ import dev.restate.sdk.common.Serde
1414import dev.restate.sdk.common.StateKey
1515import io.bkbn.kompendium.json.schema.KotlinXSchemaConfigurator
1616import io.bkbn.kompendium.json.schema.SchemaGenerator
17+ import io.bkbn.kompendium.json.schema.definition.AnyOfDefinition
18+ import io.bkbn.kompendium.json.schema.definition.ArrayDefinition
1719import io.bkbn.kompendium.json.schema.definition.JsonSchema
20+ import io.bkbn.kompendium.json.schema.definition.MapDefinition
21+ import io.bkbn.kompendium.json.schema.definition.OneOfDefinition
22+ import io.bkbn.kompendium.json.schema.definition.ReferenceDefinition
23+ import io.bkbn.kompendium.json.schema.definition.TypeDefinition
1824import java.nio.ByteBuffer
1925import java.nio.charset.StandardCharsets
2026import kotlin.reflect.typeOf
2127import kotlinx.serialization.KSerializer
28+ import kotlinx.serialization.encodeToString
2229import kotlinx.serialization.json.Json
2330import kotlinx.serialization.json.JsonNull
31+ import kotlinx.serialization.json.encodeToJsonElement
32+ import kotlinx.serialization.json.jsonObject
2433import kotlinx.serialization.serializer
2534
2635object KtStateKey {
@@ -93,14 +102,36 @@ object KtSerdes {
93102 }
94103
95104 override fun jsonSchema (): String {
96- val schema =
105+ fun JsonSchema.sanitizeRefs (): JsonSchema {
106+ return when (this ) {
107+ is AnyOfDefinition -> this .copy(anyOf = this .anyOf.map { it.sanitizeRefs() }.toSet())
108+ is ArrayDefinition -> this .items.sanitizeRefs()
109+ is MapDefinition ->
110+ this .copy(additionalProperties = this .additionalProperties.sanitizeRefs())
111+ is OneOfDefinition -> this .copy(oneOf = this .oneOf.map { it.sanitizeRefs() }.toSet())
112+ is ReferenceDefinition ->
113+ this .copy(`$ref` = this .`$ref`.replaceFirst(" #/components/schemas" , " #/\$ defs" ))
114+ is TypeDefinition ->
115+ this .copy(properties = this .properties?.mapValues { it.value.sanitizeRefs() })
116+ else -> this
117+ }
118+ }
119+
120+ val nestedSchemas = mutableMapOf<String , JsonSchema >()
121+ val rootSchema =
97122 SchemaGenerator .fromTypeToSchema(
98123 type = typeOf<T >(),
99- cache = mutableMapOf () ,
124+ cache = nestedSchemas ,
100125 schemaConfigurator = KotlinXSchemaConfigurator (),
101126 )
102127
103- return Json .encodeToString(JsonSchema .serializer(), schema)
128+ val defsSchemas: Map <String , JsonSchema > =
129+ nestedSchemas.mapValues { e -> e.value.sanitizeRefs() }
130+ val rootElement =
131+ Json .encodeToJsonElement(JsonSchema .serializer(), rootSchema.sanitizeRefs())
132+ .jsonObject + (" \$ defs" to Json .encodeToJsonElement(defsSchemas))
133+
134+ return Json .encodeToString(rootElement)
104135 }
105136 }
106137 }
0 commit comments