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..83c94e44d0ed --- /dev/null +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/rust/RustAxumServerCodegenTest.java @@ -0,0 +1,35 @@ +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.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; + +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("\\", "/")); + 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\", " + + "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