From d565a0528d13f3b6981d817048593be08e52db10 Mon Sep 17 00:00:00 2001 From: david-perez Date: Fri, 3 Jun 2022 14:28:11 +0200 Subject: [PATCH] Only generate `@error` `message` getter when defined in the model We are currently generating a useless `message` getter that returns `None` even when the `message` field is not defined in the model. Granted, in the client this field is _almost always_ there, because the `AddErrorMessage` model transformer is applied unless the user opts out in their `smithy-build.json`. --- .../smithy/generators/error/ErrorGenerator.kt | 27 ++++++++++--------- .../smithy/transformers/AddErrorMessage.kt | 6 ++--- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/generators/error/ErrorGenerator.kt b/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/generators/error/ErrorGenerator.kt index da4c699f49..c3e495827e 100644 --- a/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/generators/error/ErrorGenerator.kt +++ b/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/generators/error/ErrorGenerator.kt @@ -69,13 +69,6 @@ class ErrorGenerator( val symbol = symbolProvider.toSymbol(shape) val messageShape = shape.errorMessageMember() val errorKindT = RuntimeType.errorKind(symbolProvider.config().runtimeConfig) - val (returnType, message) = messageShape?.let { - if (symbolProvider.toSymbol(messageShape).isOptional()) { - "Option<&str>" to "self.${symbolProvider.toMemberName(it)}.as_deref()" - } else { - "&str" to "self.${symbolProvider.toMemberName(it)}.as_ref()" - } - } ?: "Option<&str>" to "None" writer.rustBlock("impl ${symbol.name}") { val retryKindWriteable = shape.modeledRetryKind(error)?.writable(symbolProvider.config().runtimeConfig) if (retryKindWriteable != null) { @@ -84,12 +77,20 @@ class ErrorGenerator( retryKindWriteable(this) } } - rust( - """ - /// Returns the error message. - pub fn message(&self) -> $returnType { $message } - """ - ) + if (messageShape != null) { + val (returnType, message) = if (symbolProvider.toSymbol(messageShape).isOptional()) { + "Option<&str>" to "self.${symbolProvider.toMemberName(messageShape)}.as_deref()" + } else { + "&str" to "self.${symbolProvider.toMemberName(messageShape)}.as_ref()" + } + + rust( + """ + /// Returns the error message. + pub fn message(&self) -> $returnType { $message } + """ + ) + } /* * If we're generating for a server, the `name` method is added to enable diff --git a/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/transformers/AddErrorMessage.kt b/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/transformers/AddErrorMessage.kt index 797884d86a..834a9313f5 100644 --- a/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/transformers/AddErrorMessage.kt +++ b/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/transformers/AddErrorMessage.kt @@ -18,11 +18,11 @@ import java.util.logging.Logger fun StructureShape.errorMessageMember(): MemberShape? = this.getMember("message").or { this.getMember("Message") }.orNull() /** - * Ensure that all errors have error messages + * Ensure that all errors have error messages. * * Not all errors are modeled with an error message field. However, in many cases, the server can still send an error. * If an error, specifically, a structure shape with the error trait does not have a member `message` or `Message`, - * this transformer will add a `message` member targetting a string. + * this transformer will add a `message` member targeting a string. * * This ensures that we always generate a modeled error message field enabling end users to easily extract the error * message when present. @@ -33,7 +33,7 @@ object AddErrorMessage { private val logger = Logger.getLogger("AddErrorMessage") /** - * Ensure that all errors have error messages + * Ensure that all errors have error messages. */ fun transform(model: Model): Model { return ModelTransformer.create().mapShapes(model) { shape ->