Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/bluejekyll/enum-as-inner
Macros for deriving as functions to access Enums as their inner components
https://github.com/bluejekyll/enum-as-inner
Last synced: 6 days ago
JSON representation
Macros for deriving as functions to access Enums as their inner components
- Host: GitHub
- URL: https://github.com/bluejekyll/enum-as-inner
- Owner: bluejekyll
- License: other
- Created: 2018-12-06T21:34:20.000Z (about 6 years ago)
- Default Branch: main
- Last Pushed: 2024-09-09T16:39:04.000Z (4 months ago)
- Last Synced: 2024-12-13T15:45:26.705Z (13 days ago)
- Language: Rust
- Size: 54.7 KB
- Stars: 93
- Watchers: 3
- Forks: 11
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE-APACHE
- Code of conduct: CODE_OF_CONDUCT.md
Awesome Lists containing this project
README
# 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:
```rust
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:
```rust
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
```rust
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:
```rust
use enum_as_inner::EnumAsInner;#[derive(Debug, EnumAsInner)]
enum ManyVariants {
One(u32),
Two(u32, i32),
Three(bool, u32, i64),
}
```And can be accessed like:
```rust
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:
```rust
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:
```rust
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));
```