schemars icon indicating copy to clipboard operation
schemars copied to clipboard

Support enum variant aliases

Open GREsau opened this issue 4 years ago • 2 comments

Received via email

Is there a way to get schemars to add serde aliased enum values to the generated schema? E.g. each aliased value shows up in the enum list like a regular enum value.

https://serde.rs/variant-attrs.html#alias

GREsau avatar Apr 07 '20 18:04 GREsau

Since aliases are only signifcant when deserializing, this is a case where the schema would be different depending on whether it represents the contract for serialization or deserialization, so I'm not sure what the best way to handle this is.

e.g. consider this enum with an aliased variant:

#[derive(Serialize, Deserialize, JsonSchema)]
enum MyEnum {
    #[serde(alias = "MyAlias")]
    MyVariant1,
    MyVariant2,
}

What should the schema for MyEnum be?

  1. The schema describing what can be deserialized, which has three possible values: {"enum": ["MyVariant1","MyAlias","MyVariant2"]}
  2. The schema describing how it can be serialized, which only has two possible values: {"enum": ["MyVariant1","MyVariant2"]}

This could also be configurable, either by an attribute e.g.:

#[derive(Serialize, Deserialize, JsonSchema)]
#[schemars(include_aliases)]
enum MyEnum {
    #[serde(alias = "MyAlias")]
    MyVariant1,
    MyVariant2,
}

...or by adding a new schema setting e.g.:

let settings = SchemaSettings::draft07().with(|s| {
  s.variant_aliases = Aliases::Include // or Aliases::Ignore
});
let schema = settings.into_generator().into_root_schema_for::<MyEnum>();

GREsau avatar Apr 07 '20 19:04 GREsau

@GREsau what would you prefer concerning the deserialize vs. serialize problematic? I have only the deserialize case and would benefit greatly by having this implemented and would therefor be willing to tackle this (in #136) there is already an initial implementation of just the aliasing.

ModProg avatar Jan 18 '23 15:01 ModProg