subenum 1.2.0

A proc-macro to create subsets of enums, that can be converted to and from.
Documentation
use subenum::subenum;

#[subenum(
    Storage(
        doc = "[WebAssembly storage types](\
            https://webassembly.github.io/spec/core/syntax/types.html#syntax-storagetype)\n",
        derive(strum::EnumDiscriminants),
        strum_discriminants(name(StorageType), derive(strum::FromRepr, PartialOrd, Ord, Hash))
    ),
    Val(
        doc = "[WebAssembly value types](\
            https://webassembly.github.io/spec/core/syntax/types.html#syntax-valtype)\n",
        derive(strum::EnumDiscriminants),
        strum_discriminants(name(ValType), derive(strum::FromRepr, PartialOrd, Ord, Hash))
    ),
    Num(
        doc = "[WebAssembly number types](\
            https://webassembly.github.io/spec/core/syntax/types.html#syntax-numtype)\n",
        derive(strum::EnumDiscriminants),
        strum_discriminants(name(NumType), derive(strum::FromRepr, PartialOrd, Ord, Hash))
    ),
    Int(
        doc = "[WebAssembly integer types](\
            https://webassembly.github.io/spec/core/syntax/types.html#syntax-inttype)\n",
        derive(strum::EnumDiscriminants),
        strum_discriminants(name(IntType), derive(strum::FromRepr, PartialOrd, Ord, Hash))
    ),
    Float(
        doc = "[WebAssembly float types](\
            https://webassembly.github.io/spec/core/syntax/types.html#syntax-floattype)\n",
        derive(strum::EnumDiscriminants),
        strum_discriminants(name(FloatType), derive(strum::FromRepr, PartialOrd, Ord, Hash))
    ),
    Pack(
        doc = "[WebAssembly pack types](\
            https://webassembly.github.io/spec/core/syntax/types.html#syntax-packtype)\n",
        derive(strum::EnumDiscriminants),
        strum_discriminants(name(PackType), derive(strum::FromRepr, PartialOrd, Ord, Hash))
    )
)]
#[derive(Debug, Clone, Copy)]
#[repr(u8)]
pub enum Storage<R = usize> {
    #[subenum(
        Storage(doc = "16-bit integer type (Storage)\n"),
        Pack(doc = "16-bit integer type (Pack)\n")
    )]
    I16(i16) = 0x77,

    #[subenum(
        Storage(doc = "8-bit integer type (Storage)\n"),
        Pack(doc = "8-bit integer type (Pack)\n")
    )]
    I8(i8) = 0x78,

    #[subenum(
        Storage(doc = "128-bit vector type (Storage)\n"),
        Val(doc = "128-bit vector type (Val)\n")
    )]
    V128([u8; 16]) = 0x7B,

    #[subenum(
        Storage(doc = "64-bit float type (Storage)\n"),
        Val(doc = "64-bit float type (Val)\n"),
        Num(doc = "64-bit float type (Num)\n"),
        Float(doc = "64-bit float type (Float)\n")
    )]
    F64(f64) = 0x7C,

    #[subenum(
        Storage(doc = "32-bit float type (Storage)\n"),
        Val(doc = "32-bit float type (Val)\n"),
        Num(doc = "32-bit float type (Num)\n"),
        Float(doc = "32-bit float type (Float)\n")
    )]
    F32(f32) = 0x7D,

    #[subenum(
        Storage(doc = "64-bit integer type (Storage)\n"),
        Val(doc = "64-bit integer type (Val)\n"),
        Num(doc = "64-bit integer type (Num)\n"),
        Int(doc = "64-bit integer type (Int)\n")
    )]
    I64(i64) = 0x7E,

    #[subenum(
        Storage(doc = "32-bit integer type (Storage)\n"),
        Val(doc = "32-bit integer type (Val)\n"),
        Num(doc = "32-bit integer type (Num)\n"),
        Int(doc = "32-bit integer type (Int)\n")
    )]
    I32(i32) = 0x7F,

    #[subenum(
        Storage(doc = "Reference type (Storage)\n"),
        Val(doc = "Reference type (Val)\n")
    )]
    Ref(R),
}

type _AllTypesPresent = (
    Storage,
    StorageType,
    Val,
    ValType,
    Num,
    NumType,
    Int,
    IntType,
    Float,
    FloatType,
    Pack,
    PackType,
);