feo-oop-engine-proc-macros 0.0.5

The proc macros for feo-oop-engine.
Documentation
use proc_macro::TokenStream;
use quote::quote;

pub(crate) fn impl_parent_macro(ast: &syn::DeriveInput) -> TokenStream {
    let name = &ast.ident;
    let gen = quote! {
        impl Parent for #name {
            fn get_children(&self) -> Vec<Arc<RwLock<dyn GameObject>>> { self.children.clone() }

            fn add_child(&mut self, child: Arc<RwLock<dyn GameObject>>) { self.children.push(child); }
        
            unsafe fn remove_child(&mut self, child: Arc<RwLock<dyn GameObject>>) -> Result<(), ()> {
                let child_read = &*child.read().unwrap();
                let index = self.children.clone().iter().position(|r| &*r.read().unwrap() == child_read);
                match index {
                    Some(i) => {
                        self.children.remove(i);
                        Ok(())
                    },
                    None => Err(())
                }
            }
        
            unsafe fn replace_child(&mut self, old: Arc<RwLock<dyn GameObject>>, new: Arc<RwLock<dyn GameObject>>) -> Result<(), ()> {
                let index = self.children.clone().iter().position(|r| r.read().unwrap().get_id() == old.read().unwrap().get_id());
                match index {
                    Some(i) => {
                        let _ = mem::replace(&mut self.children[i], new);
                        Ok(())
                    },
                    None => Err(())
                }
            }
        }
    };
    gen.into()
}