Skip to content

Commit 43bf069

Browse files
committed
feat: add support for string arrays in rules engine parameters
1 parent 3a33466 commit 43bf069

File tree

5 files changed

+37
-1
lines changed

5 files changed

+37
-1
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"id": "f1afb4d6-fa61-4eba-8695-b9a8bc59418a",
3+
"type": "feature",
4+
"description": "Add support for string arrays in rules engine parameters"
5+
}

codegen/smithy-kotlin-codegen/src/main/kotlin/software/amazon/smithy/kotlin/codegen/model/RulesEngineExt.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import software.amazon.smithy.codegen.core.Symbol
88
import software.amazon.smithy.kotlin.codegen.lang.KotlinTypes
99
import software.amazon.smithy.kotlin.codegen.utils.doubleQuote
1010
import software.amazon.smithy.kotlin.codegen.utils.toCamelCase
11+
import software.amazon.smithy.rulesengine.language.evaluation.value.ArrayValue
1112
import software.amazon.smithy.rulesengine.language.evaluation.value.BooleanValue
1213
import software.amazon.smithy.rulesengine.language.evaluation.value.StringValue
1314
import software.amazon.smithy.rulesengine.language.evaluation.value.Value
@@ -32,7 +33,7 @@ fun ParameterType.toSymbol(): Symbol =
3233
when (this) {
3334
ParameterType.STRING -> KotlinTypes.String
3435
ParameterType.BOOLEAN -> KotlinTypes.Boolean
35-
ParameterType.STRING_ARRAY -> KotlinTypes.Collections.MutableList
36+
ParameterType.STRING_ARRAY -> KotlinTypes.Collections.mutableList(KotlinTypes.String)
3637
}.asNullable()
3738

3839
/**
@@ -42,5 +43,8 @@ fun Value.toLiteral(): String =
4243
when (this) {
4344
is StringValue -> value.doubleQuote()
4445
is BooleanValue -> value.toString()
46+
is ArrayValue -> values.joinToString(",", "mutableListOf(", ")") { value ->
47+
value.expectStringValue().value.doubleQuote()
48+
}
4549
else -> throw IllegalArgumentException("unrecognized parameter value type $type")
4650
}

codegen/smithy-kotlin-codegen/src/main/kotlin/software/amazon/smithy/kotlin/codegen/rendering/endpoints/DefaultEndpointProviderTestGenerator.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ import software.amazon.smithy.kotlin.codegen.KotlinSettings
1010
import software.amazon.smithy.kotlin.codegen.core.*
1111
import software.amazon.smithy.kotlin.codegen.model.buildSymbol
1212
import software.amazon.smithy.kotlin.codegen.rendering.protocol.ProtocolGenerator
13+
import software.amazon.smithy.kotlin.codegen.utils.doubleQuote
1314
import software.amazon.smithy.kotlin.codegen.utils.toCamelCase
15+
import software.amazon.smithy.model.node.ArrayNode
1416
import software.amazon.smithy.model.node.BooleanNode
1517
import software.amazon.smithy.model.node.Node
1618
import software.amazon.smithy.model.node.StringNode
@@ -130,6 +132,13 @@ class DefaultEndpointProviderTestGenerator(
130132
when (v) {
131133
is StringNode -> writer.writeInline("#S", v.value)
132134
is BooleanNode -> writer.writeInline("#L", v.value)
135+
is ArrayNode -> {
136+
writer.writeInline(
137+
v.elements.joinToString(",", "mutableListOf(", ")") { element ->
138+
element.expectStringNode().value.doubleQuote()
139+
},
140+
)
141+
}
133142
else -> throw IllegalArgumentException("unexpected test case param value")
134143
}
135144
}

codegen/smithy-kotlin-codegen/src/main/kotlin/software/amazon/smithy/kotlin/codegen/rendering/endpoints/EndpointResolverAdapterGenerator.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import software.amazon.smithy.kotlin.codegen.integration.SectionId
1212
import software.amazon.smithy.kotlin.codegen.model.*
1313
import software.amazon.smithy.kotlin.codegen.model.knowledge.EndpointParameterIndex
1414
import software.amazon.smithy.kotlin.codegen.rendering.protocol.ProtocolGenerator
15+
import software.amazon.smithy.kotlin.codegen.utils.doubleQuote
1516
import software.amazon.smithy.model.knowledge.TopDownIndex
1617
import software.amazon.smithy.model.shapes.OperationShape
1718
import software.amazon.smithy.rulesengine.language.syntax.parameters.ParameterType
@@ -192,6 +193,11 @@ class EndpointResolverAdapterGenerator(
192193
when (param.type) {
193194
ParameterType.STRING -> writer.write("#S", staticParam.value.expectStringNode().value)
194195
ParameterType.BOOLEAN -> writer.write("#L", staticParam.value.expectBooleanNode().value)
196+
ParameterType.STRING_ARRAY -> writer.write(
197+
staticParam.value.expectArrayNode().elements.joinToString(",", "mutableListOf(", ")") { element ->
198+
element.expectStringNode().value.doubleQuote()
199+
},
200+
)
195201
else -> throw CodegenException("unexpected static context param type ${param.type}")
196202
}
197203
continue

codegen/smithy-kotlin-codegen/src/test/kotlin/software/amazon/smithy/kotlin/codegen/rendering/endpoints/EndpointParametersGeneratorTest.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ class EndpointParametersGeneratorTest {
2929
"type": "Boolean",
3030
"required": false
3131
},
32+
"StringArrayField": {
33+
"type": "stringArray",
34+
"required": false
35+
},
3236
"RequiredStringField": {
3337
"type": "String",
3438
"required": true
@@ -161,6 +165,8 @@ class EndpointParametersGeneratorTest {
161165
public val requiredBooleanField: Boolean? = requireNotNull(builder.requiredBooleanField) { "endpoint provider parameter #requiredBooleanField is required" }
162166
163167
public val requiredStringField: String? = requireNotNull(builder.requiredStringField) { "endpoint provider parameter #requiredStringField is required" }
168+
169+
public val stringArrayField: kotlin.collections.MutableList<kotlin.String>? = builder.stringArrayField
164170
165171
public val stringField: String? = builder.stringField
166172
""".formatForTest()
@@ -195,6 +201,7 @@ class EndpointParametersGeneratorTest {
195201
if (this.documentedField != other.documentedField) return false
196202
if (this.requiredBooleanField != other.requiredBooleanField) return false
197203
if (this.requiredStringField != other.requiredStringField) return false
204+
if (this.stringArrayField != other.stringArrayField) return false
198205
if (this.stringField != other.stringField) return false
199206
return true
200207
}
@@ -218,6 +225,7 @@ class EndpointParametersGeneratorTest {
218225
result = 31 * result + (documentedField?.hashCode() ?: 0)
219226
result = 31 * result + (requiredBooleanField?.hashCode() ?: 0)
220227
result = 31 * result + (requiredStringField?.hashCode() ?: 0)
228+
result = 31 * result + (stringArrayField?.hashCode() ?: 0)
221229
result = 31 * result + (stringField?.hashCode() ?: 0)
222230
return result
223231
}
@@ -242,6 +250,7 @@ class EndpointParametersGeneratorTest {
242250
append("documentedField=${'$'}documentedField,")
243251
append("requiredBooleanField=${'$'}requiredBooleanField,")
244252
append("requiredStringField=${'$'}requiredStringField,")
253+
append("stringArrayField=${'$'}stringArrayField,")
245254
append("stringField=${'$'}stringField)")
246255
}
247256
""".formatForTest()
@@ -265,6 +274,7 @@ class EndpointParametersGeneratorTest {
265274
documentedField = this@TestEndpointParameters.documentedField
266275
requiredBooleanField = this@TestEndpointParameters.requiredBooleanField
267276
requiredStringField = this@TestEndpointParameters.requiredStringField
277+
stringArrayField = this@TestEndpointParameters.stringArrayField
268278
stringField = this@TestEndpointParameters.stringField
269279
block()
270280
}
@@ -304,6 +314,8 @@ class EndpointParametersGeneratorTest {
304314
public var requiredBooleanField: Boolean? = null
305315
306316
public var requiredStringField: String? = null
317+
318+
public var stringArrayField: kotlin.collections.MutableList<kotlin.String>? = null
307319
308320
public var stringField: String? = null
309321

0 commit comments

Comments
 (0)