From ae4b96c2139b7c463606e59bad32526e21a3ef91 Mon Sep 17 00:00:00 2001 From: david-perez Date: Fri, 6 May 2022 16:16:58 +0200 Subject: [PATCH 1/3] Do not generate the operation registry when there are no operations Do not generate the operation registry, nor the operation handler traits, when there are no operations in the service closure. --- codegen-server-test/build.gradle.kts | 1 + codegen-server-test/model/empty.smithy | 10 ++++++++++ .../ServerOperationHandlerGenerator.kt | 2 ++ .../ServerOperationRegistryGenerator.kt | 2 ++ .../generators/ServerServiceGenerator.kt | 20 ++++++++++++------- 5 files changed, 28 insertions(+), 7 deletions(-) create mode 100644 codegen-server-test/model/empty.smithy diff --git a/codegen-server-test/build.gradle.kts b/codegen-server-test/build.gradle.kts index f0f156dfcf..548e3b9956 100644 --- a/codegen-server-test/build.gradle.kts +++ b/codegen-server-test/build.gradle.kts @@ -33,6 +33,7 @@ dependencies { } val allCodegenTests = listOf( + CodegenTest("com.aws.example#EmptyService", "empty"), CodegenTest("com.amazonaws.simple#SimpleService", "simple"), CodegenTest("aws.protocoltests.restjson#RestJson", "rest_json"), CodegenTest("aws.protocoltests.restjson.validation#RestJsonValidation", "rest_json_validation"), diff --git a/codegen-server-test/model/empty.smithy b/codegen-server-test/model/empty.smithy new file mode 100644 index 0000000000..8aeaecf9da --- /dev/null +++ b/codegen-server-test/model/empty.smithy @@ -0,0 +1,10 @@ +$version: "1.0" + +namespace com.aws.example + +use aws.protocols#restJson1 + +@restJson1 +service EmptyService { + version: "2022-05-06", +} diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerOperationHandlerGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerOperationHandlerGenerator.kt index 2a9508408d..69c184b841 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerOperationHandlerGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerOperationHandlerGenerator.kt @@ -50,6 +50,8 @@ class ServerOperationHandlerGenerator( ) fun render(writer: RustWriter) { + check(operations.isNotEmpty()) + renderHandlerImplementations(writer, false) renderHandlerImplementations(writer, true) } diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerOperationRegistryGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerOperationRegistryGenerator.kt index ba14ee7c92..94ee1e9462 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerOperationRegistryGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerOperationRegistryGenerator.kt @@ -52,6 +52,8 @@ class ServerOperationRegistryGenerator( private val operationRegistryBuilderNameWithArguments = "$operationRegistryBuilderName<$genericArguments>" fun render(writer: RustWriter) { + check(operations.isNotEmpty()) + renderOperationRegistryStruct(writer) renderOperationRegistryBuilderStruct(writer) renderOperationRegistryBuilderError(writer) diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGenerator.kt index b66f3c2653..fbefe93ee2 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGenerator.kt @@ -13,6 +13,7 @@ import software.amazon.smithy.rust.codegen.smithy.RustCrate import software.amazon.smithy.rust.codegen.smithy.generators.protocol.ProtocolGenerator import software.amazon.smithy.rust.codegen.smithy.generators.protocol.ProtocolSupport import software.amazon.smithy.rust.codegen.smithy.protocols.HttpBindingResolver +import java.util.logging.Logger /** * ServerServiceGenerator @@ -28,6 +29,7 @@ class ServerServiceGenerator( private val context: CodegenContext, ) { private val index = TopDownIndex.of(context.model) + private val logger = Logger.getLogger(javaClass.name) /** * Render Service Specific code. Code will end up in different files via [useShapeWriter]. See `SymbolVisitor.kt` @@ -52,13 +54,17 @@ class ServerServiceGenerator( } } } - rustCrate.withModule(RustModule.public("operation_handler", "Operation handlers definition and implementation.")) { writer -> - ServerOperationHandlerGenerator(context, operations) - .render(writer) - } - rustCrate.withModule(RustModule.public("operation_registry", "A registry of your service's operations.")) { writer -> - ServerOperationRegistryGenerator(context, httpBindingResolver, operations) - .render(writer) + if (operations.isNotEmpty()) { + rustCrate.withModule(RustModule.public("operation_handler", "Operation handlers definition and implementation.")) { writer -> + ServerOperationHandlerGenerator(context, operations) + .render(writer) + } + rustCrate.withModule(RustModule.public("operation_registry", "A registry of your service's operations.")) { writer -> + ServerOperationRegistryGenerator(context, httpBindingResolver, operations) + .render(writer) + } + } else { + logger.warning("[rust-server-codegen] There are no operations in the service closure") } } } From 35abc94fe0d628210b8386a2befd59a41a3aaffb Mon Sep 17 00:00:00 2001 From: david-perez Date: Wed, 8 Jun 2022 19:23:18 +0200 Subject: [PATCH 2/3] Add empty service to the client tests too --- codegen-test/build.gradle.kts | 1 + 1 file changed, 1 insertion(+) diff --git a/codegen-test/build.gradle.kts b/codegen-test/build.gradle.kts index 14ded6490d..77bcea089a 100644 --- a/codegen-test/build.gradle.kts +++ b/codegen-test/build.gradle.kts @@ -35,6 +35,7 @@ dependencies { } val allCodegenTests = listOf( + CodegenTest("com.aws.example#EmptyService", "empty"), CodegenTest("com.amazonaws.simple#SimpleService", "simple"), CodegenTest("com.amazonaws.dynamodb#DynamoDB_20120810", "dynamo"), CodegenTest("com.amazonaws.ebs#Ebs", "ebs"), From e8c5cd09efa1d3fbc787b1a644791cbdc9d39163 Mon Sep 17 00:00:00 2001 From: david-perez Date: Thu, 9 Jun 2022 13:26:02 +0200 Subject: [PATCH 3/3] fix client; refactor --- codegen-server-test/model/empty.smithy | 11 +----- .../generators/ServerServiceGenerator.kt | 34 +++++++++++++------ codegen-test/model/empty.smithy | 10 ++++++ .../smithy/generators/ServiceGenerator.kt | 3 +- .../client/FluentClientDecorator.kt | 2 +- 5 files changed, 37 insertions(+), 23 deletions(-) mode change 100644 => 120000 codegen-server-test/model/empty.smithy create mode 100644 codegen-test/model/empty.smithy diff --git a/codegen-server-test/model/empty.smithy b/codegen-server-test/model/empty.smithy deleted file mode 100644 index 8aeaecf9da..0000000000 --- a/codegen-server-test/model/empty.smithy +++ /dev/null @@ -1,10 +0,0 @@ -$version: "1.0" - -namespace com.aws.example - -use aws.protocols#restJson1 - -@restJson1 -service EmptyService { - version: "2022-05-06", -} diff --git a/codegen-server-test/model/empty.smithy b/codegen-server-test/model/empty.smithy new file mode 120000 index 0000000000..89a554db1f --- /dev/null +++ b/codegen-server-test/model/empty.smithy @@ -0,0 +1 @@ +../../codegen-test/model/empty.smithy \ No newline at end of file diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGenerator.kt index a7abca795f..8077b7afdf 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGenerator.kt @@ -37,6 +37,12 @@ class ServerServiceGenerator( */ fun render() { val operations = index.getContainedOperations(context.serviceShape).sortedBy { it.id } + + if (operations.isEmpty()) { + logger.warning("[rust-server-codegen] There are no operations in the service closure") + return + } + for (operation in operations) { rustCrate.useShapeWriter(operation) { operationWriter -> protocolGenerator.serverRenderOperation( @@ -54,17 +60,23 @@ class ServerServiceGenerator( } } } - if (operations.isNotEmpty()) { - rustCrate.withModule(RustModule.public("operation_handler", "Operation handlers definition and implementation.")) { writer -> - ServerOperationHandlerGenerator(context, operations) - .render(writer) - } - rustCrate.withModule(RustModule.public("operation_registry", "A registry of your service's operations.")) { writer -> - ServerOperationRegistryGenerator(context, httpBindingResolver, operations) - .render(writer) - } - } else { - logger.warning("[rust-server-codegen] There are no operations in the service closure") + rustCrate.withModule( + RustModule.public( + "operation_handler", + "Operation handlers definition and implementation." + ) + ) { writer -> + ServerOperationHandlerGenerator(context, operations) + .render(writer) + } + rustCrate.withModule( + RustModule.public( + "operation_registry", + "A registry of your service's operations." + ) + ) { writer -> + ServerOperationRegistryGenerator(context, httpBindingResolver, operations) + .render(writer) } } } diff --git a/codegen-test/model/empty.smithy b/codegen-test/model/empty.smithy new file mode 100644 index 0000000000..8aeaecf9da --- /dev/null +++ b/codegen-test/model/empty.smithy @@ -0,0 +1,10 @@ +$version: "1.0" + +namespace com.aws.example + +use aws.protocols#restJson1 + +@restJson1 +service EmptyService { + version: "2022-05-06", +} diff --git a/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/generators/ServiceGenerator.kt b/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/generators/ServiceGenerator.kt index 092f427556..8b0a516580 100644 --- a/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/generators/ServiceGenerator.kt +++ b/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/generators/ServiceGenerator.kt @@ -40,7 +40,8 @@ class ServiceGenerator( */ fun render() { val operations = index.getContainedOperations(config.serviceShape).sortedBy { it.id } - operations.map { operation -> + + for (operation in operations) { rustCrate.useShapeWriter(operation) { operationWriter -> rustCrate.useShapeWriter(operation.inputShape(config.model)) { inputWriter -> // Render the operation shape & serializers input `input.rs` diff --git a/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/generators/client/FluentClientDecorator.kt b/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/generators/client/FluentClientDecorator.kt index dee8208300..acf21787ec 100644 --- a/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/generators/client/FluentClientDecorator.kt +++ b/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/generators/client/FluentClientDecorator.kt @@ -322,7 +322,7 @@ class FluentClientGenerator( """ ##[derive(Debug)] pub(crate) struct Handle#{generics_decl:W} { - pub(crate) client: #{client}::Client#{smithy_inst:W}, + ##[allow(dead_code)] pub(crate) client: #{client}::Client#{smithy_inst:W}, pub(crate) conf: crate::Config, }