Unverified Commit 6aa585fa authored by Zelda Hessler's avatar Zelda Hessler Committed by GitHub
Browse files

update generic clients to support user-configurable runtime plugins (#2864)

_This PR also updates `pre-commit ktlint` runner. Now it won't spit out
a bazillion debug logs when run_

----

_By submitting this pull request, I confirm that you can use, modify,
copy, and redistribute this contribution, under the terms of your
choice._
parent 7875278a
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -20,7 +20,7 @@ repos:
    files: ^.*$
    pass_filenames: false
- repo: https://github.com/macisamuele/language-formatters-pre-commit-hooks
  rev: v2.6.0
  rev: v2.10.0
  hooks:
  - id: pretty-format-kotlin
    args: [--autofix, --ktlint-version, 0.48.2]
+2 −1
Original line number Diff line number Diff line
@@ -105,7 +105,8 @@ fun generateSmithyBuild(services: AwsServices): String {
                            "renameErrors": false,
                            "debugMode": $debugMode,
                            "eventStreamAllowList": [$eventStreamAllowListMembers],
                            "enableNewSmithyRuntime": "${getSmithyRuntimeMode()}"
                            "enableNewSmithyRuntime": "${getSmithyRuntimeMode()}",
                            "enableUserConfigurableRuntimePlugins": false
                        },
                        "service": "${service.service}",
                        "module": "$moduleName",
+1 −0
Original line number Diff line number Diff line
@@ -36,4 +36,5 @@ data class ClientCodegenContext(
    model, symbolProvider, moduleDocProvider, serviceShape, protocol, settings, CodegenTarget.CLIENT,
) {
    val smithyRuntimeMode: SmithyRuntimeMode get() = settings.codegenConfig.enableNewSmithyRuntime
    val enableUserConfigurableRuntimePlugins: Boolean get() = settings.codegenConfig.enableUserConfigurableRuntimePlugins
}
+28 −28
Original line number Diff line number Diff line
@@ -74,25 +74,25 @@ data class ClientRustSettings(

// TODO(enableNewSmithyRuntimeCleanup): Remove this mode after switching to the orchestrator
enum class SmithyRuntimeMode {
    Middleware,
    BothDefaultMiddleware,
    BothDefaultOrchestrator,
    Orchestrator,
    Middleware, BothDefaultMiddleware, BothDefaultOrchestrator, Orchestrator,
    ;

    val exclusivelyGenerateMiddleware: Boolean get() = generateMiddleware && !generateOrchestrator

    val generateMiddleware: Boolean get() = when (this) {
    val generateMiddleware: Boolean
        get() = when (this) {
            Middleware, BothDefaultMiddleware, BothDefaultOrchestrator -> true
            else -> false
        }

    val generateOrchestrator: Boolean get() = when (this) {
    val generateOrchestrator: Boolean
        get() = when (this) {
            Orchestrator, BothDefaultMiddleware, BothDefaultOrchestrator -> true
            else -> false
        }

    val defaultToMiddleware: Boolean get() = when (this) {
    val defaultToMiddleware: Boolean
        get() = when (this) {
            Middleware, BothDefaultMiddleware -> true
            else -> false
        }
@@ -127,6 +127,7 @@ data class ClientCodegenConfig(
    val enableNewSmithyRuntime: SmithyRuntimeMode = defaultEnableNewSmithyRuntime,
    /** If true, adds `endpoint_url`/`set_endpoint_url` methods to the service config */
    val includeEndpointUrlConfig: Boolean = defaultIncludeEndpointUrlConfig,
    val enableUserConfigurableRuntimePlugins: Boolean = defaultEnableUserConfigurableRuntimePlugins,
) : CoreCodegenConfig(
    formatTimeoutSeconds, debugMode,
) {
@@ -137,25 +138,24 @@ data class ClientCodegenConfig(
        private val defaultEventStreamAllowList: Set<String> = emptySet()
        private val defaultEnableNewSmithyRuntime = SmithyRuntimeMode.Orchestrator
        private const val defaultIncludeEndpointUrlConfig = true
        private const val defaultEnableUserConfigurableRuntimePlugins = true

        fun fromCodegenConfigAndNode(coreCodegenConfig: CoreCodegenConfig, node: Optional<ObjectNode>) =
            if (node.isPresent) {
                ClientCodegenConfig(
                    formatTimeoutSeconds = coreCodegenConfig.formatTimeoutSeconds,
                    debugMode = coreCodegenConfig.debugMode,
                    eventStreamAllowList = node.get().getArrayMember("eventStreamAllowList")
                        .map { array -> array.toList().mapNotNull { node -> node.asStringNode().orNull()?.value } }
                        .orNull()?.toSet() ?: defaultEventStreamAllowList,
                    eventStreamAllowList = node.get().getArrayMember("eventStreamAllowList").map { array ->
                        array.toList().mapNotNull { node ->
                            node.asStringNode().orNull()?.value
                        }
                    }.orNull()?.toSet() ?: defaultEventStreamAllowList,
                    renameExceptions = node.get().getBooleanMemberOrDefault("renameErrors", defaultRenameExceptions),
                    includeFluentClient = node.get()
                        .getBooleanMemberOrDefault("includeFluentClient", defaultIncludeFluentClient),
                    addMessageToErrors = node.get()
                        .getBooleanMemberOrDefault("addMessageToErrors", defaultAddMessageToErrors),
                    enableNewSmithyRuntime = SmithyRuntimeMode.fromString(
                        node.get().getStringMemberOrDefault("enableNewSmithyRuntime", "middleware"),
                    ),
                    includeEndpointUrlConfig = node.get()
                        .getBooleanMemberOrDefault("includeEndpointUrlConfig", defaultIncludeEndpointUrlConfig),
                    includeFluentClient = node.get().getBooleanMemberOrDefault("includeFluentClient", defaultIncludeFluentClient),
                    addMessageToErrors = node.get().getBooleanMemberOrDefault("addMessageToErrors", defaultAddMessageToErrors),
                    enableNewSmithyRuntime = SmithyRuntimeMode.fromString(node.get().getStringMemberOrDefault("enableNewSmithyRuntime", "middleware")),
                    includeEndpointUrlConfig = node.get().getBooleanMemberOrDefault("includeEndpointUrlConfig", defaultIncludeEndpointUrlConfig),
                    enableUserConfigurableRuntimePlugins = node.get().getBooleanMemberOrDefault("userConfigurableRuntimePlugins", defaultEnableUserConfigurableRuntimePlugins),
                )
            } else {
                ClientCodegenConfig(
+11 −0
Original line number Diff line number Diff line
@@ -34,6 +34,17 @@ class ClientRuntimeTypesReExportGenerator(
                "Interceptor" to RuntimeType.interceptor(rc),
                "SharedInterceptor" to RuntimeType.sharedInterceptor(rc),
            )

            if (codegenContext.enableUserConfigurableRuntimePlugins) {
                rustTemplate(
                    """
                    pub use #{runtime_plugin}::{RuntimePlugin, SharedRuntimePlugin};
                    pub use #{config_bag}::FrozenLayer;
                    """,
                    "runtime_plugin" to RuntimeType.smithyRuntimeApi(rc).resolve("client::runtime_plugin"),
                    "config_bag" to RuntimeType.smithyTypes(rc).resolve("config_bag"),
                )
            }
        }
        rustCrate.withModule(ClientRustModule.endpoint(codegenContext)) {
            rustTemplate(
Loading