| Crates.io | enum_variant_accessors |
| lib.rs | enum_variant_accessors |
| version | 1.0.1 |
| created_at | 2025-10-18 20:54:32.047208+00 |
| updated_at | 2025-10-18 21:09:22.478202+00 |
| description | derive macros to generate is_*, as_* and as_*_mut accessors for enum variants |
| homepage | |
| repository | https://github.com/roeeshoshani/enum_variant_accessors |
| max_upload_size | |
| id | 1889635 |
| size | 22,128 |
Derive macros that generate ergonomic variant accessors for enums.
#[derive(EnumIsVariant)] — adds is_<variant>() -> bool methods.#[derive(EnumAsVariant)] — adds borrowed accessors:
as_<variant>(&self) -> Option<<borrowed variant data>>as_<variant>_mut(&mut self) -> Option<<borrowed variant data (mutable)>>Variant or Variant()):
()Option<()>Variant(T)):
&T / &mut TOption<&T> / Option<&mut T>Variant(T1, T2, ...)):
(&T1, &T2, ...) / (&mut T1, &mut T2, ...)Option<(&T1, &T2, ...)> / Option<(&mut T1, &mut T2, ...)>Not supported: generating
as_*functions for named-field (struct-like) variants. such variants will be skipped when generatingas_*functions.
use enum_variant_accessors::{EnumIsVariant, EnumAsVariant};
#[derive(EnumIsVariant, EnumAsVariant)]
enum Msg<'a> {
Ping,
Pong(),
One(u32),
Pair(&'a str, usize),
}
fn main() {
let mut m = Msg::Pair("hi", 7);
assert!(m.is_pair());
assert!(!m.is_ping());
assert!(matches!(m.as_ping(), None));
assert_eq!(m.as_pair(), Some((&"hi", &7)));
if let Some((s, n)) = m.as_pair_mut() {
*n += 1;
assert_eq!(*s, "hi");
}
assert_eq!(m.as_pair(), Some((&"hi", &8)));
assert_eq!(m.as_pong(), None);
let p = Msg::Pong();
assert_eq!(p.as_pong(), Some(()));
}