[rust] fix: make enumUnknownDefaultCase catch unknown enum values
Fixes #25291
Related: #25271 also changes rust/model.mustache (oneOf with an enum discriminator), in a different section.
With enumUnknownDefaultCase=true the rust client adds an UnknownDefaultOpenApi variant to each enum without #[serde(other)]. So only the literal "unknown_default_open_api" / 11184809 maps to it, and any other value outside the spec still fails to deserialize.
Changes:
rust/model.mustache: add#[serde(other)]to the injected unknown variant (the lastenumVarsentry, only whenenumUnknownDefaultCaseis set). This covers schema-level and inline property enums, for both string enums (Deserialize) and integer enums (Deserialize_repr;serde_reprsupports#[serde(other)]).- Serialization does not change: the variant still serializes as
"unknown_default_open_api"/11184809. - Output without the option does not change.
Not covered: the rust-server and rust-axum generators. They use separate templates.
Testing:
- New
RustClientCodegenTest#testEnumUnknownDefaultCaseUsesSerdeOtherwithsrc/test/resources/3_0/rust/enum-unknown-default-case.yaml. The test fails without the template change. - I generated a crate from that spec with the option on and ran a cargo test against it: unknown string, schema-level and integer values deserialize to
UnknownDefaultOpenApi, and known values are unchanged. - No existing rust sample uses
enumUnknownDefaultCase, so regenerating the samples changed nothing.
PR checklist
- Read the contribution guidelines.
- Run the following to build the project and update samples:
(For Windows users, please run the script in WSL)./mvnw clean package || exit ./bin/generate-samples.sh ./bin/configs/*.yaml || exit ./bin/utils/export_docs_generators.sh || exit
Commit all changed files.
This is important, as CI jobs will verify all generator outputs of your HEAD commit as it would merge with master.
These must match the expectations made by your contribution.
You may regenerate an individual generator by passing the relevant config(s) as an argument to the script, for example./bin/generate-samples.sh bin/configs/java*.
IMPORTANT: Do NOT purge/delete any folders/files (e.g. tests) when regenerating the samples as manually written tests may be removed.
Regenerated./bin/configs/rust-reqwest-*.yamland./bin/configs/rust-hyper*.yaml(32 configs): no changes. No generator options were changed, so the docs export is not needed. - If your PR is targeting a particular programming language, @mention the technical committee members, so they are more likely to review the pull request.
cc @frol @farcaller @richardwhiuk @paladinzh @jacob-pro @dsteeley
Summary by cubic
Makes enumUnknownDefaultCase work as documented in the Rust client: unknown enum values now deserialize to the UnknownDefaultOpenApi variant instead of erroring.
Previously the variant only matched its serialized literal ("unknown_default_open_api" / 11184809), so any other out-of-spec value failed deserialization. The injected variant now carries #[serde(other)], which applies to schema-level and inline enums for both string and integer types. Serialization behavior and output without the option are unchanged.
- Affects the
rustgenerator only;rust-serverandrust-axumuse separate templates.