Unverified Commit c10899da authored by Russell Cohen's avatar Russell Cohen Committed by GitHub
Browse files

Backfill message & parse without case sensitivity (#565)

* Backfill message & parse without case sensitivity

* Allow empty errors for XML protocols
parent 59f9c42b
Loading
Loading
Loading
Loading
+20 −7
Original line number Diff line number Diff line
@@ -30,21 +30,34 @@ val CodegenTests = listOf(
    CodegenTest("aws.protocoltests.json10#JsonRpc10", "json_rpc10"),
    CodegenTest("aws.protocoltests.json#JsonProtocol", "json_rpc11"),
    CodegenTest("aws.protocoltests.restjson#RestJson", "rest_json"),
    CodegenTest("aws.protocoltests.restjson#RestJsonExtras", "rest_json_extas"),
    CodegenTest("aws.protocoltests.restxml#RestXml", "rest_xml"),
    CodegenTest("aws.protocoltests.query#AwsQuery", "aws_query"),
    CodegenTest("aws.protocoltests.ec2#AwsEc2", "ec2_query"),
    CodegenTest("aws.protocoltests.restjson#RestJsonExtras", "rest_json_extras"),
    CodegenTest(
        "aws.protocoltests.restxml#RestXml", "rest_xml",
        extraConfig = """, "codegen": { "addMessageToErrors": false } """
    ),

    CodegenTest(
        "aws.protocoltests.query#AwsQuery", "aws_query",
        extraConfig = """, "codegen": { "addMessageToErrors": false } """
    ),
    CodegenTest(
        "aws.protocoltests.ec2#AwsEc2", "ec2_query",
        extraConfig = """, "codegen": { "addMessageToErrors": false } """
    ),
    CodegenTest(
        "aws.protocoltests.restxml.xmlns#RestXmlWithNamespace",
        "rest_xml_namespace"
        "rest_xml_namespace",
        extraConfig = """, "codegen": { "addMessageToErrors": false } """
    ),
    CodegenTest(
        "aws.protocoltests.restxml#RestXmlExtras",
        "rest_xml_extras"
        "rest_xml_extras",
        extraConfig = """, "codegen": { "addMessageToErrors": false } """
    ),
    CodegenTest(
        "aws.protocoltests.restxmlunwrapped#RestXmlExtrasUnwrappedErrors",
        "rest_xml_extras_unwrapped"
        "rest_xml_extras_unwrapped",
        extraConfig = """, "codegen": { "addMessageToErrors": false } """
    ),
    CodegenTest(
        "crate#Config",
+21 −0
Original line number Diff line number Diff line
@@ -62,6 +62,7 @@ service RestJsonExtras {
        PrimitiveIntOp,
        EscapedStringValues,
        NullInNonSparse,
        CaseInsensitiveErrorOperation
    ]
}

@@ -268,3 +269,23 @@ structure NullInNonSparseOutput {
operation NullInNonSparse {
    output: NullInNonSparseOutput,
}

@http(uri: "/error-sensitive", method: "POST")
operation CaseInsensitiveErrorOperation {
    errors: [CaseInsensitiveError]
}

@httpResponseTests([
    {
        id: "Upper case error modeled lower case",
        protocol: "aws.protocols#restJson1",
        code: 500,
        body: "{\"Message\": \"hello\"}",
        headers: { "X-Amzn-Errortype": "CaseInsensitiveError" },
        params: { message: "hello" }
    }
])
@error("server")
structure CaseInsensitiveError {
    message: String
}
+4 −1
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import software.amazon.smithy.rust.codegen.smithy.generators.UnionGenerator
import software.amazon.smithy.rust.codegen.smithy.generators.implBlock
import software.amazon.smithy.rust.codegen.smithy.protocols.ProtocolLoader
import software.amazon.smithy.rust.codegen.smithy.traits.SyntheticInputTrait
import software.amazon.smithy.rust.codegen.smithy.transformers.AddErrorMessage
import software.amazon.smithy.rust.codegen.smithy.transformers.RecursiveShapeBoxer
import software.amazon.smithy.rust.codegen.util.CommandFailed
import software.amazon.smithy.rust.codegen.util.getTrait
@@ -74,7 +75,9 @@ class CodegenVisitor(context: PluginContext, private val codegenDecorator: RustC
        httpGenerator = protocolGenerator.buildProtocolGenerator(protocolConfig)
    }

    private fun baselineTransform(model: Model) = model.let(RecursiveShapeBoxer::transform)
    private fun baselineTransform(model: Model) =
        model.let(RecursiveShapeBoxer::transform)
            .letIf(settings.codegenConfig.addMessageToErrors, AddErrorMessage::transform)

    fun execute() {
        logger.info("generating Rust client...")
+19 −2
Original line number Diff line number Diff line
@@ -28,14 +28,31 @@ private const val RUNTIME_CONFIG = "runtimeConfig"
private const val CODEGEN_SETTINGS = "codegen"
private const val LICENSE = "license"

data class CodegenConfig(val renameExceptions: Boolean = true, val includeFluentClient: Boolean = true, val formatTimeoutSeconds: Int = 20) {
/**
 * Configuration of codegen settings
 *
 * [renameExceptions]: Rename `Exception` to `Error` in the generated SDK
 * [includeFluentClient]: Generate a `client` module in the generated SDK (currently the AWS SDK sets this to false
 *   and generates its own client)
 *
 * [addMessageToErrors]: Adds a `message` field automatically to all error shapes
 * [formatTimeoutSeconds]: Timeout for running cargo fmt at the end of code generation
 */
data class CodegenConfig(
    val renameExceptions: Boolean = true,
    val includeFluentClient: Boolean = true,
    val addMessageToErrors: Boolean = true,
    val formatTimeoutSeconds: Int = 20
) {
    companion object {
        fun fromNode(node: Optional<ObjectNode>): CodegenConfig {
            return if (node.isPresent) {
                CodegenConfig(
                    node.get().getBooleanMemberOrDefault("renameErrors", true),
                    node.get().getBooleanMemberOrDefault("includeFluentClient", true),
                    node.get().getNumberMemberOrDefault("formatTimeoutSeconds", 20).toInt()
                    node.get().getBooleanMemberOrDefault("addMessageToErrors", true),
                    node.get().getNumberMemberOrDefault("formatTimeoutSeconds", 20).toInt(),

                )
            } else {
                CodegenConfig()
+2 −0
Original line number Diff line number Diff line
@@ -426,6 +426,8 @@ class HttpProtocolTestGenerator(
        private val AwsJson11 = "aws.protocoltests.json#JsonProtocol"
        private val RestJson = "aws.protocoltests.restjson#RestJson"
        private val RestXml = "aws.protocoltests.restxml#RestXml"
        private val AwsQuery = "aws.protocoltests.query#AwsQuery"
        private val Ec2Query = "aws.protocoltests.ec2#AwsEc2"
        private val ExpectFail = setOf<FailingTest>()
        private val RunOnly: Set<String>? = null

Loading