tm-derive 2020.11.1

FFI bindings for the machinery api
Documentation
use crate::Property;
use proc_macro2::TokenStream;
use quote::quote;
use syn::Ident;

pub(crate) fn expand_fn<'a>(
    struct_ident: &Ident,
    load_asset_ident: &Ident,
    properties: &[Property<'a>],
) -> TokenStream {
    if properties.is_empty() {
        quote! {}
    } else {
        let mut get_properties = quote! {};

        for (i, property) in properties.iter().enumerate() {
            let property_ident = property.ident;
            let getter_ident = property.ttt.get_tt_getter_ident(property.ident.span());
            let i = i as u32;

            get_properties.extend(quote! {
                c.#property_ident = the_truth_api.#getter_ident(asset_r, #i);
            });
        }

        quote! {
            unsafe extern "C" fn #load_asset_ident(
                _man: *mut ::tm_rs::ffi::tm_component_manager_o,
                _e: ::tm_rs::ffi::tm_entity_t,
                c_vp: *mut std::ffi::c_void,
                tt: *const ::tm_rs::ffi::tm_the_truth_o,
                asset: ::tm_rs::ffi::tm_tt_id_t,
            ) -> bool {

                let the_truth_api = ::tm_rs::api::with_ctx::<::tm_rs::the_truth::TheTruthApi>(tt);

                let c = c_vp as *mut super::#struct_ident;
                let c = c.as_mut().unwrap();

                let asset_r = the_truth_api.read(asset);

                if asset_r.is_null() {
                    return false;
                }

                *c = Default::default();
                #get_properties

                true
            }
        }
    }
}

pub(crate) fn expand_option<'a>(
    load_asset_ident: &Ident,
    properties: &[Property<'a>],
) -> TokenStream {
    if properties.is_empty() {
        quote! { None }
    } else {
        quote! { Some(#load_asset_ident) }
    }
}