Derive Macro dyn_context::State

source · []
#[derive(State)]
{
    // Attributes available to this derive:
    #[state]
    #[_crate]
}
Expand description

Derives State implementation for structs.

This derive macro allows easily combine new State from several parts and inner States.

Supports #[state] attribute, which can be in any of two forms: #[state], and #[state(part)]. First form, #[state], should be used to include fields which type have implemented State trait as an inner entry of building state. Second form, #[state(part)], marks field as well as struct itself as a building state part, i.e. an object accessible by its type through State / StateExt methods.

Example

struct StatePart(i32);

struct InnerState1(i32);

impl SelfState for InnerState1 { }

struct InnerInnerState(i32);

impl SelfState for InnerInnerState { }

#[derive(State)]
#[state(part)]
struct InnerState2 {
    var: i32,
    #[state(part)]
    part: StatePart,
    #[state]
    inner_inner: InnerInnerState,
}

#[derive(State)]
struct RootState {
    #[state]
    inner_1: InnerState1,
    #[state]
    inner_2: InnerState2,
}

let part = StatePart(1);
let inner_1 = InnerState1(2);
let inner_inner = InnerInnerState(3);
let inner_2 = InnerState2 { var: 4, part, inner_inner };
let state = RootState { inner_1, inner_2 };

assert_eq!(state.get::<StatePart>().0, 1);
assert_eq!(state.get::<InnerState1>().0, 2);
assert_eq!(state.get::<InnerInnerState>().0, 3);
assert_eq!(state.get::<InnerState2>().var, 4);