Skip to content

Commit f174ad6

Browse files
committed
fix(codegen): use unicode codepoints as length
1 parent 328b08e commit f174ad6

File tree

5 files changed

+16
-16
lines changed

5 files changed

+16
-16
lines changed

codegen/src/main/kotlin/tools/samt/codegen/kotlin/ktor/KotlinKtorGeneratorUtilities.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -225,12 +225,12 @@ private fun validateLiteralConstraintsSuffix(typeReference: TypeReference): Stri
225225
}
226226
}
227227
typeReference.sizeConstraint?.let { constraint ->
228-
val property = if (typeReference.type is StringType) "length" else "size"
228+
val accessor = if (typeReference.type is StringType) "codePointCount(0, it.length)" else "size"
229229
constraint.lowerBound?.let {
230-
add("it.${property} >= ${constraint.lowerBound}")
230+
add("it.${accessor} >= ${constraint.lowerBound}")
231231
}
232232
constraint.upperBound?.let {
233-
add("it.${property} <= ${constraint.upperBound}")
233+
add("it.${accessor} <= ${constraint.upperBound}")
234234
}
235235
}
236236
typeReference.patternConstraint?.let { constraint ->

codegen/src/test/resources/generator-test-model/out/ktor-client/tools/samt/client/generated/consumer/Consumer.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ class GreeterEndpointImpl(private val baseUrl: String) : tools.samt.client.gener
6464
appendPathSegments("all", encodeSlash = true)
6565

6666
// Encode query parameters
67-
this.parameters.append("names", (JsonArray(names.map { it?.let { it -> JsonPrimitive(it.also { require(it.length >= 1 && it.length <= 50) }) } ?: JsonNull })).toString())
67+
this.parameters.append("names", (JsonArray(names.map { it?.let { it -> JsonPrimitive(it.also { require(it.codePointCount(0, it.length) >= 1 && it.codePointCount(0, it.length) <= 50) }) } ?: JsonNull })).toString())
6868
}
6969
contentType(ContentType.Application.Json)
7070
this.method = HttpMethod.Get
@@ -101,7 +101,7 @@ class GreeterEndpointImpl(private val baseUrl: String) : tools.samt.client.gener
101101
val bodyAsText = `client response`.bodyAsText()
102102
val jsonElement = Json.parseToJsonElement(bodyAsText)
103103

104-
jsonElement.jsonPrimitive.content.also { require(it.length >= 1 && it.length <= 100) }
104+
jsonElement.jsonPrimitive.content.also { require(it.codePointCount(0, it.length) >= 1 && it.codePointCount(0, it.length) <= 100) }
105105
}
106106

107107
override fun allTheTypes(long: Long, float: Float, double: Double, decimal: java.math.BigDecimal, boolean: Boolean, date: java.time.LocalDate, dateTime: java.time.LocalDateTime, duration: java.time.Duration): Unit = runBlocking {

codegen/src/test/resources/generator-test-model/out/ktor-client/tools/samt/client/generated/greeter/KtorMappings.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ fun `encode Greeting`(record: tools.samt.client.generated.greeter.Greeting): Jso
1515
// Encode field message
1616
val `field message` = run {
1717
val value = record.message
18-
JsonPrimitive(value.also { require(it.length <= 128) })
18+
JsonPrimitive(value.also { require(it.codePointCount(0, it.length) <= 128) })
1919
}
2020
// Create JSON for tools.samt.greeter.Greeting
2121
return buildJsonObject {
@@ -27,7 +27,7 @@ fun `decode Greeting`(json: JsonElement): tools.samt.client.generated.greeter.Gr
2727
// Decode field message
2828
val `field message` = run {
2929
val jsonElement = json.jsonObject["message"]!!
30-
jsonElement.jsonPrimitive.content.also { require(it.length <= 128) }
30+
jsonElement.jsonPrimitive.content.also { require(it.codePointCount(0, it.length) <= 128) }
3131
}
3232
// Create record tools.samt.greeter.Greeting
3333
return tools.samt.client.generated.greeter.Greeting(
@@ -103,10 +103,10 @@ fun `decode GreetingType`(json: JsonElement): tools.samt.client.generated.greete
103103

104104
/** Encode alias tools.samt.greeter.ID to JSON */
105105
fun `encode ID`(value: tools.samt.client.generated.greeter.ID): JsonElement =
106-
value?.let { value -> JsonPrimitive(value.also { require(it.length >= 1 && it.length <= 50) }) } ?: JsonNull
106+
value?.let { value -> JsonPrimitive(value.also { require(it.codePointCount(0, it.length) >= 1 && it.codePointCount(0, it.length) <= 50) }) } ?: JsonNull
107107
/** Decode alias tools.samt.greeter.ID from JSON */
108108
fun `decode ID`(json: JsonElement): String? {
109109
if (json is JsonNull) return null
110-
return json.jsonPrimitive.content.also { require(it.length >= 1 && it.length <= 50) }
110+
return json.jsonPrimitive.content.also { require(it.codePointCount(0, it.length) >= 1 && it.codePointCount(0, it.length) <= 50) }
111111
}
112112

codegen/src/test/resources/generator-test-model/out/ktor-server/tools/samt/server/generated/greeter/GreeterEndpoint.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ fun Routing.routeGreeterEndpoint(
4545
val `parameter name` = run {
4646
// Read from path
4747
val jsonElement = call.parameters["name"]!!.toJson()
48-
jsonElement.jsonPrimitive.content.also { require(it.length >= 1 && it.length <= 50) }
48+
jsonElement.jsonPrimitive.content.also { require(it.codePointCount(0, it.length) >= 1 && it.codePointCount(0, it.length) <= 50) }
4949
}
5050

5151
// Decode parameter type
@@ -75,7 +75,7 @@ fun Routing.routeGreeterEndpoint(
7575
val `parameter names` = run {
7676
// Read from queryParameter
7777
val jsonElement = call.request.queryParameters["names"]!!.toJson()
78-
jsonElement.jsonArray.map { it.takeUnless { it is JsonNull }?.let { it.jsonPrimitive.content.also { require(it.length >= 1 && it.length <= 50) } } }
78+
jsonElement.jsonArray.map { it.takeUnless { it is JsonNull }?.let { it.jsonPrimitive.content.also { require(it.codePointCount(0, it.length) >= 1 && it.codePointCount(0, it.length) <= 50) } } }
7979
}
8080

8181
// Call user provided implementation
@@ -105,7 +105,7 @@ fun Routing.routeGreeterEndpoint(
105105
val value = greeter.greeting(`parameter who`)
106106

107107
// Encode response
108-
val response = JsonPrimitive(value.also { require(it.length >= 1 && it.length <= 100) })
108+
val response = JsonPrimitive(value.also { require(it.codePointCount(0, it.length) >= 1 && it.codePointCount(0, it.length) <= 100) })
109109

110110
// Return response with 200 OK
111111
call.respond(HttpStatusCode.OK, response)

codegen/src/test/resources/generator-test-model/out/ktor-server/tools/samt/server/generated/greeter/KtorMappings.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ fun `encode Greeting`(record: tools.samt.server.generated.greeter.Greeting): Jso
1515
// Encode field message
1616
val `field message` = run {
1717
val value = record.message
18-
JsonPrimitive(value.also { require(it.length <= 128) })
18+
JsonPrimitive(value.also { require(it.codePointCount(0, it.length) <= 128) })
1919
}
2020
// Create JSON for tools.samt.greeter.Greeting
2121
return buildJsonObject {
@@ -27,7 +27,7 @@ fun `decode Greeting`(json: JsonElement): tools.samt.server.generated.greeter.Gr
2727
// Decode field message
2828
val `field message` = run {
2929
val jsonElement = json.jsonObject["message"]!!
30-
jsonElement.jsonPrimitive.content.also { require(it.length <= 128) }
30+
jsonElement.jsonPrimitive.content.also { require(it.codePointCount(0, it.length) <= 128) }
3131
}
3232
// Create record tools.samt.greeter.Greeting
3333
return tools.samt.server.generated.greeter.Greeting(
@@ -103,10 +103,10 @@ fun `decode GreetingType`(json: JsonElement): tools.samt.server.generated.greete
103103

104104
/** Encode alias tools.samt.greeter.ID to JSON */
105105
fun `encode ID`(value: tools.samt.server.generated.greeter.ID): JsonElement =
106-
value?.let { value -> JsonPrimitive(value.also { require(it.length >= 1 && it.length <= 50) }) } ?: JsonNull
106+
value?.let { value -> JsonPrimitive(value.also { require(it.codePointCount(0, it.length) >= 1 && it.codePointCount(0, it.length) <= 50) }) } ?: JsonNull
107107
/** Decode alias tools.samt.greeter.ID from JSON */
108108
fun `decode ID`(json: JsonElement): String? {
109109
if (json is JsonNull) return null
110-
return json.jsonPrimitive.content.also { require(it.length >= 1 && it.length <= 50) }
110+
return json.jsonPrimitive.content.also { require(it.codePointCount(0, it.length) >= 1 && it.codePointCount(0, it.length) <= 50) }
111111
}
112112

0 commit comments

Comments
 (0)