diff --git a/modules/openapi-generator/src/main/resources/rust-server/Cargo.mustache b/modules/openapi-generator/src/main/resources/rust-server/Cargo.mustache index 3d145ccb6c50..1367e580b1de 100644 --- a/modules/openapi-generator/src/main/resources/rust-server/Cargo.mustache +++ b/modules/openapi-generator/src/main/resources/rust-server/Cargo.mustache @@ -43,8 +43,11 @@ client = [ {{#usesUrlEncodedForm}} "serde_urlencoded", {{/usesUrlEncodedForm}} +{{^apiUsesByteArray}} + "lazy_static", "regex", +{{/apiUsesByteArray}} {{#hasCallbacks}} - "serde_ignored", "percent-encoding", {{^apiUsesByteArray}}"lazy_static", "regex",{{/apiUsesByteArray}} + "serde_ignored", "percent-encoding", {{/hasCallbacks}} {{! Anything added to the list below, should probably be added to the callbacks list below }} "hyper", "percent-encoding", "hyper-util/http1", "hyper-util/http2", "url" @@ -108,7 +111,7 @@ serde_json = "1.0" {{#apiUsesIntegerEnums}} serde_repr = "0.1" {{/apiUsesIntegerEnums}} -serde_valid = { version = "2.0", optional = true } +serde_valid = { version = ">=2.0, <2.0.2", optional = true } validator = { version = "0.20", features = ["derive"] } diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/rust/RustServerCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/rust/RustServerCodegenTest.java index e6d664e26762..edb878f960f4 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/rust/RustServerCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/rust/RustServerCodegenTest.java @@ -3,6 +3,7 @@ import org.openapitools.codegen.DefaultGenerator; import org.openapitools.codegen.TestUtils; import org.openapitools.codegen.config.CodegenConfigurator; +import org.testng.Assert; import org.testng.annotations.Test; import java.io.File; @@ -112,4 +113,42 @@ public void testRequiredQueryParamWithoutExampleDisablesClientExample() throws I // Clean up target.toFile().deleteOnExit(); } + + /** + * Test that model pattern validation dependencies are enabled for client-only builds. + */ + @Test + public void testClientFeatureIncludesPatternValidationDependencies() throws IOException { + Path target = Files.createTempDirectory("test"); + final CodegenConfigurator configurator = new CodegenConfigurator() + .setGeneratorName("rust-server") + .setInputSpec("src/test/resources/3_0/rust-server/pattern-validation-client-feature.yaml") + .setSkipOverwrite(false) + .setOutputDir(target.toAbsolutePath().toString().replace("\\", "/")); + List files = new DefaultGenerator().opts(configurator.toClientOptInput()).generate(); + files.forEach(File::deleteOnExit); + + Path cargoPath = Path.of(target.toString(), "/Cargo.toml"); + Path modelsPath = Path.of(target.toString(), "/src/models.rs"); + TestUtils.assertFileExists(cargoPath); + TestUtils.assertFileExists(modelsPath); + + TestUtils.assertFileContains(modelsPath, "lazy_static::lazy_static!"); + TestUtils.assertFileContains(modelsPath, "regex::Regex"); + + String cargoToml = Files.readString(cargoPath); + int clientStart = cargoToml.indexOf("client = ["); + int clientEnd = cargoToml.indexOf("]\n# TLS support", clientStart); + Assert.assertTrue(clientStart >= 0, "Generated Cargo.toml should contain a client feature"); + Assert.assertTrue(clientEnd > clientStart, "Generated Cargo.toml should close the client feature before TLS support"); + String clientFeature = cargoToml.substring(clientStart, clientEnd); + Assert.assertTrue(clientFeature.contains("\"lazy_static\""), + "Client-only builds need lazy_static when shared models emit pattern validation statics"); + Assert.assertTrue(clientFeature.contains("\"regex\""), + "Client-only builds need regex when shared models emit pattern validation statics"); + TestUtils.assertFileContains(cargoPath, "serde_valid = { version = \">=2.0, <2.0.2\", optional = true }"); + + // Clean up + target.toFile().deleteOnExit(); + } } diff --git a/modules/openapi-generator/src/test/resources/3_0/rust-server/pattern-validation-client-feature.yaml b/modules/openapi-generator/src/test/resources/3_0/rust-server/pattern-validation-client-feature.yaml new file mode 100644 index 000000000000..252e5cae4a58 --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/rust-server/pattern-validation-client-feature.yaml @@ -0,0 +1,25 @@ +openapi: 3.0.3 +info: + title: Rust server pattern validation client feature test + version: 1.0.0 +paths: + /phone: + get: + operationId: getPhone + responses: + "200": + description: OK + content: + application/json: + schema: + $ref: "#/components/schemas/PhoneNumber" +components: + schemas: + PhoneNumber: + type: object + required: + - value + properties: + value: + type: string + pattern: '^\\+[1-9]\\d{1,14}$' diff --git a/samples/server/petstore/rust-server/output/multipart-v3/Cargo.toml b/samples/server/petstore/rust-server/output/multipart-v3/Cargo.toml index 9712bd2a7c2c..c9a2e1fe3386 100644 --- a/samples/server/petstore/rust-server/output/multipart-v3/Cargo.toml +++ b/samples/server/petstore/rust-server/output/multipart-v3/Cargo.toml @@ -57,7 +57,7 @@ regex = "1.12" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" -serde_valid = { version = "2.0", optional = true } +serde_valid = { version = ">=2.0, <2.0.2", optional = true } validator = { version = "0.20", features = ["derive"] } diff --git a/samples/server/petstore/rust-server/output/no-example-v3/Cargo.toml b/samples/server/petstore/rust-server/output/no-example-v3/Cargo.toml index 9e73002e56fe..f6248374399d 100644 --- a/samples/server/petstore/rust-server/output/no-example-v3/Cargo.toml +++ b/samples/server/petstore/rust-server/output/no-example-v3/Cargo.toml @@ -10,6 +10,7 @@ edition = "2018" [features] default = ["client", "server", "client-tls"] client = [ + "lazy_static", "regex", "hyper", "percent-encoding", "hyper-util/http1", "hyper-util/http2", "url" ] # TLS support - automatically selects backend based on target OS: @@ -51,7 +52,7 @@ mockall = { version = "0.14", optional = true } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" -serde_valid = { version = "2.0", optional = true } +serde_valid = { version = ">=2.0, <2.0.2", optional = true } validator = { version = "0.20", features = ["derive"] } diff --git a/samples/server/petstore/rust-server/output/openapi-v3/Cargo.toml b/samples/server/petstore/rust-server/output/openapi-v3/Cargo.toml index 3fdf5173ea2e..49f8a1fc53a1 100644 --- a/samples/server/petstore/rust-server/output/openapi-v3/Cargo.toml +++ b/samples/server/petstore/rust-server/output/openapi-v3/Cargo.toml @@ -11,7 +11,7 @@ edition = "2018" default = ["client", "server", "client-tls"] client = [ "serde_urlencoded", - "serde_ignored", "percent-encoding", + "serde_ignored", "percent-encoding", "hyper", "percent-encoding", "hyper-util/http1", "hyper-util/http2", "url" ] # TLS support - automatically selects backend based on target OS: @@ -56,7 +56,7 @@ regex = "1.12" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" -serde_valid = { version = "2.0", optional = true } +serde_valid = { version = ">=2.0, <2.0.2", optional = true } validator = { version = "0.20", features = ["derive"] } diff --git a/samples/server/petstore/rust-server/output/ops-v3/Cargo.toml b/samples/server/petstore/rust-server/output/ops-v3/Cargo.toml index 12c55c614ae5..3c5471e007f2 100644 --- a/samples/server/petstore/rust-server/output/ops-v3/Cargo.toml +++ b/samples/server/petstore/rust-server/output/ops-v3/Cargo.toml @@ -10,6 +10,7 @@ edition = "2018" [features] default = ["client", "server", "client-tls"] client = [ + "lazy_static", "regex", "hyper", "percent-encoding", "hyper-util/http1", "hyper-util/http2", "url" ] # TLS support - automatically selects backend based on target OS: @@ -51,7 +52,7 @@ mockall = { version = "0.14", optional = true } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" -serde_valid = { version = "2.0", optional = true } +serde_valid = { version = ">=2.0, <2.0.2", optional = true } validator = { version = "0.20", features = ["derive"] } diff --git a/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/Cargo.toml b/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/Cargo.toml index 3835cb94a4b1..db9339f6279d 100644 --- a/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/Cargo.toml +++ b/samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/Cargo.toml @@ -58,7 +58,7 @@ regex = "1.12" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" serde_repr = "0.1" -serde_valid = { version = "2.0", optional = true } +serde_valid = { version = ">=2.0, <2.0.2", optional = true } validator = { version = "0.20", features = ["derive"] } diff --git a/samples/server/petstore/rust-server/output/ping-bearer-auth/Cargo.toml b/samples/server/petstore/rust-server/output/ping-bearer-auth/Cargo.toml index 92666ec67329..31d148944872 100644 --- a/samples/server/petstore/rust-server/output/ping-bearer-auth/Cargo.toml +++ b/samples/server/petstore/rust-server/output/ping-bearer-auth/Cargo.toml @@ -10,6 +10,7 @@ edition = "2018" [features] default = ["client", "server", "client-tls"] client = [ + "lazy_static", "regex", "hyper", "percent-encoding", "hyper-util/http1", "hyper-util/http2", "url" ] # TLS support - automatically selects backend based on target OS: @@ -51,7 +52,7 @@ mockall = { version = "0.14", optional = true } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" -serde_valid = { version = "2.0", optional = true } +serde_valid = { version = ">=2.0, <2.0.2", optional = true } validator = { version = "0.20", features = ["derive"] } diff --git a/samples/server/petstore/rust-server/output/rust-server-test/Cargo.toml b/samples/server/petstore/rust-server/output/rust-server-test/Cargo.toml index 8a9ac600d58a..df8f404e92d4 100644 --- a/samples/server/petstore/rust-server/output/rust-server-test/Cargo.toml +++ b/samples/server/petstore/rust-server/output/rust-server-test/Cargo.toml @@ -10,6 +10,7 @@ edition = "2018" [features] default = ["client", "server", "client-tls"] client = [ + "lazy_static", "regex", "hyper", "percent-encoding", "hyper-util/http1", "hyper-util/http2", "url" ] # TLS support - automatically selects backend based on target OS: @@ -51,7 +52,7 @@ mockall = { version = "0.14", optional = true } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" -serde_valid = { version = "2.0", optional = true } +serde_valid = { version = ">=2.0, <2.0.2", optional = true } validator = { version = "0.20", features = ["derive"] }