From 237185d84314dbe1367de391fec27147ce27c879 Mon Sep 17 00:00:00 2001 From: Rens Groothuijsen Date: Sun, 8 Jun 2025 19:46:16 +0200 Subject: [PATCH 1/2] [rust-axum] Prevent multiple declarations of the same operation --- .../languages/RustAxumServerCodegen.java | 8 +++++ .../rust/RustAxumServerCodegenTest.java | 32 ++++++++++++++++++ .../src/test/resources/3_1/issue_21144.yaml | 33 +++++++++++++++++++ 3 files changed, 73 insertions(+) create mode 100644 modules/openapi-generator/src/test/java/org/openapitools/codegen/rust/RustAxumServerCodegenTest.java create mode 100644 modules/openapi-generator/src/test/resources/3_1/issue_21144.yaml diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RustAxumServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RustAxumServerCodegen.java index 9bf2762fbb66..725708a1a9a4 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RustAxumServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/RustAxumServerCodegen.java @@ -429,6 +429,14 @@ public CodegenOperation fromOperation(String path, String httpMethod, Operation CodegenOperation op = super.fromOperation(path, httpMethod, operation, servers); String underscoredOperationId = underscore(op.operationId); + ArrayList pathMethods = pathMethodOpMap.get(path); + + // Prevent multiple declarations of the same operation + if (pathMethods != null && pathMethods.stream().anyMatch(pathMethod -> + pathMethod.operationID.equals(underscoredOperationId))) { + return op; + } + op.vendorExtensions.put("x-operation-id", underscoredOperationId); op.vendorExtensions.put("x-uppercase-operation-id", underscoredOperationId.toUpperCase(Locale.ROOT)); diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/rust/RustAxumServerCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/rust/RustAxumServerCodegenTest.java new file mode 100644 index 000000000000..3c9f450e5672 --- /dev/null +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/rust/RustAxumServerCodegenTest.java @@ -0,0 +1,32 @@ +package org.openapitools.codegen.rust; + +import org.openapitools.codegen.DefaultGenerator; +import org.openapitools.codegen.TestUtils; +import org.openapitools.codegen.config.CodegenConfigurator; +import org.testng.annotations.Test; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +import static org.openapitools.codegen.TestUtils.linearize; + +public class RustAxumServerCodegenTest { + @Test + public void testPreventDuplicateOperationDeclaration() throws IOException { + Path target = Files.createTempDirectory("test"); + final CodegenConfigurator configurator = new CodegenConfigurator() + .setGeneratorName("rust-axum") + .setInputSpec("src/test/resources/3_1/issue_21144.yaml") + .setSkipOverwrite(false) + .setOutputDir(target.toAbsolutePath().toString().replace("\\", "/")); + new DefaultGenerator().opts(configurator.toClientOptInput()).generate(); + Path outputPath = Path.of(target.toString(), "/src/server/mod.rs"); + String routerSpec = linearize("Router::new() " + + ".route(\"/api/test\", " + + "delete(test_delete::).post(test_post::) ) " + + ".with_state(api_impl)"); + TestUtils.assertFileExists(outputPath); + TestUtils.assertFileContains(outputPath, routerSpec); + } +} \ No newline at end of file diff --git a/modules/openapi-generator/src/test/resources/3_1/issue_21144.yaml b/modules/openapi-generator/src/test/resources/3_1/issue_21144.yaml new file mode 100644 index 000000000000..749cc5ab38f1 --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_1/issue_21144.yaml @@ -0,0 +1,33 @@ +openapi: 3.0.0 +info: + title: "test" + version: "0.1.1" + description: "test" +paths: + /api/test: + delete: + operationId: "test_delete" + description: "Delete method" + responses: + 204: + description: "delete" + security: + - apiKey: [] + post: + tags: + - firsttag + - secondtag + - thirdtag + operationId: "test_post" + description: "Post method" + responses: + 201: + description: "post" + security: + - apiKey: [] +components: + securitySchemes: + apiKey: + type: apiKey + name: X-API-Key + in: header \ No newline at end of file From d77ddf425e1cdfbd8e8fb3858faffb40b1c235ac Mon Sep 17 00:00:00 2001 From: Rens Groothuijsen Date: Tue, 10 Jun 2025 02:22:47 +0200 Subject: [PATCH 2/2] [rust-axum] Add missing "delete on exit" to duplicate declaration test --- .../openapitools/codegen/rust/RustAxumServerCodegenTest.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/rust/RustAxumServerCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/rust/RustAxumServerCodegenTest.java index 3c9f450e5672..83c94e44d0ed 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/rust/RustAxumServerCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/rust/RustAxumServerCodegenTest.java @@ -5,9 +5,11 @@ import org.openapitools.codegen.config.CodegenConfigurator; import org.testng.annotations.Test; +import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.util.List; import static org.openapitools.codegen.TestUtils.linearize; @@ -20,7 +22,8 @@ public void testPreventDuplicateOperationDeclaration() throws IOException { .setInputSpec("src/test/resources/3_1/issue_21144.yaml") .setSkipOverwrite(false) .setOutputDir(target.toAbsolutePath().toString().replace("\\", "/")); - new DefaultGenerator().opts(configurator.toClientOptInput()).generate(); + List files = new DefaultGenerator().opts(configurator.toClientOptInput()).generate(); + files.forEach(File::deleteOnExit); Path outputPath = Path.of(target.toString(), "/src/server/mod.rs"); String routerSpec = linearize("Router::new() " + ".route(\"/api/test\", " +