Created by: gferon
PR checklist
-
Read the contribution guidelines. -
Ran the shell script under ./bin/
to update Petstore sample so that CIs can verify the change. (For instance, only need to run./bin/{LANG}-petstore.sh
,./bin/openapi3/{LANG}-petstore.sh
if updating the {LANG} (e.g. php, ruby, python, etc) code generator or {LANG} client's mustache templates). Windows batch files can be found in.\bin\windows\
. If contributing template-only or documentation-only changes which will change sample output, be sure to build the project first. -
Filed the PR against the correct branch: master
,4.1.x
,5.0.x
. Default:master
. -
Copied the technical committee to review the pull request if your PR is targeting a particular programming language.
Description of the PR
- Add support for the
discriminator
feature of OpenAPI 3, and implement it withenum
in Rust - Add all missing explicit
dyn
to trait types to remove warnings - Add missing re-export for properties that are enum (was missing from #2244).
Example
A schema that looks like:
components:
schemas:
Pet:
type: object
required:
- pet_type
properties:
pet_type:
type: string
discriminator:
propertyName: pet_type
mapping:
cachorro: Dog
reptilian: Lizard
Cat:
allOf:
- $ref: '#/components/schemas/Pet'
- type: object
# all other properties specific to a `Cat`
properties:
name:
type: string
Dog:
allOf:
- $ref: '#/components/schemas/Pet'
- type: object
# all other properties specific to a `Dog`
properties:
bark:
type: string
Lizard:
allOf:
- $ref: '#/components/schemas/Pet'
- type: object
# all other properties specific to a `Lizard`
properties:
lovesRocks:
type: boolean
would generate a Rust enum like:
#[derive(Debug, PartialEq, Serialize, Deserialize)]
#[serde(tag = "pet_type")]
pub enum Pet {
#[serde(rename="cachorro")]
Dog {
#[serde(rename = "bark", skip_serializing_if = "Option::is_none")]
bark: Option<String>,
},
#[serde(rename="reptilian")]
Lizard {
#[serde(rename = "lovesRocks", skip_serializing_if = "Option::is_none")]
loves_rocks: Option<bool>,
},
}