enum_variant_accessors

Crates.ioenum_variant_accessors
lib.rsenum_variant_accessors
version1.0.1
created_at2025-10-18 20:54:32.047208+00
updated_at2025-10-18 21:09:22.478202+00
descriptionderive macros to generate is_*, as_* and as_*_mut accessors for enum variants
homepage
repositoryhttps://github.com/roeeshoshani/enum_variant_accessors
max_upload_size
id1889635
size22,128
Roee Shoshani (roeeshoshani)

documentation

README

enum_variant_accessors

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)>>

Supported variants

  • Unit variants (Variant or Variant()):
    • Borrowed data type: ()
    • Accessors return Option<()>
  • Single-field tuple variants (Variant(T)):
    • Borrowed data type: &T / &mut T
    • Accessors return Option<&T> / Option<&mut T>
  • Multi-field tuple variants (Variant(T1, T2, ...)):
    • Borrowed data type: (&T1, &T2, ...) / (&mut T1, &mut T2, ...)
    • Accessors return 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 generating as_* functions.

Examples

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(()));
}
Commit count: 0

cargo fmt