bevy_seedling_macros 0.7.0

Macros sub-crate for bevy_seedling
Documentation
use bevy_macro_utils::{derive_label, BevyManifest};
use proc_macro::TokenStream;
use proc_macro2::TokenStream as TokenStream2;
use quote::quote;

pub fn derive_node_label_inner(input: TokenStream) -> syn::Result<TokenStream2> {
    let input: syn::DeriveInput = syn::parse(input)?;

    let bevy_ecs = BevyManifest::shared(|manifest| manifest.get_path("bevy_ecs"));
    let label_path = syn::parse2(quote! { ::bevy_seedling::prelude::NodeLabel }).unwrap();

    let ident = &input.ident;
    let component_derive = quote! {
        impl #bevy_ecs::component::Component for #ident {
            const STORAGE_TYPE: #bevy_ecs::component::StorageType = #bevy_ecs::component::StorageType::Table;
            type Mutability = #bevy_ecs::component::Immutable;

            #[allow(unused_variables)]
            fn on_insert() -> Option<#bevy_ecs::lifecycle::ComponentHook> {
                Some(::bevy_seedling::node::label::insert_node_label::<Self>)
            }
        }
    };

    let label_derive: TokenStream2 = derive_label(input, "NodeLabel", &label_path).into();

    Ok(quote! {
        #component_derive
        #label_derive
    })
}

pub fn derive_pool_label_inner(input: TokenStream) -> syn::Result<TokenStream2> {
    let input: syn::DeriveInput = syn::parse(input)?;

    let bevy_ecs = BevyManifest::shared(|manifest| manifest.get_path("bevy_ecs"));
    let label_path = syn::parse2(quote! { ::bevy_seedling::prelude::PoolLabel }).unwrap();

    let ident = &input.ident;
    let component_derive = quote! {
        impl #bevy_ecs::component::Component for #ident {
            const STORAGE_TYPE: #bevy_ecs::component::StorageType = #bevy_ecs::component::StorageType::Table;
            type Mutability = #bevy_ecs::component::Immutable;

            fn on_insert() -> Option<#bevy_ecs::lifecycle::ComponentHook> {
                Some(::bevy_seedling::pool::label::insert_pool_label::<Self>)
            }

            fn on_remove() -> Option<#bevy_ecs::lifecycle::ComponentHook> {
                Some(::bevy_seedling::pool::label::remove_pool_label::<Self>)
            }
        }
    };

    let label_derive: TokenStream2 = derive_label(input, "PoolLabel", &label_path).into();

    Ok(quote! {
        #component_derive
        #label_derive
    })
}