FP languages have algebraic data types for this. Why do they call it virtual structs? How are they different than ADTs?
But algebraic data types do not in themselves provide a way to express the notion of a type with variants or sub-types.
The name is not used for the current "enum" feature, which is one of the few ADTs in Rust (there's also "struct" and tuples - not sure what else qualifies).