#enums #labelled-generic #macro-derive #traits #frunk #variant #type

macro frunk-enum-derive

Derive macros to implement the frunk::LabelledGeneric trait on enums

3 unstable releases

0.3.0 Nov 15, 2023
0.2.1 Mar 3, 2021
0.2.0 May 13, 2019

#251 in Procedural macros

Download history 191/week @ 2024-01-10 267/week @ 2024-01-17 226/week @ 2024-01-24 332/week @ 2024-01-31 353/week @ 2024-02-07 287/week @ 2024-02-14 479/week @ 2024-02-21 690/week @ 2024-02-28 601/week @ 2024-03-06 347/week @ 2024-03-13 377/week @ 2024-03-20 465/week @ 2024-03-27 514/week @ 2024-04-03 415/week @ 2024-04-10 354/week @ 2024-04-17 402/week @ 2024-04-24

1,780 downloads per month
Used in 18 crates


214 lines

Frunk Enum Support

Crates.io - frunk-enum License: MIT/APACHE-2.0


These crates augment the frunk crate to allow transmogrification of enums as well as structs. For more information on transmogrification and the LabelledGeneric trait it's based around, see https://docs.rs/frunk/latest/frunk/#transmogrifying and https://docs.rs/frunk/latest/frunk/labelled/trait.LabelledGeneric.html.

To take advantage of this feature for your own enum you need to:

  • Add the frunk-enum-derive as a [dev-dependency] to your Cargo.toml

  • Mark the enum with the custom derive:

    enum Foo {
        Baz { name: String, id: Identity },
  • Add the frunk-enum-core and frunk-core crates as [dependency] entries to your Cargo.toml

  • Then (assuming there's a NewFoo enum with the same structure as Foo) you can write:

    let foo = Foo::Baz { name: "Andy".into(), id: Identity };
    let new_foo: NewFoo = foo.transmogrify();

This works by deriving an implementation of LabelledGeneric for Foo which allows conversion to and from an instance of a generic sum-type. The core crate provides tools for converting between these generic sum-types where the bodies of the variants are recursively transmogrifiable. This allows for arbitrarily deep conversion between types, especially useful where the two types in question are autogenerated from some common input file, but are deemed to be different types by the rust compiler (e.g. because they're in separate crates).


Thank you for your interest in frunk-enum, all contributions are welcome whether they be reports of issues, feature requests or code contributions.

Issue Contribution

When opening issues please provide a description of the issue, the version of frunk and frunk-enum plus example code which exhibits the issue.

Code Contribution

If you wish to contribute code to frunk-enum, you are welcome to do so using a github pull request, however you will need to sign each commit, to indicate that you are abiding to the terms of the DCO.


This crate adds the LabelledGenericEnum derive which integrates enums with the frunk transmogrification function.


~45K SLoC