#enums #macro-derive #conversions #generate #possibly #effect #enum-to-enum

macro enum_to_enum_derive

Derive macro implementation for enum_to_enum. enum_to_enum derives possibly effectful conversions between enums.

1 unstable release

0.1.0 Sep 6, 2021

#6 in #possibly

Download history 4509/week @ 2023-11-24 3633/week @ 2023-12-01 3858/week @ 2023-12-08 3305/week @ 2023-12-15 1218/week @ 2023-12-22 1590/week @ 2023-12-29 2398/week @ 2024-01-05 2398/week @ 2024-01-12 2528/week @ 2024-01-19 2444/week @ 2024-01-26 2509/week @ 2024-02-02 3285/week @ 2024-02-09 3322/week @ 2024-02-16 3464/week @ 2024-02-23 1595/week @ 2024-03-01 666/week @ 2024-03-08

9,735 downloads per month
Used in 3 crates (via enum_to_enum)

MIT/Apache

38KB
723 lines

enum_to_enum   CI

enum_to_enum exposes a derive macro to easily generate possibly effectful enum-to-enum conversions: #[derive(FromEnum)].


When should you use enum_to_enum?

Many transformation pipelines are readily expressed as conversions from one enum to another. However, these transformations can be tedious to write, especially if they generate some additional effects in addition to data mapping. enum_to_enum makes it easy to generate these conversions.

enum_to_enum in action

Show cargo.toml
[dependencies]
enum_to_enum = "0.1.0"

use enum_to_enum::FromEnum;

#[derive(Debug)]
enum Src {
    Case1(),
    Case2(SrcStrField),
    Case3 { a: SrcStrField, b: u8 },
}

#[derive(FromEnum, Debug, PartialEq, Eq)]
#[from_enum(Src)]
enum Dest {
    Case1(),

    #[from_case(Case2)]
    DestCase2(DestStrField),

    #[from_case(Src = Case3)]
    DestCase3 { a: DestStrField, b: u8 },
}

#[derive(Debug, PartialEq, Eq)]
struct SrcStrField(String);

#[derive(Debug, PartialEq, Eq)]
struct DestStrField(String);

impl From<SrcStrField> for DestStrField {
    fn from(src: SrcStrField) -> DestStrField {
        DestStrField(src.0 + " world")
    }
}

assert_eq!(
    Dest::from(Src::Case1()),
    Dest::Case1(),
);

assert_eq!(
    Dest::from(Src::Case2(SrcStrField(String::from("hello")))),
    Dest::DestCase2(DestStrField(String::from("hello world"))),
);

assert_eq!(
    Dest::from(Src::Case3 {
        a: SrcStrField(String::from("hello")),
        b: 100u8,
    }),
    Dest::DestCase3 {
        a: DestStrField(String::from("hello world")),
        b: 100u8,
    },
);

License

Licensed under either of Apache License, Version 2.0 or MIT license at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in enum_to_enum by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Dependencies

~1.5MB
~32K SLoC