superstruct 0.10.1

Versioned data types with minimal boilerplate
Documentation
# Meta variant structs and enums

Meta variants are an optional feature, useful for scenarios where you'd want nested
enums at the top-level. structs will be created for all combinations of `meta_variants`
and `variants`, names in the format `{BaseName}{MetaVariantName}{VariantName}`.
Additionally, enums will be created for each `meta_variant` named `{BaseName}{MetaVariantName}`.

For example:

```rust,no_run,no_playground
#[superstruct(meta_variants(Baz, Qux), variants(Foo, Bar))]
struct MyStruct {
    name: String,
    #[superstruct(only(Foo))]
    location: u16,
    #[superstruct(meta_only(Baz))]
    score: u64,
    #[superstruct(only(Bar), meta_only(Qux))]
    id: usize,
}
```

Here the `BaseName` is `MyStruct` and there are two variants in the meta-enum called
`Baz` and `Qux`.

The generated enums are:

```rust,no_run,no_playground
enum MyStruct {
    Baz(MyStructBaz),
    Qux(MyStructQux),
}

enum MyStructBaz {
    Foo(MyStructBazFoo),
    Bar(MyStructBazBar),
}

enum MyStructQux {
    Foo(MyStructQuxFoo),
    Bar(MyStructQuxBar),
}
```

The generated variant structs are:

```rust,no_run,no_playground
struct MyStructBazFoo {
    name: String,
    location: u16,
    score: u64,
}

struct MyStructBazBar {
    name: String,
    score: u64,
}

struct MyStructQuxFoo {
    name: String,
    location: u16,
}

struct MyStructQuxBar {
    name: String,
    id: usize,
}
```

Note how the `only` attribute still applies, and a new `meta_only` attribute can be used to
control the presence of fields in each meta variant.

For more information see [Struct attributes](../config/struct.md).