opt_field_ref_of

Macro opt_field_ref_of 

Source
macro_rules! opt_field_ref_of {
    ($e:path { $f:tt } $(=> $fs:tt)*) => { ... };
    ($e:path { $f:tt } $(=> $fs:tt)* & $($tts:tt)+) => { ... };
    ($t:ty $(=> $f:tt)+) => { ... };
    ($t:ty $(=> $f:tt)+ & $($tts:tt)+) => { ... };
}
Expand description

Creates a new instance of OptionFieldRef from basic type (enum constansts, structs or tuples) and these fields.

§Examples

use field_ref::{GetField, GetFieldMut, OptionFieldRef, opt_field_ref_of};

struct Foo {
    x: i32,
    y: f64,
}

enum E1 {
    A(i32),
    B(i32, Foo),
}

enum E2 {
    X(E1),
    Y,
}

let fr1 = opt_field_ref_of!(E1::A{0});
let fr2 = opt_field_ref_of!(E2::X{0} & E1::B{1} => y);
let fr3 = opt_field_ref_of!(Foo => x);

let e1_1 = E1::A(10);
let e1_2 = E1::B(20, Foo{ x: 25, y: 2.5 });
let e2_1 = E2::X(E1::B(10, Foo{ x: 30, y: 3.5 }));
let e2_2 = E2::Y;

let mut foo = Foo{ x: 40, y: 4.5 };

assert_eq!(e1_1.try_get_field(fr1), Some(&10));
assert_eq!(e1_2.try_get_field(fr1), None);

assert_eq!(e2_1.try_get_field(fr2), Some(&3.5));
assert_eq!(e2_2.try_get_field(fr2), None);

assert_eq!(foo.try_get_field(fr3), Some(&40));
*foo.try_get_field_mut(fr3).unwrap() = 50;
assert_eq!(foo.x, 50)