@@ -8,6 +8,7 @@ package software.amazon.smithy.rust.codegen.core.testutil
8
8
import software.amazon.smithy.build.PluginContext
9
9
import software.amazon.smithy.model.Model
10
10
import software.amazon.smithy.model.node.ObjectNode
11
+ import software.amazon.smithy.model.node.ToNode
11
12
import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig
12
13
import software.amazon.smithy.rust.codegen.core.util.runCommand
13
14
import java.io.File
@@ -50,87 +51,78 @@ data class IntegrationTestParams(
50
51
sealed class AdditionalSettings {
51
52
abstract fun toObjectNode (): ObjectNode
52
53
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)
54
+ companion object {
55
+ private fun Map <String , Any >.toCodegenObjectNode (): ObjectNode =
56
+ ObjectNode .builder()
57
+ .withMember(
58
+ " codegen" ,
59
+ ObjectNode .builder().apply {
60
+ forEach { (key, value) ->
61
+ when (value) {
62
+ is Boolean -> withMember(key, value)
63
+ is Number -> withMember(key, value)
64
+ is String -> withMember(key, value)
65
+ is ToNode -> withMember(key, value)
66
+ else -> throw IllegalArgumentException (" Unsupported type for key $key : ${value::class } " )
67
+ }
68
+ }
69
+ }.build(),
70
+ )
61
71
.build()
62
- }
63
-
64
- abstract class Builder <T : CoreAdditionalSettings > : AdditionalSettings () {
65
- protected val settings = mutableListOf<AdditionalSettings >()
72
+ }
66
73
67
- fun generateCodegenComments ( debugMode : Boolean = true): Builder < T > {
68
- settings.add( GenerateCodegenComments (debugMode))
69
- return this
70
- }
74
+ abstract class CoreAdditionalSettings protected constructor(
75
+ private val settings : Map < String , Any >,
76
+ ) : AdditionalSettings() {
77
+ override fun toObjectNode (): ObjectNode = settings.toCodegenObjectNode()
71
78
72
- abstract fun build (): T
79
+ abstract class Builder <T : CoreAdditionalSettings > : AdditionalSettings () {
80
+ protected val settings = mutableMapOf<String , Any >()
73
81
74
- override fun toObjectNode (): ObjectNode = build().toObjectNode()
75
- }
82
+ fun generateCodegenComments (debugMode : Boolean = true) =
83
+ apply {
84
+ settings[" debugMode" ] = debugMode
85
+ }
76
86
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()
87
+ override fun toObjectNode (): ObjectNode = settings.toCodegenObjectNode()
83
88
}
84
89
}
85
90
}
86
91
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
- }
92
-
93
- // Additional settings that are specific to client generation should be defined here.
94
-
95
- companion object {
96
- fun builder () = Builder ()
97
- }
98
- }
99
-
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
92
+ class ServerAdditionalSettings private constructor(
93
+ settings : Map <String , Any >,
94
+ ) : AdditionalSettings.CoreAdditionalSettings(settings) {
95
+ class Builder : CoreAdditionalSettings .Builder <ServerAdditionalSettings >() {
96
+ fun publicConstrainedTypes (enabled : Boolean = true) =
97
+ apply {
98
+ settings[" publicConstrainedTypes" ] = enabled
106
99
}
107
100
108
- fun addValidationExceptionToConstrainedOperations (enabled : Boolean = true): Builder {
109
- settings.add( AddValidationExceptionToConstrainedOperations (enabled))
110
- return this
101
+ fun addValidationExceptionToConstrainedOperations (enabled : Boolean = true) =
102
+ apply {
103
+ settings[ " addValidationExceptionToConstrainedOperations " ] = enabled
111
104
}
112
105
113
- override fun build (): ServerAdditionalSettings = ServerAdditionalSettings (settings)
114
- }
106
+ fun replaceInvalidUtf8 (enabled : Boolean = true) =
107
+ apply {
108
+ settings[" replaceInvalidUtf8" ] = enabled
109
+ }
110
+ }
115
111
116
- private data class PublicConstrainedTypes (val enabled : Boolean ) : AdditionalSettings() {
117
- override fun toObjectNode (): ObjectNode =
118
- ObjectNode .builder()
119
- .withMember(" publicConstrainedTypes" , enabled)
120
- .build()
121
- }
112
+ companion object {
113
+ fun builder () = Builder ()
114
+ }
115
+ }
122
116
123
- private data class AddValidationExceptionToConstrainedOperations (val enabled : Boolean ) : AdditionalSettings() {
124
- override fun toObjectNode (): ObjectNode =
125
- ObjectNode .builder()
126
- .withMember(" addValidationExceptionToConstrainedOperations" , enabled)
127
- .build()
128
- }
117
+ class ClientAdditionalSettings private constructor(
118
+ settings : Map <String , Any >,
119
+ ) : AdditionalSettings.CoreAdditionalSettings(settings) {
120
+ class Builder : CoreAdditionalSettings .Builder <ClientAdditionalSettings >()
129
121
130
- companion object {
131
- fun builder () = Builder ()
132
- }
122
+ companion object {
123
+ fun builder () = Builder ()
133
124
}
125
+ }
134
126
135
127
/* *
136
128
* Run cargo test on a true, end-to-end, codegen product of a given model.
0 commit comments