Skip to content

Commit

Permalink
feat: add support for awsQuery-compatible error responses (#880)
Browse files Browse the repository at this point in the history
  • Loading branch information
lucix-aws authored Mar 29, 2023
1 parent 7b160fc commit 1710da5
Showing 1 changed file with 21 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,14 @@ import aws.sdk.kotlin.codegen.protocols.middleware.UserAgentMiddleware
import aws.sdk.kotlin.codegen.protocols.protocoltest.AwsHttpProtocolUnitTestErrorGenerator
import aws.sdk.kotlin.codegen.protocols.protocoltest.AwsHttpProtocolUnitTestRequestGenerator
import aws.sdk.kotlin.codegen.protocols.protocoltest.AwsHttpProtocolUnitTestResponseGenerator
import software.amazon.smithy.aws.traits.protocols.AwsQueryCompatibleTrait
import software.amazon.smithy.codegen.core.CodegenException
import software.amazon.smithy.codegen.core.Symbol
import software.amazon.smithy.kotlin.codegen.core.KotlinWriter
import software.amazon.smithy.kotlin.codegen.core.RuntimeTypes
import software.amazon.smithy.kotlin.codegen.core.useFileWriter
import software.amazon.smithy.kotlin.codegen.core.withBlock
import software.amazon.smithy.kotlin.codegen.core.*
import software.amazon.smithy.kotlin.codegen.lang.KotlinTypes
import software.amazon.smithy.kotlin.codegen.model.buildSymbol
import software.amazon.smithy.kotlin.codegen.model.getEndpointRules
import software.amazon.smithy.kotlin.codegen.model.hasTrait
import software.amazon.smithy.kotlin.codegen.model.namespace
import software.amazon.smithy.kotlin.codegen.rendering.ExceptionBaseClassGenerator
import software.amazon.smithy.kotlin.codegen.rendering.endpoints.*
Expand Down Expand Up @@ -140,6 +139,20 @@ abstract class AwsHttpBindingProtocolGenerator : HttpBindingProtocolGenerator()
}
.write("")

if (ctx.service.hasTrait<AwsQueryCompatibleTrait>()) {
writer.write("var queryErrorDetails: #T? = null", RuntimeTypes.AwsProtocolCore.AwsQueryCompatibleErrorDetails)
writer.withBlock("response.headers[#T]?.let {", "}", RuntimeTypes.AwsProtocolCore.XAmznQueryErrorHeader) {
openBlock("queryErrorDetails = try {")
write("#T.parse(it)", RuntimeTypes.AwsProtocolCore.AwsQueryCompatibleErrorDetails)
closeAndOpenBlock("} catch (ex: Exception) {")
withBlock("""throw #T("Failed to parse awsQuery-compatible error", ex).also {""", "}", exceptionBaseSymbol) {
write("#T(it, wrappedResponse, errorDetails)", RuntimeTypes.AwsProtocolCore.setAseErrorMetadata)
}
closeBlock("}")
}
writer.write("")
}

writer.withBlock("val ex = when(errorDetails.code) {", "}") {
op.errors.forEach { err ->
val errSymbol = ctx.symbolProvider.toSymbol(ctx.model.expectShape(err))
Expand All @@ -154,6 +167,10 @@ abstract class AwsHttpBindingProtocolGenerator : HttpBindingProtocolGenerator()

writer.write("")
writer.write("#T(ex, wrappedResponse, errorDetails)", RuntimeTypes.AwsProtocolCore.setAseErrorMetadata)
if (ctx.service.hasTrait<AwsQueryCompatibleTrait>()) {
writer.write("queryErrorDetails?.let { #T(ex, it) }", RuntimeTypes.AwsProtocolCore.setAwsQueryCompatibleErrorMetadata)
}

writer.write("throw ex")
}

Expand Down

0 comments on commit 1710da5

Please sign in to comment.