holder 0.14.0

getter setter auto gen with holder trait
Documentation
use std::{fmt::Debug, marker::PhantomData};

fn main() {
    let mut wrapper = Wrapper::<usize> {
        value: Token::<i32>(PhantomData),
        _marker: PhantomData,
        game_state: GameState::Idle,
    };
    let token: &mut Token<i32> = wrapper.token_mut();
    let token: &Token<i32> = wrapper.token();
    let game_state: &GameState = wrapper.game_state();
    let game_state_mut: &mut GameState = wrapper.game_state_mut();
}

struct Wrapper<T: Default>
where
    T: Debug,
{
    //#[hold]
    value: Token<i32>,
    //#[hold(GameStateHolder)]
    game_state: GameState,
    _marker: PhantomData<T>,
}

impl<T: Default> TokenHolder<i32> for Wrapper<T>
where
    T: Debug,
{
    fn token(&self) -> &Token<i32> {
        &self.value
    }
    fn token_mut(&mut self) -> &mut Token<i32> {
        &mut self.value
    }
}

impl<T: Default> GameStateHolder for Wrapper<T>
where
    T: Debug,
{
    fn game_state<'a: 'b, 'b>(&'a self) -> &'b GameState {
        &self.game_state
    }
    fn game_state_mut(&mut self) -> &mut GameState {
        &mut self.game_state
    }
}

struct Token<T: Default>(PhantomData<T>)
where
    T: Debug;

trait TokenHolder<T: Default>
where
    T: Debug,
{
    fn token(&self) -> &Token<T>;
    fn token_mut(&mut self) -> &mut Token<T>;
}

enum GameState {
    Idle,
    Play,
}

trait GameStateHolder {
    fn game_state<'a: 'b, 'b>(&'a self) -> &'b GameState;
    fn game_state_mut(&mut self) -> &mut GameState;
}