superstruct 0.10.1

Versioned data types with minimal boilerplate
Documentation
#![allow(non_local_definitions)] // for macros on structs within test functions

use superstruct::superstruct;

#[test]
fn partial_getter() {
    #[superstruct(variants(A, B))]
    struct Message {
        pub x: u64,
        #[superstruct(only(B))]
        pub y: u64,
    }

    let mut m = Message::B(MessageB { x: 0, y: 10 });
    let mut mut_ref = m.to_mut();
    *mut_ref.y_mut().unwrap() = 100;

    assert_eq!(*m.y().unwrap(), 100);
    assert_eq!(*m.x(), 0);
}

#[test]
fn copy_partial_getter() {
    #[superstruct(variants(A, B), no_map_macros)]
    struct Message {
        #[superstruct(getter(copy))]
        pub x: u64,
        #[superstruct(only(B), partial_getter(copy))]
        pub y: u64,
    }

    let mut m = Message::B(MessageB { x: 0, y: 10 });
    let mut mut_ref = m.to_mut();
    *mut_ref.y_mut().unwrap() = 100;

    assert_eq!(m.y().unwrap(), 100);
    assert_eq!(m.x(), 0);
}