Expand description

The dep_type, dep_obj / impl_dep_obj, and with_builder macro expansion example.

dep_type! {
    #[derive(Debug)]
    pub struct MyDepType = MyDepTypeId[MyDepType] {
        prop_1: bool = false,
        prop_2: i32 = 10,
    }
}

macro_attr! {
    #[derive(Component!(stop=MyDepTypeStop), Debug)]
    struct MyDepTypePrivateData {
        dep_data: MyDepType,
    }
}

impl ComponentStop for MyDepTypeStop {
    with_arena_in_state_part!(MyApp { .my_dep_types });

    fn stop(&self, state: &mut dyn State, id: Id<MyDepTypePrivateData>) {
        MyDepTypeId(id).drop_bindings_priv(state);
    }
}

macro_attr! {
    #[derive(NewtypeComponentId!, Debug, Copy, Clone, Eq, PartialEq, Hash, Ord, PartialOrd)]
    pub struct MyDepTypeId(Id<MyDepTypePrivateData>);
}

impl DetachedDepObjId for MyDepTypeId { }

#[derive(Debug, Stop)]
pub struct MyApp {
    my_dep_types: Arena<MyDepTypePrivateData>,
}

impl MyDepTypeId {
    pub fn new(state: &mut dyn State) -> MyDepTypeId {
        let app: &mut MyApp = state.get_mut();
        app.my_dep_types.insert(|id| (MyDepTypePrivateData {
            dep_data: MyDepType::new_priv()
        }, MyDepTypeId(id)))
    }

    pub fn drop_self(self, state: &mut dyn State) {
        self.drop_bindings_priv(state);
        let app: &mut MyApp = state.get_mut();
        app.my_dep_types.remove(self.0);
    }

    with_builder!(MyDepType);
}

impl_dep_obj!(MyDepTypeId {
    fn<MyDepType>() -> (MyDepType) { MyApp { .my_dep_types } | .dep_data }
});

// OR equvalent `dep_obj!` call:

dep_obj! {
    impl MyDepTypeId {
        fn<MyDepType>(self as this, app: MyApp) -> (MyDepType) {
            if mut {
                &mut app.my_dep_types[this.0].dep_data
            } else {
                &app.my_dep_types[this.0].dep_data
            }
        }
    }
}

Structs