[rust] fix: make enumUnknownDefaultCase catch unknown enum values

TE
3d ago
+88-0

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 last enumVars entry, only when enumUnknownDefaultCase is set). This covers schema-level and inline property enums, for both string enums (Deserialize) and integer enums (Deserialize_repr; serde_repr supports #[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#testEnumUnknownDefaultCaseUsesSerdeOther with src/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:
    ./mvnw clean package || exit
    ./bin/generate-samples.sh ./bin/configs/*.yaml || exit
    ./bin/utils/export_docs_generators.sh || exit
    
    (For Windows users, please run the script in WSL)
    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-*.yaml and ./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 rust generator only; rust-server and rust-axum use separate templates.