Skip to content

Commit 6d65526

Browse files
author
Fahad Zubair
committed
Fix ServerAdditionalSettings to allow method calls in any order
Previously, calling generateCodegenComments() before other methods would fail because it returned the parent type. Modified the class to maintain the correct type throughout method chaining.
1 parent aac9bec commit 6d65526

File tree

4 files changed

+56
-81
lines changed

4 files changed

+56
-81
lines changed

codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/CodegenIntegrationTest.kt

+51-75
Original file line numberDiff line numberDiff line change
@@ -40,97 +40,73 @@ data class IntegrationTestParams(
4040
* model,
4141
* IntegrationTestParams(
4242
* additionalSettings =
43-
* ServerAdditionalSettings.builder()
44-
* .generateCodegenComments()
45-
* .publicConstrainedTypes()
43+
* ServerAdditionalSettings()
44+
* .generateCodegenComments(true)
45+
* .publicConstrainedTypes(true)
4646
* .toObjectNode()
4747
* )),
4848
* ```
4949
*/
50-
sealed class AdditionalSettings {
51-
abstract fun toObjectNode(): ObjectNode
52-
53-
abstract class CoreAdditionalSettings protected constructor(val settings: List<AdditionalSettings>) : AdditionalSettings() {
54-
override fun toObjectNode(): ObjectNode {
55-
val merged =
56-
settings.map { it.toObjectNode() }
57-
.reduce { acc, next -> acc.merge(next) }
58-
59-
return ObjectNode.builder()
60-
.withMember("codegen", merged)
61-
.build()
62-
}
63-
64-
abstract class Builder<T : CoreAdditionalSettings> : AdditionalSettings() {
65-
protected val settings = mutableListOf<AdditionalSettings>()
66-
67-
fun generateCodegenComments(debugMode: Boolean = true): Builder<T> {
68-
settings.add(GenerateCodegenComments(debugMode))
69-
return this
70-
}
71-
72-
abstract fun build(): T
73-
74-
override fun toObjectNode(): ObjectNode = build().toObjectNode()
50+
open class AdditionalSettings<T : AdditionalSettings<T>> {
51+
private val codegenBuilderDelegate =
52+
lazy {
53+
ObjectNode.builder()
7554
}
55+
private val codegenBuilder: ObjectNode.Builder by codegenBuilderDelegate
7656

77-
// Core settings that are common to both Servers and Clients should be defined here.
78-
data class GenerateCodegenComments(val debugMode: Boolean) : AdditionalSettings() {
79-
override fun toObjectNode(): ObjectNode =
80-
ObjectNode.builder()
81-
.withMember("debugMode", debugMode)
82-
.build()
57+
fun build(): ObjectNode {
58+
return if (codegenBuilderDelegate.isInitialized()) {
59+
ObjectNode.builder()
60+
.withMember("codegen", codegenBuilder.build())
61+
.build()
62+
} else {
63+
ObjectNode.builder().build()
8364
}
8465
}
85-
}
86-
87-
class ClientAdditionalSettings private constructor(settings: List<AdditionalSettings>) :
88-
AdditionalSettings.CoreAdditionalSettings(settings) {
89-
class Builder : CoreAdditionalSettings.Builder<ClientAdditionalSettings>() {
90-
override fun build(): ClientAdditionalSettings = ClientAdditionalSettings(settings)
91-
}
9266

93-
// Additional settings that are specific to client generation should be defined here.
94-
95-
companion object {
96-
fun builder() = Builder()
97-
}
67+
@Suppress("UNCHECKED_CAST")
68+
open fun generateCodegenComments(debugMode: Boolean = true): T {
69+
codegenBuilder.withMember("debugMode", debugMode)
70+
return this as T
9871
}
9972

100-
class ServerAdditionalSettings private constructor(settings: List<AdditionalSettings>) :
101-
AdditionalSettings.CoreAdditionalSettings(settings) {
102-
class Builder : CoreAdditionalSettings.Builder<ServerAdditionalSettings>() {
103-
fun publicConstrainedTypes(enabled: Boolean = true): Builder {
104-
settings.add(PublicConstrainedTypes(enabled))
105-
return this
106-
}
73+
@Suppress("UNCHECKED_CAST")
74+
protected fun withCodegenMember(
75+
key: String,
76+
value: Boolean,
77+
): T {
78+
codegenBuilder.withMember(key, value)
79+
return this as T
80+
}
10781

108-
fun addValidationExceptionToConstrainedOperations(enabled: Boolean = true): Builder {
109-
settings.add(AddValidationExceptionToConstrainedOperations(enabled))
110-
return this
111-
}
82+
@Suppress("UNCHECKED_CAST")
83+
protected fun withCodegenMember(
84+
key: String,
85+
value: String,
86+
): T {
87+
codegenBuilder.withMember(key, value)
88+
return this as T
89+
}
11290

113-
override fun build(): ServerAdditionalSettings = ServerAdditionalSettings(settings)
114-
}
91+
@Suppress("UNCHECKED_CAST")
92+
protected fun withCodegenMember(
93+
key: String,
94+
value: Number,
95+
): T {
96+
codegenBuilder.withMember(key, value)
97+
return this as T
98+
}
99+
}
115100

116-
private data class PublicConstrainedTypes(val enabled: Boolean) : AdditionalSettings() {
117-
override fun toObjectNode(): ObjectNode =
118-
ObjectNode.builder()
119-
.withMember("publicConstrainedTypes", enabled)
120-
.build()
121-
}
101+
class ServerAdditionalSettings : AdditionalSettings<ServerAdditionalSettings>() {
102+
fun publicConstrainedTypes(enabled: Boolean = true): ServerAdditionalSettings =
103+
withCodegenMember("publicConstrainedTypes", enabled)
122104

123-
private data class AddValidationExceptionToConstrainedOperations(val enabled: Boolean) : AdditionalSettings() {
124-
override fun toObjectNode(): ObjectNode =
125-
ObjectNode.builder()
126-
.withMember("addValidationExceptionToConstrainedOperations", enabled)
127-
.build()
128-
}
105+
fun addValidationExceptionToConstrainedOperations(enabled: Boolean = true) =
106+
withCodegenMember("addValidationExceptionToConstrainedOperations", enabled)
129107

130-
companion object {
131-
fun builder() = Builder()
132-
}
133-
}
108+
fun ignoreUnsupportedConstraints() = withCodegenMember("ignoreUnsupportedConstraints", true)
109+
}
134110

135111
/**
136112
* Run cargo test on a true, end-to-end, codegen product of a given model.

codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ConstraintsTest.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -242,9 +242,9 @@ class ConstraintsTest {
242242
IntegrationTestParams(
243243
service = "test#SampleService",
244244
additionalSettings =
245-
ServerAdditionalSettings.builder()
245+
ServerAdditionalSettings()
246246
.publicConstrainedTypes(pubConstraints)
247-
.toObjectNode(),
247+
.build(),
248248
overrideTestDir = dir,
249249
),
250250
test = test,

codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/AddValidationExceptionToConstrainedOperationsTest.kt

+3-2
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,10 @@ internal class AddValidationExceptionToConstrainedOperationsTest {
7676
testModelWithValidationExceptionImported,
7777
IntegrationTestParams(
7878
additionalSettings =
79-
ServerAdditionalSettings.builder()
79+
ServerAdditionalSettings()
80+
.generateCodegenComments(true)
8081
.addValidationExceptionToConstrainedOperations()
81-
.toObjectNode(),
82+
.build(),
8283
),
8384
)
8485
}

codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/serialize/CborConstraintsIntegrationTest.kt

-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ package software.amazon.smithy.rust.codegen.server.smithy.protocols.serialize
66

77
import org.junit.jupiter.api.Test
88
import software.amazon.smithy.rust.codegen.core.testutil.IntegrationTestParams
9-
import software.amazon.smithy.rust.codegen.core.testutil.ServerAdditionalSettings
109
import software.amazon.smithy.rust.codegen.server.smithy.ModelProtocol
1110
import software.amazon.smithy.rust.codegen.server.smithy.loadSmithyConstraintsModelForProtocol
1211
import software.amazon.smithy.rust.codegen.server.smithy.testutil.serverIntegrationTest
@@ -20,7 +19,6 @@ class CborConstraintsIntegrationTest {
2019
model,
2120
IntegrationTestParams(
2221
service = serviceShape.toString(),
23-
additionalSettings = ServerAdditionalSettings.builder().generateCodegenComments().toObjectNode(),
2422
),
2523
) { _, _ ->
2624
}

0 commit comments

Comments
 (0)