Skip to content

Commit

Permalink
Merge remote-tracking branch 'upstream/main' into davidpz/error-log-s…
Browse files Browse the repository at this point in the history
…erver-response-rejections
  • Loading branch information
david-perez committed Apr 3, 2023
2 parents 970c23e + f708076 commit 799e75e
Show file tree
Hide file tree
Showing 39 changed files with 880 additions and 509 deletions.
6 changes: 6 additions & 0 deletions CHANGELOG.next.toml
Original file line number Diff line number Diff line change
Expand Up @@ -74,3 +74,9 @@ message = "Add support for omitting session token in canonical requests for SigV
references = ["smithy-rs#2473"]
meta = { "breaking" = false, "tada" = false, "bug" = false }
author = "martinjlowm"

[[aws-sdk-rust]]
message = "Add `into_segments` method to `AggregatedBytes`, for zero-copy conversions."
references = ["smithy-rs#2525"]
meta = { "breaking" = false, "tada" = false, "bug" = false }
author = "parker-timmerman"
23 changes: 5 additions & 18 deletions codegen-server-test/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -61,12 +61,7 @@ val allCodegenTests = "../codegen-core/common-test-models".let { commonModels ->
"constraints",
imports = listOf("$commonModels/constraints.smithy"),
),
CodegenTest(
"aws.protocoltests.restjson#RestJson",
"rest_json",
// TODO(https://github.com/awslabs/smithy-rs/issues/1401) `@uniqueItems` is used.
extraConfig = """, "codegen": { "ignoreUnsupportedConstraints": true } """,
),
CodegenTest("aws.protocoltests.restjson#RestJson", "rest_json"),
CodegenTest(
"aws.protocoltests.restjson#RestJsonExtras",
"rest_json_extras",
Expand All @@ -75,26 +70,18 @@ val allCodegenTests = "../codegen-core/common-test-models".let { commonModels ->
CodegenTest(
"aws.protocoltests.restjson.validation#RestJsonValidation",
"rest_json_validation",
// `@range` trait is used on floating point shapes, which we deliberately don't want to support.
// See https://github.com/awslabs/smithy-rs/issues/1401.
extraConfig = """, "codegen": { "ignoreUnsupportedConstraints": true } """,
),
CodegenTest("aws.protocoltests.json10#JsonRpc10", "json_rpc10"),
CodegenTest(
"aws.protocoltests.json#JsonProtocol",
"json_rpc11",
extraConfig = """, "codegen": { "ignoreUnsupportedConstraints": true } """,
),
CodegenTest("aws.protocoltests.json#JsonProtocol", "json_rpc11"),
CodegenTest(
"aws.protocoltests.misc#MiscService",
"misc",
imports = listOf("$commonModels/misc.smithy"),
// TODO(https://github.com/awslabs/smithy-rs/issues/1401) `@uniqueItems` is used.
extraConfig = """, "codegen": { "ignoreUnsupportedConstraints": true } """,
),
CodegenTest(
"com.amazonaws.ebs#Ebs", "ebs",
imports = listOf("$commonModels/ebs.json"),
extraConfig = """, "codegen": { "ignoreUnsupportedConstraints": true } """,
),
CodegenTest("com.amazonaws.ebs#Ebs", "ebs", imports = listOf("$commonModels/ebs.json")),
CodegenTest("com.amazonaws.s3#AmazonS3", "s3"),
CodegenTest(
"com.aws.example.rust#PokemonService",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,15 +118,15 @@ open class ServerCodegenVisitor(

val baseModel = baselineTransform(context.model)
val service = settings.getService(baseModel)
val (protocol, generator) =
val (protocolShape, protocolGeneratorFactory) =
ServerProtocolLoader(
codegenDecorator.protocols(
service.id,
ServerProtocolLoader.DefaultProtocols,
),
)
.protocolFor(context.model, service)
protocolGeneratorFactory = generator
this.protocolGeneratorFactory = protocolGeneratorFactory

model = codegenDecorator.transformModel(service, baseModel)

Expand All @@ -145,7 +145,7 @@ open class ServerCodegenVisitor(
serverSymbolProviders.symbolProvider,
null,
service,
protocol,
protocolShape,
settings,
serverSymbolProviders.unconstrainedShapeSymbolProvider,
serverSymbolProviders.constrainedShapeSymbolProvider,
Expand All @@ -169,7 +169,7 @@ open class ServerCodegenVisitor(
settings.codegenConfig,
codegenContext.expectModuleDocProvider(),
)
protocolGenerator = protocolGeneratorFactory.buildProtocolGenerator(codegenContext)
protocolGenerator = this.protocolGeneratorFactory.buildProtocolGenerator(codegenContext)
}

/**
Expand Down Expand Up @@ -315,7 +315,12 @@ open class ServerCodegenVisitor(
writer: RustWriter,
) {
if (codegenContext.settings.codegenConfig.publicConstrainedTypes || shape.isReachableFromOperationInput()) {
val serverBuilderGenerator = ServerBuilderGenerator(codegenContext, shape, validationExceptionConversionGenerator)
val serverBuilderGenerator = ServerBuilderGenerator(
codegenContext,
shape,
validationExceptionConversionGenerator,
protocolGenerator.protocol,
)
serverBuilderGenerator.render(rustCrate, writer)

if (codegenContext.settings.codegenConfig.publicConstrainedTypes) {
Expand All @@ -336,7 +341,12 @@ open class ServerCodegenVisitor(

if (!codegenContext.settings.codegenConfig.publicConstrainedTypes) {
val serverBuilderGeneratorWithoutPublicConstrainedTypes =
ServerBuilderGeneratorWithoutPublicConstrainedTypes(codegenContext, shape, validationExceptionConversionGenerator)
ServerBuilderGeneratorWithoutPublicConstrainedTypes(
codegenContext,
shape,
validationExceptionConversionGenerator,
protocolGenerator.protocol,
)
serverBuilderGeneratorWithoutPublicConstrainedTypes.render(rustCrate, writer)

writer.implBlock(codegenContext.symbolProvider.toSymbol(shape)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@

package software.amazon.smithy.rust.codegen.server.smithy

import software.amazon.smithy.rust.codegen.core.rustlang.InlineDependency
import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig
import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType

Expand All @@ -15,17 +14,11 @@ import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType
* For a runtime type that is used in the client, or in both the client and the server, use [RuntimeType] directly.
*/
object ServerRuntimeType {
fun forInlineDependency(inlineDependency: InlineDependency) = RuntimeType("crate::${inlineDependency.name}", inlineDependency)
fun router(runtimeConfig: RuntimeConfig) =
ServerCargoDependency.smithyHttpServer(runtimeConfig).toType().resolve("routing::Router")

fun router(runtimeConfig: RuntimeConfig) = ServerCargoDependency.smithyHttpServer(runtimeConfig).toType().resolve("routing::Router")

fun runtimeError(runtimeConfig: RuntimeConfig) = ServerCargoDependency.smithyHttpServer(runtimeConfig).toType().resolve("runtime_error::RuntimeError")

fun requestRejection(runtimeConfig: RuntimeConfig) = ServerCargoDependency.smithyHttpServer(runtimeConfig).toType().resolve("rejection::RequestRejection")

fun responseRejection(runtimeConfig: RuntimeConfig) = ServerCargoDependency.smithyHttpServer(runtimeConfig).toType().resolve("rejection::ResponseRejection")

fun protocol(name: String, path: String, runtimeConfig: RuntimeConfig) = ServerCargoDependency.smithyHttpServer(runtimeConfig).toType().resolve("proto::$path::$name")
fun protocol(name: String, path: String, runtimeConfig: RuntimeConfig) =
ServerCargoDependency.smithyHttpServer(runtimeConfig).toType().resolve("proto::$path::$name")

fun protocol(runtimeConfig: RuntimeConfig) = protocol("Protocol", "", runtimeConfig)
}
Original file line number Diff line number Diff line change
Expand Up @@ -262,7 +262,7 @@ fun validateUnsupportedConstraints(
.map { (shape, rangeTrait) -> UnsupportedRangeTraitOnShape(shape, rangeTrait as RangeTrait) }
.toSet()

// 5. `@uniqueItems` cannot reach a map shape.
// 4. `@uniqueItems` cannot reach a map shape.
// See https://github.com/awslabs/smithy/issues/1567.
val mapShapeReachableFromUniqueItemsListShapeSet = walker
.walkShapes(service)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType
import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider
import software.amazon.smithy.rust.codegen.core.util.getTrait
import software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext
import software.amazon.smithy.rust.codegen.server.smithy.ServerRuntimeType
import software.amazon.smithy.rust.codegen.server.smithy.customize.ServerCodegenDecorator
import software.amazon.smithy.rust.codegen.server.smithy.generators.BlobLength
import software.amazon.smithy.rust.codegen.server.smithy.generators.CollectionTraitInfo
Expand All @@ -35,6 +34,7 @@ import software.amazon.smithy.rust.codegen.server.smithy.generators.StringTraitI
import software.amazon.smithy.rust.codegen.server.smithy.generators.ValidationExceptionConversionGenerator
import software.amazon.smithy.rust.codegen.server.smithy.generators.isKeyConstrained
import software.amazon.smithy.rust.codegen.server.smithy.generators.isValueConstrained
import software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerProtocol
import software.amazon.smithy.rust.codegen.server.smithy.validationErrorMessage

/**
Expand Down Expand Up @@ -67,11 +67,7 @@ class ValidationExceptionWithReasonConversionGenerator(private val codegenContex
override val shapeId: ShapeId =
ShapeId.from(codegenContext.settings.codegenConfig.experimentalCustomValidationExceptionWithReasonPleaseDoNotUse)

override fun renderImplFromConstraintViolationForRequestRejection(): Writable = writable {
val codegenScope = arrayOf(
"RequestRejection" to ServerRuntimeType.requestRejection(codegenContext.runtimeConfig),
"From" to RuntimeType.From,
)
override fun renderImplFromConstraintViolationForRequestRejection(protocol: ServerProtocol): Writable = writable {
rustTemplate(
"""
impl #{From}<ConstraintViolation> for #{RequestRejection} {
Expand All @@ -89,7 +85,8 @@ class ValidationExceptionWithReasonConversionGenerator(private val codegenContex
}
}
""",
*codegenScope,
"RequestRejection" to protocol.requestRejection(codegenContext.runtimeConfig),
"From" to RuntimeType.From,
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType
import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider
import software.amazon.smithy.rust.codegen.core.util.getTrait
import software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext
import software.amazon.smithy.rust.codegen.server.smithy.ServerRuntimeType
import software.amazon.smithy.rust.codegen.server.smithy.customize.ServerCodegenDecorator
import software.amazon.smithy.rust.codegen.server.smithy.generators.BlobLength
import software.amazon.smithy.rust.codegen.server.smithy.generators.CollectionTraitInfo
Expand All @@ -34,6 +33,7 @@ import software.amazon.smithy.rust.codegen.server.smithy.generators.TraitInfo
import software.amazon.smithy.rust.codegen.server.smithy.generators.ValidationExceptionConversionGenerator
import software.amazon.smithy.rust.codegen.server.smithy.generators.isKeyConstrained
import software.amazon.smithy.rust.codegen.server.smithy.generators.isValueConstrained
import software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerProtocol
import software.amazon.smithy.rust.codegen.server.smithy.validationErrorMessage

/**
Expand Down Expand Up @@ -66,11 +66,7 @@ class SmithyValidationExceptionConversionGenerator(private val codegenContext: S
}
override val shapeId: ShapeId = SHAPE_ID

override fun renderImplFromConstraintViolationForRequestRejection(): Writable = writable {
val codegenScope = arrayOf(
"RequestRejection" to ServerRuntimeType.requestRejection(codegenContext.runtimeConfig),
"From" to RuntimeType.From,
)
override fun renderImplFromConstraintViolationForRequestRejection(protocol: ServerProtocol): Writable = writable {
rustTemplate(
"""
impl #{From}<ConstraintViolation> for #{RequestRejection} {
Expand All @@ -87,7 +83,8 @@ class SmithyValidationExceptionConversionGenerator(private val codegenContext: S
}
}
""",
*codegenScope,
"RequestRejection" to protocol.requestRejection(codegenContext.runtimeConfig),
"From" to RuntimeType.From,
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,8 @@ import software.amazon.smithy.rust.codegen.core.util.letIf
import software.amazon.smithy.rust.codegen.core.util.redactIfNecessary
import software.amazon.smithy.rust.codegen.core.util.toSnakeCase
import software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext
import software.amazon.smithy.rust.codegen.server.smithy.ServerRuntimeType
import software.amazon.smithy.rust.codegen.server.smithy.canReachConstrainedShape
import software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerProtocol
import software.amazon.smithy.rust.codegen.server.smithy.hasConstraintTraitOrTargetHasConstraintTrait
import software.amazon.smithy.rust.codegen.server.smithy.targetCanReachConstrainedShape
import software.amazon.smithy.rust.codegen.server.smithy.traits.ConstraintViolationRustBoxTrait
Expand Down Expand Up @@ -92,6 +92,7 @@ class ServerBuilderGenerator(
val codegenContext: ServerCodegenContext,
private val shape: StructureShape,
private val customValidationExceptionWithReasonConversionGenerator: ValidationExceptionConversionGenerator,
private val protocol: ServerProtocol,
) {
companion object {
/**
Expand Down Expand Up @@ -148,7 +149,7 @@ class ServerBuilderGenerator(
ServerBuilderConstraintViolations(codegenContext, shape, takeInUnconstrainedTypes, customValidationExceptionWithReasonConversionGenerator)

private val codegenScope = arrayOf(
"RequestRejection" to ServerRuntimeType.requestRejection(runtimeConfig),
"RequestRejection" to protocol.requestRejection(codegenContext.runtimeConfig),
"Structure" to structureSymbol,
"From" to RuntimeType.From,
"TryFrom" to RuntimeType.TryFrom,
Expand Down Expand Up @@ -222,7 +223,8 @@ class ServerBuilderGenerator(
"""
#{Converter:W}
""",
"Converter" to customValidationExceptionWithReasonConversionGenerator.renderImplFromConstraintViolationForRequestRejection(),
"Converter" to
customValidationExceptionWithReasonConversionGenerator.renderImplFromConstraintViolationForRequestRejection(protocol),
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ import software.amazon.smithy.rust.codegen.core.smithy.isOptional
import software.amazon.smithy.rust.codegen.core.smithy.makeOptional
import software.amazon.smithy.rust.codegen.core.smithy.module
import software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext
import software.amazon.smithy.rust.codegen.server.smithy.ServerRuntimeType
import software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerProtocol
import software.amazon.smithy.rust.codegen.server.smithy.withInMemoryInlineModule

/**
Expand All @@ -49,6 +49,7 @@ class ServerBuilderGeneratorWithoutPublicConstrainedTypes(
private val codegenContext: ServerCodegenContext,
shape: StructureShape,
validationExceptionConversionGenerator: ValidationExceptionConversionGenerator,
protocol: ServerProtocol,
) {
companion object {
/**
Expand Down Expand Up @@ -85,7 +86,7 @@ class ServerBuilderGeneratorWithoutPublicConstrainedTypes(
ServerBuilderConstraintViolations(codegenContext, shape, builderTakesInUnconstrainedTypes = false, validationExceptionConversionGenerator)

private val codegenScope = arrayOf(
"RequestRejection" to ServerRuntimeType.requestRejection(codegenContext.runtimeConfig),
"RequestRejection" to protocol.requestRejection(codegenContext.runtimeConfig),
"Structure" to structureSymbol,
"From" to RuntimeType.From,
"TryFrom" to RuntimeType.TryFrom,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import software.amazon.smithy.model.shapes.StringShape
import software.amazon.smithy.model.traits.EnumTrait
import software.amazon.smithy.rust.codegen.core.rustlang.Writable
import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider
import software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerProtocol

/**
* Collection of methods that will be invoked by the respective generators to generate code to convert constraint
Expand All @@ -26,7 +27,7 @@ interface ValidationExceptionConversionGenerator {
* Convert from a top-level operation input's constraint violation into
* `aws_smithy_http_server::rejection::RequestRejection`.
*/
fun renderImplFromConstraintViolationForRequestRejection(): Writable
fun renderImplFromConstraintViolationForRequestRejection(protocol: ServerProtocol): Writable

// Simple shapes.
fun stringShapeConstraintViolationImplBlock(stringConstraintsInfo: Collection<StringTraitInfo>): Writable
Expand Down
Loading

0 comments on commit 799e75e

Please sign in to comment.