All Downloads are FREE. Search and download functionalities are using the official Maven repository.

software.amazon.smithy.kotlin.codegen.rendering.compression.RequestCompressionIntegration.kt Maven / Gradle / Ivy

/*
 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
 * SPDX-License-Identifier: Apache-2.0
 */

/*
 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
 * SPDX-License-Identifier: Apache-2.0
 */
package software.amazon.smithy.kotlin.codegen.rendering.compression

import software.amazon.smithy.kotlin.codegen.KotlinSettings
import software.amazon.smithy.kotlin.codegen.core.CodegenContext
import software.amazon.smithy.kotlin.codegen.core.KotlinWriter
import software.amazon.smithy.kotlin.codegen.core.RuntimeTypes
import software.amazon.smithy.kotlin.codegen.core.withBlock
import software.amazon.smithy.kotlin.codegen.integration.KotlinIntegration
import software.amazon.smithy.kotlin.codegen.model.defaultValue
import software.amazon.smithy.kotlin.codegen.model.getTrait
import software.amazon.smithy.kotlin.codegen.model.hasTrait
import software.amazon.smithy.kotlin.codegen.model.nonNullable
import software.amazon.smithy.kotlin.codegen.rendering.protocol.ProtocolGenerator
import software.amazon.smithy.kotlin.codegen.rendering.protocol.ProtocolMiddleware
import software.amazon.smithy.kotlin.codegen.rendering.util.ConfigProperty
import software.amazon.smithy.kotlin.codegen.rendering.util.ConfigPropertyType
import software.amazon.smithy.kotlin.codegen.rendering.util.nestedBuilder
import software.amazon.smithy.model.Model
import software.amazon.smithy.model.shapes.OperationShape
import software.amazon.smithy.model.traits.RequestCompressionTrait

/**
 * Adds request compression settings if request compression trait is present.
 * Adds middleware that registers interceptor and provides functionality for request compression if request compression
 * is not disabled via settings.
 */
class RequestCompressionIntegration : KotlinIntegration {

    override fun enabledForService(model: Model, settings: KotlinSettings): Boolean =
        model.isTraitApplied(RequestCompressionTrait::class.java)

    override fun customizeMiddleware(
        ctx: ProtocolGenerator.GenerationContext,
        resolved: List,
    ): List = resolved + requestCompressionTraitMiddleware

    override fun additionalServiceConfigProps(ctx: CodegenContext): List =
        listOf(
            ConfigProperty {
                name = "requestCompression"
                symbol = RuntimeTypes.SmithyClient.Config.RequestCompressionConfig
                builderSymbol = RuntimeTypes.SmithyClient.Config.RequestCompressionConfig.nestedBuilder.toBuilder()
                    .defaultValue("${this.symbol}.Builder()")
                    .nonNullable()
                    .build()
                toBuilderExpression = ".toBuilder()"
                baseClass = RuntimeTypes.SmithyClient.Config.CompressionClientConfig
                builderBaseClass = RuntimeTypes.SmithyClient.Config.CompressionClientConfig.nestedBuilder
                propertyType = ConfigPropertyType.Custom(
                    render = { prop, writer ->
                        writer.write(
                            "override val #1L: #2T = #2T(builder.#1L)",
                            prop.propertyName,
                            prop.symbol,
                        )
                    },
                )
                documentation = """
                Configuration settings related to request compression.
                See [aws.smithy.kotlin.runtime.client.config.CompressionClientConfig] for more information
                """.trimIndent()
            },
        )
}

private val requestCompressionTraitMiddleware = object : ProtocolMiddleware {
    override val name: String = "RequestCompressionMiddleware"

    override fun isEnabledFor(ctx: ProtocolGenerator.GenerationContext, op: OperationShape): Boolean =
        op.hasTrait()

    override fun render(ctx: ProtocolGenerator.GenerationContext, op: OperationShape, writer: KotlinWriter) {
        val requestCompressionTrait = op.getTrait()!!
        val supportedCompressionAlgorithms = requestCompressionTrait.encodings

        writer.withBlock(
            "if (config.requestCompression.disableRequestCompression == false) {",
            "}",
        ) {
            withBlock(
                "op.interceptors.add(#T(",
                "))",
                RuntimeTypes.HttpClient.Interceptors.RequestCompressionInterceptor,
            ) {
                write("config.requestCompression.requestMinCompressionSizeBytes,")
                write("config.requestCompression.compressionAlgorithms,")
                write(
                    "listOf(${supportedCompressionAlgorithms.joinToString(
                        separator = ", ",
                        transform = {
                            "\"$it\""
                        },
                    )}),",
                )
            }
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy