Skip to content

Commit 88da9ea

Browse files
prepare enum-field-getter for publishing to crates.io (#21)
1 parent 40d8e3c commit 88da9ea

File tree

5 files changed

+60
-0
lines changed

5 files changed

+60
-0
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
name = "hyperquark"
33
version = "0.0.0"
44
edition = "2021"
5+
publish = false
56

67
[dependencies]
78
serde = { version = "1.0", default-features = false, features = ["derive", "alloc"] }

enum-field-getter/.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
/target
2+
/Cargo.lock

enum-field-getter/Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22
name = "enum-field-getter"
33
version = "0.1.0"
44
edition = "2021"
5+
license = "MIT OR Apache-2.0"
6+
repository = "hhttps://github.com/HyperQuark/hyperquark/tree/main/enum-field-getter"
7+
authors = ["pufferfish101007"]
8+
description = "A derive macro to create mutable and immutable getters for tuple/struct members of enum variants"
59

610
[lib]
711
proc-macro = true

enum-field-getter/README.md

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# `enum-field-getter`
2+
3+
A simple derive macro used to implement methods to access fields which are of the same type across every tuple/struct enum variant.
4+
5+
## Usage
6+
7+
Derive `EnumFieldGetter`. For tuple enum variants, produces `get_n(&self) -> Option<&_>` and `get_n_mut(&mut self) -> Option<&mut _>` methods for each tuple member (starting from 0); for struct variants, getters are of the form `prop(&self) -> Option<&_>` and `prop_mut(&mut self) -> Option<&mut _>`. Getters are only produced so long as that member is the same type across all enum variants - if they are of different types, no getter will be produced for that member. These methods are produced even if that member doesn't exist for all enum variants - in the case that it doesn't exist, the getter will return `None`.
8+
9+
## Examples
10+
11+
```rust
12+
use enum_field_getter::EnumFieldGetter;
13+
14+
#[derive(EnumFieldGetter)]
15+
enum Foo {
16+
Bar(u32),
17+
Baz(u32, u32),
18+
}
19+
20+
let foo = Foo::Bar(16);
21+
let foo0 = foo.get_0();
22+
assert_eq!(foo0, Some(&16));
23+
let foo1 = foo.get_1();
24+
assert!(foo1.is_none());
25+
```
26+
27+
```rust
28+
use enum_field_getter::EnumFieldGetter;
29+
30+
#[derive(EnumFieldGetter)]
31+
enum Boop {
32+
Moo {
33+
a: i32,
34+
b: i32,
35+
},
36+
Baa {
37+
a: i32,
38+
b: i32,
39+
c: i32,
40+
}
41+
}
42+
43+
let mut boop = Boop::Baa { a: 0, b: 42, c: 180 };
44+
let boop_a = boop.a();
45+
assert_eq!(boop_a, Some(&0));
46+
let boop_c = boop.c();
47+
assert_eq!(boop_c, Some(&180));
48+
*boop.b_mut().unwrap() = 43;
49+
assert_eq!(boop.b(), Some(&43));
50+
```

enum-field-getter/src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1+
#![doc = include_str!("../README.md")]
2+
13
use proc_macro::TokenStream;
24
use proc_macro_error::{abort_call_site, emit_warning, proc_macro_error};
35
use quote::{format_ident, quote};
46
use syn::{parse_macro_input, Data, DeriveInput, Fields, Type};
57

68
use std::collections::{HashMap, HashSet};
79

10+
/// See top-level crate documentation.
811
#[proc_macro_error]
912
#[proc_macro_derive(EnumFieldGetter)]
1013
pub fn enum_field_getter(stream: TokenStream) -> TokenStream {

0 commit comments

Comments
 (0)