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

software.amazon.smithy.kotlin.codegen.rendering.endpoints.EndpointDelegator.kt Maven / Gradle / Ivy

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

package software.amazon.smithy.kotlin.codegen.rendering.endpoints

import software.amazon.smithy.kotlin.codegen.core.useFileWriter
import software.amazon.smithy.kotlin.codegen.rendering.protocol.ProtocolGenerator
import software.amazon.smithy.rulesengine.language.EndpointRuleSet
import software.amazon.smithy.rulesengine.traits.EndpointTestCase

/**
 * Responsible for providing various endpoint related generation components
 */
interface EndpointDelegator {
    companion object {
        /**
         * Get the default endpoint delegator
         */
        val Default: EndpointDelegator = object : EndpointDelegator {}
    }

    /**
     * Generate a default implementation for the modeled endpoint provider.
     * Will only be invoked when a model's service shape has the necessary endpoint rule set trait, however, the base
     * interface and parameter type will always be generated (the expectation being that the caller supplies their own
     * at runtime).
     */
    fun generateEndpointProvider(ctx: ProtocolGenerator.GenerationContext, rules: EndpointRuleSet?) {
        val providerSymbol = EndpointProviderGenerator.getSymbol(ctx.settings)
        val defaultProviderSymbol = DefaultEndpointProviderGenerator.getSymbol(ctx.settings)

        ctx.delegator.useFileWriter(providerSymbol) {
            EndpointProviderGenerator(ctx, it).render()
        }

        if (rules != null) {
            ctx.delegator.useFileWriter(defaultProviderSymbol) {
                DefaultEndpointProviderGenerator(ctx, rules, it).render()
            }
        }
    }

    /**
     * Generate the input parameter type for the generated endpoint provider implementation.
     */
    fun generateEndpointParameters(ctx: ProtocolGenerator.GenerationContext, rules: EndpointRuleSet?) {
        ctx.delegator.useFileWriter(EndpointParametersGenerator.getSymbol(ctx.settings)) {
            EndpointParametersGenerator(ctx, rules, it).render()
        }
    }

    /**
     * Generate unit tests for the modeled endpoint rules test cases.
     * Will only be invoked when a model's service shape has both the rule set and test case traits for endpoints.
     */
    fun generateEndpointProviderTests(ctx: ProtocolGenerator.GenerationContext, tests: List, rules: EndpointRuleSet) {
        val testSymbol = DefaultEndpointProviderTestGenerator.getSymbol(ctx.settings)

        ctx.delegator.useTestFileWriter("${testSymbol.name}.kt", testSymbol.namespace) {
            DefaultEndpointProviderTestGenerator(ctx, rules, tests, it).render()
        }
    }

    /**
     * Generate the operation adapter for going from the type agnostic HTTP endpoint resolver to the generated
     * endpoint provider.
     */
    fun generateEndpointResolverAdapter(ctx: ProtocolGenerator.GenerationContext) {
        ctx.delegator.useFileWriter(EndpointResolverAdapterGenerator.getSymbol(ctx.settings)) {
            EndpointResolverAdapterGenerator(ctx, it).render()
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy