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:
#![allow(unused)]
fn main() {
#[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:
#![allow(unused)]
fn main() {
enum MyStruct {
Baz(MyStructBaz),
Qux(MyStructQux),
}
enum MyStructBaz {
Foo(MyStructBazFoo),
Bar(MyStructBazBar),
}
enum MyStructQux {
Foo(MyStructQuxFoo),
Bar(MyStructQuxBar),
}
}
The generated variant structs are:
#![allow(unused)]
fn main() {
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.