diff --git a/modules/openapi-generator/src/main/resources/rust/model.mustache b/modules/openapi-generator/src/main/resources/rust/model.mustache index 3a89ab2299c0..ccf933499438 100644 --- a/modules/openapi-generator/src/main/resources/rust/model.mustache +++ b/modules/openapi-generator/src/main/resources/rust/model.mustache @@ -25,6 +25,11 @@ use serde_repr::{Serialize_repr,Deserialize_repr}; pub enum {{{classname}}} { {{#allowableValues}} {{#enumVars}} +{{#-last}} +{{#enumUnknownDefaultCase}} + #[serde(other)] +{{/enumUnknownDefaultCase}} +{{/-last}} {{{name}}} = {{{value}}}, {{/enumVars}}{{/allowableValues}} } @@ -51,6 +56,11 @@ pub enum {{{classname}}} { {{#allowableValues}} {{#enumVars}} #[serde(rename = "{{{value}}}")] +{{#-last}} +{{#enumUnknownDefaultCase}} + #[serde(other)] +{{/enumUnknownDefaultCase}} +{{/-last}} {{{name}}}, {{/enumVars}}{{/allowableValues}} } @@ -216,6 +226,11 @@ impl Default for {{classname}} { pub enum {{{enumName}}} { {{#allowableValues}} {{#enumVars}} +{{#-last}} +{{#enumUnknownDefaultCase}} + #[serde(other)] +{{/enumUnknownDefaultCase}} +{{/-last}} {{{name}}} = {{{value}}}, {{/enumVars}} {{/allowableValues}} @@ -240,6 +255,11 @@ pub enum {{{enumName}}} { {{#allowableValues}} {{#enumVars}} #[serde(rename = "{{{value}}}")] +{{#-last}} +{{#enumUnknownDefaultCase}} + #[serde(other)] +{{/enumUnknownDefaultCase}} +{{/-last}} {{{name}}}, {{/enumVars}} {{/allowableValues}} diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/rust/RustClientCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/rust/RustClientCodegenTest.java index f38ffeab1973..f3226a077d53 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/rust/RustClientCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/rust/RustClientCodegenTest.java @@ -550,4 +550,31 @@ public void testReqwestPathParameterSpaceEncoding() throws IOException { TestUtils.assertFileContains(Path.of(target.toString(), "/Cargo.toml"), "percent-encoding"); } } -} + + @Test + public void testEnumUnknownDefaultCaseUsesSerdeOther() throws IOException { + Path target = Files.createTempDirectory("test"); + target.toFile().deleteOnExit(); + final CodegenConfigurator configurator = new CodegenConfigurator() + .setGeneratorName("rust") + .addAdditionalProperty(CodegenConstants.ENUM_UNKNOWN_DEFAULT_CASE, true) + .setInputSpec("src/test/resources/3_0/rust/enum-unknown-default-case.yaml") + .setSkipOverwrite(false) + .setOutputDir(target.toAbsolutePath().toString().replace("\\", "/")); + List files = new DefaultGenerator().opts(configurator.toClientOptInput()).generate(); + files.forEach(File::deleteOnExit); + + // string enum schema + Path petKindPath = Path.of(target.toString(), "/src/models/pet_kind.rs"); + TestUtils.assertFileExists(petKindPath); + TestUtils.assertFileContains(petKindPath, + "#[serde(rename = \"unknown_default_open_api\")] #[serde(other)] UnknownDefaultOpenApi,"); + + // inline string and integer property enums + Path petPath = Path.of(target.toString(), "/src/models/pet.rs"); + TestUtils.assertFileExists(petPath); + TestUtils.assertFileContains(petPath, + "#[serde(rename = \"unknown_default_open_api\")] #[serde(other)] UnknownDefaultOpenApi,", + "#[serde(other)] UnknownDefaultOpenApi = 11184809,"); + } +} \ No newline at end of file diff --git a/modules/openapi-generator/src/test/resources/3_0/rust/enum-unknown-default-case.yaml b/modules/openapi-generator/src/test/resources/3_0/rust/enum-unknown-default-case.yaml new file mode 100644 index 000000000000..7c46faa8b897 --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/rust/enum-unknown-default-case.yaml @@ -0,0 +1,41 @@ +openapi: 3.0.3 +info: + title: Enum unknown default case + version: 1.0.0 +paths: + /pets: + get: + operationId: listPets + responses: + '200': + description: OK + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Pet' +components: + schemas: + Pet: + type: object + required: + - kind + properties: + kind: + $ref: '#/components/schemas/PetKind' + status: + type: string + enum: + - available + - sold + size: + type: integer + enum: + - 1 + - 2 + PetKind: + type: string + enum: + - cat + - dog