Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@

package aws.sdk.kotlin.codegen

import software.amazon.smithy.codegen.core.Symbol
import software.amazon.smithy.kotlin.codegen.core.KotlinDependency
import software.amazon.smithy.kotlin.codegen.model.buildSymbol
import software.amazon.smithy.kotlin.codegen.model.namespace

Expand All @@ -16,31 +18,30 @@ import software.amazon.smithy.kotlin.codegen.model.namespace
*/
object AwsRuntimeTypes {
object Core {
val AwsClientOption = buildSymbol {
name = "AwsClientOption"
namespace(AwsKotlinDependency.AWS_CLIENT_RT_CORE, subpackage = "client")
}
val AwsClientOption = runtimeSymbol("AwsClientOption", AwsKotlinDependency.AWS_CLIENT_RT_CORE, "client")
val AuthAttributes = runtimeSymbol("AuthAttributes", AwsKotlinDependency.AWS_CLIENT_RT_CORE, "execution")
val AwsErrorMetadata = runtimeSymbol("AwsErrorMetadata", AwsKotlinDependency.AWS_CLIENT_RT_CORE)

val AuthAttributes = buildSymbol {
name = "AuthAttributes"
namespace(AwsKotlinDependency.AWS_CLIENT_RT_CORE, subpackage = "execution")
}
object Endpoint {
val EndpointResolver = runtimeSymbol("EndpointResolver", AwsKotlinDependency.AWS_CLIENT_RT_CORE, "endpoint")
val Endpoint = runtimeSymbol("Endpoint", AwsKotlinDependency.AWS_CLIENT_RT_CORE, "endpoint")

val AwsErrorMetadata = buildSymbol {
name = "AwsErrorMetadata"
namespace(AwsKotlinDependency.AWS_CLIENT_RT_CORE)
object Internal {
val CredentialScope = runtimeSymbol("CredentialScope", AwsKotlinDependency.AWS_CLIENT_RT_CORE, "endpoint.internal")
val EndpointDefinition = runtimeSymbol("EndpointDefinition", AwsKotlinDependency.AWS_CLIENT_RT_CORE, "endpoint.internal")
val Partition = runtimeSymbol("Partition", AwsKotlinDependency.AWS_CLIENT_RT_CORE, "endpoint.internal")
val resolveEndpoint = runtimeSymbol("resolveEndpoint", AwsKotlinDependency.AWS_CLIENT_RT_CORE, "endpoint.internal")
}
}
}

object Auth {
val AwsSigV4SigningMiddleware = buildSymbol {
name = "AwsSigV4SigningMiddleware"
namespace(AwsKotlinDependency.AWS_CLIENT_RT_AUTH)
}

val AwsSignedBodyHeaderType = buildSymbol {
name = "AwsSignedBodyHeaderType"
namespace(AwsKotlinDependency.AWS_CLIENT_RT_AUTH)
}
val AwsSigV4SigningMiddleware = runtimeSymbol("AwsSigV4SigningMiddleware", AwsKotlinDependency.AWS_CLIENT_RT_AUTH)
val AwsSignedBodyHeaderType = runtimeSymbol("AwsSignedBodyHeaderType", AwsKotlinDependency.AWS_CLIENT_RT_AUTH)
}
}

private fun runtimeSymbol(name: String, dependency: KotlinDependency, subpackage: String = ""): Symbol = buildSymbol {
this.name = name
namespace(dependency, subpackage)
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import software.amazon.smithy.aws.traits.protocols.AwsQueryTrait
import software.amazon.smithy.kotlin.codegen.core.KotlinWriter
import software.amazon.smithy.kotlin.codegen.core.RenderingContext
import software.amazon.smithy.kotlin.codegen.core.RuntimeTypes
import software.amazon.smithy.kotlin.codegen.core.addImport
import software.amazon.smithy.kotlin.codegen.model.expectShape
import software.amazon.smithy.kotlin.codegen.model.hasTrait
import software.amazon.smithy.kotlin.codegen.model.traits.OperationOutput
Expand Down Expand Up @@ -153,17 +154,28 @@ class AwsQuery : AwsHttpBindingProtocolGenerator() {
// we need to unwrap the response document to get the deserializer into the correct state
// see: https://awslabs.github.io/smithy/1.0/spec/aws/aws-query-protocol.html#response-serialization

writer.write("")
.write("val resultDescriptor = SdkFieldDescriptor(SerialKind.Struct, XmlSerialName(#S))", "${operationName}Result")
.openBlock("val wrapperDescriptor = SdkObjectDescriptor.build {", "}") {
writer.write("trait(XmlSerialName(#S))", "${operationName}Response")
writer.write("field(resultDescriptor)")
writer
.addImport(
RuntimeTypes.Serde.SdkFieldDescriptor,
RuntimeTypes.Serde.SerdeXml.XmlSerialName,
RuntimeTypes.Serde.SdkObjectDescriptor,
RuntimeTypes.Serde.deserializeStruct
)
.write("")
.write("val resultDescriptor = #T(SerialKind.Struct, #T(#S))", RuntimeTypes.Serde.SdkFieldDescriptor, RuntimeTypes.Serde.SerdeXml.XmlSerialName, "${operationName}Result")
.openBlock("val wrapperDescriptor = #T.build {", "}", RuntimeTypes.Serde.SdkObjectDescriptor) {
writer
.addImport(RuntimeTypes.Serde.field)
.write("trait(#T(#S))", RuntimeTypes.Serde.SerdeXml.XmlSerialName, "${operationName}Response")
.write("#T(resultDescriptor)", RuntimeTypes.Serde.field)
}
.write("")
// abandon the iterator, this only occurs at the top level operational output
.write("val wrapper = deserializer.deserializeStruct(wrapperDescriptor)")
.write("val wrapper = deserializer.#T(wrapperDescriptor)", RuntimeTypes.Serde.deserializeStruct)
.openBlock("if (wrapper.findNextFieldIndex() != resultDescriptor.index) {", "}") {
writer.write("throw DeserializationException(#S)", "failed to unwrap $operationName response")
writer
.addImport(RuntimeTypes.Serde.DeserializationException)
.write("throw #T(#S)", RuntimeTypes.Serde.DeserializationException, "failed to unwrap $operationName response")
}
writer.write("")
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,9 @@
package aws.sdk.kotlin.codegen.protocols.core

import aws.sdk.kotlin.codegen.AwsKotlinDependency
import aws.sdk.kotlin.codegen.AwsRuntimeTypes
import aws.sdk.kotlin.codegen.endpointPrefix
import software.amazon.smithy.kotlin.codegen.core.*
import software.amazon.smithy.kotlin.codegen.model.buildSymbol
import software.amazon.smithy.kotlin.codegen.model.namespace
import software.amazon.smithy.kotlin.codegen.rendering.protocol.ProtocolGenerator
import software.amazon.smithy.kotlin.codegen.utils.getOrNull
import software.amazon.smithy.model.node.Node
Expand All @@ -22,6 +21,13 @@ import java.util.*
* @param endpointData Parsed endpoints.json [ObjectNode]
*/
class EndpointResolverGenerator(private val endpointData: ObjectNode) {
// Symbols which should be imported
private val endpointResolverSymbols = setOf(
AwsRuntimeTypes.Core.Endpoint.Internal.CredentialScope,
AwsRuntimeTypes.Core.Endpoint.Internal.EndpointDefinition,
AwsRuntimeTypes.Core.Endpoint.Internal.Partition,
AwsRuntimeTypes.Core.Endpoint.Internal.resolveEndpoint
)

fun render(ctx: ProtocolGenerator.GenerationContext) {
ctx.delegator.useFileWriter("DefaultEndpointResolver.kt", "${ctx.settings.pkg.name}.internal") {
Expand All @@ -31,16 +37,9 @@ class EndpointResolverGenerator(private val endpointData: ObjectNode) {
}

private fun renderResolver(writer: KotlinWriter) {
val endpointResolverSymbol = buildSymbol {
name = "EndpointResolver"
namespace(AwsKotlinDependency.AWS_CLIENT_RT_CORE, "endpoint")
}
writer.addImport(endpointResolverSymbol)
val endpointSymbol = buildSymbol {
name = "Endpoint"
namespace(AwsKotlinDependency.AWS_CLIENT_RT_CORE, "endpoint")
}
writer.addImport(endpointSymbol)
writer.addImport(AwsRuntimeTypes.Core.Endpoint.EndpointResolver)
writer.addImport(AwsRuntimeTypes.Core.Endpoint.Endpoint)
writer.addImport(AwsRuntimeTypes.Core.Endpoint.Internal.resolveEndpoint)
writer.addImport("ClientException", AwsKotlinDependency.AWS_CLIENT_RT_CORE)

writer.openBlock("internal class DefaultEndpointResolver : EndpointResolver {", "}") {
Expand Down Expand Up @@ -68,7 +67,7 @@ class EndpointResolverGenerator(private val endpointData: ObjectNode) {
PartitionNode(ctx.service.endpointPrefix, it)
}.sortedWith(comparePartitions)

writer.addImport("${AwsKotlinDependency.AWS_CLIENT_RT_CORE.namespace}.endpoint.internal", "*")
writer.addImport(endpointResolverSymbols)
writer.write("")
writer.openBlock("private val servicePartitions = listOf(", ")") {
partitions.forEach { renderPartition(writer, it) }
Expand Down