Bug: 368527390

Clone this repo:

Branches

  1. c57b95a Merge remote-tracking branch 'origin/upstream' by Inna Palant · 12 months ago main
  2. c78794c Import 'enum-as-inner' crate by lujc · 12 months ago upstream
  3. f12f4a2 Initial empty repository by Inna Palant (xWF) · 12 months ago

enum-as-inner

A deriving proc-macro for generating functions to automatically give access to the inner members of enum.

Basic unnamed field case

The basic case is meant for single item enums, like:

use enum_as_inner::EnumAsInner; #[derive(Debug, EnumAsInner)] enum OneEnum { One(u32), } 

where the inner item can be retrieved with the as_*()/as_*_mut() or with the into_*() functions:

let one = OneEnum::One(1); assert_eq!(*one.as_one().unwrap(), 1); assert_eq!(one.into_one().unwrap(), 1); let mut one = OneEnum::One(2); assert_eq!(*one.as_one().unwrap(), 1); assert_eq!(*one.as_one_mut().unwrap(), 1); assert_eq!(one.into_one().unwrap(), 1); 

where the result is either a reference for inner items or a tuple containing the inner items.

Unit case

This will return true if enum's variant matches the expected type

use enum_as_inner::EnumAsInner; #[derive(EnumAsInner)] enum UnitVariants { Zero, One, Two, } let unit = UnitVariants::Two; assert!(unit.is_two()); 

Mutliple, unnamed field case

This will return a tuple of the inner types:

use enum_as_inner::EnumAsInner; #[derive(Debug, EnumAsInner)] enum ManyVariants { One(u32), Two(u32, i32), Three(bool, u32, i64), } 

And can be accessed like:

let mut many = ManyVariants::Three(true, 1, 2); assert_eq!(many.as_three().unwrap(), (&true, &1_u32, &2_i64)); assert_eq!(many.as_three_mut().unwrap(), (&mut true, &mut 1_u32, &mut 2_i64)); assert_eq!(many.into_three().unwrap(), (true, 1_u32, 2_i64)); 

Multiple, named field case

This will return a tuple of the inner types, like the unnamed option:

use enum_as_inner::EnumAsInner; #[derive(Debug, EnumAsInner)] enum ManyVariants { One{ one: u32 }, Two{ one: u32, two: i32 }, Three{ one: bool, two: u32, three: i64 }, } 

And can be accessed like:

let mut many = ManyVariants::Three{ one: true, two: 1, three: 2 }; assert_eq!(many.as_three().unwrap(), (&true, &1_u32, &2_i64)); assert_eq!(many.as_three_mut().unwrap(), (&mut true, &mut 1_u32, &mut 2_i64)); assert_eq!(many.into_three().unwrap(), (true, 1_u32, 2_i64));