Loading codegen-test/build.gradle.kts +20 −7 Original line number Diff line number Diff line Loading @@ -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", Loading codegen-test/model/rest-json-extras.smithy +21 −0 Original line number Diff line number Diff line Loading @@ -62,6 +62,7 @@ service RestJsonExtras { PrimitiveIntOp, EscapedStringValues, NullInNonSparse, CaseInsensitiveErrorOperation ] } Loading Loading @@ -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 } codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenVisitor.kt +4 −1 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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...") Loading codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/RustSettings.kt +19 −2 Original line number Diff line number Diff line Loading @@ -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() Loading codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/generators/HttpProtocolTestGenerator.kt +2 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
codegen-test/build.gradle.kts +20 −7 Original line number Diff line number Diff line Loading @@ -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", Loading
codegen-test/model/rest-json-extras.smithy +21 −0 Original line number Diff line number Diff line Loading @@ -62,6 +62,7 @@ service RestJsonExtras { PrimitiveIntOp, EscapedStringValues, NullInNonSparse, CaseInsensitiveErrorOperation ] } Loading Loading @@ -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 }
codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenVisitor.kt +4 −1 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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...") Loading
codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/RustSettings.kt +19 −2 Original line number Diff line number Diff line Loading @@ -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() Loading
codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/generators/HttpProtocolTestGenerator.kt +2 −0 Original line number Diff line number Diff line Loading @@ -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