Skip to content

Commit

Permalink
Merge pull request #2 from pablo-lua/prefab_data_derive
Browse files Browse the repository at this point in the history
PrefabData derive
  • Loading branch information
pablo-lua authored Dec 26, 2023
2 parents 72dbe50 + c166a40 commit 561e139
Show file tree
Hide file tree
Showing 6 changed files with 83 additions and 3 deletions.
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
Cargo.lock
/target
**/target
1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ edition = "2021"
bevy = "0.12.1"
ron = "0.8.1"
serde = "1.0.193"
bevy_prfb_macro ={ version = "0.12.1", path = "src/bevy_prfb_macro"}

[[example]]
name = "custom_prefab"
Expand Down
2 changes: 1 addition & 1 deletion examples/ui/simple_screen_prefab.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use bevy_prfb::{*, ui::{CreateUiExt, UiCreator}};
use bevy_prfb::ui::{CreateUiExt, UiCreator};
use bevy::prelude::*;
//use serde::{Deserialize, Serialize};

Expand Down
19 changes: 19 additions & 0 deletions src/bevy_prfb_macro/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
[package]
name = "bevy_prfb_macro"
version = "0.12.1"
edition = "2021"


[profile.dev]
opt-level = 1

[profile.release]
codegen-units = 1

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[lib]
proc-macro = true

[dependencies]
quote = "1.0.33"
syn = "2.0.43"
56 changes: 56 additions & 0 deletions src/bevy_prfb_macro/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
use proc_macro::TokenStream;
use quote::quote;
use syn::{parse_macro_input, Index, DeriveInput, spanned::Spanned};



#[proc_macro_derive(PrefabData)]
pub fn derive_system_param(input: TokenStream) -> TokenStream {
let ast = parse_macro_input!(input as DeriveInput);
let syn::Data::Struct(syn::DataStruct {
fields: field_definitions,
..
}) = ast.data
else {
return syn::Error::new(
ast.span(),
"Invalid `PrefabData` type: expected a `struct`",
)
.into_compile_error()
.into();
};

let mut fields = Vec::new();
for (i, field) in field_definitions.iter().enumerate() {
let i = Index::from(i);
fields.push(
field
.ident
.as_ref()
.map(|f| quote! { #f })
.unwrap_or_else(|| quote! { #i }),
);
}
let struct_name = &ast.ident;
let generics = ast.generics;
let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();

TokenStream::from(quote! {
const _: () = {
impl #impl_generics bevy_prfb::prefab::PrefabData for #struct_name #ty_generics #where_clause {
fn insert_into_entity(self, entity: &mut bevy::ecs::world::EntityWorldMut) {
#(
self.#fields.insert_into_entity(entity);
)*
}
fn load_sub_assets(&mut self, world: &mut bevy::ecs::world::World) -> bool {
let mut loaded = false;
#(
loaded |= self.#fields.load_sub_assets(world);
)*
loaded
}
}
};
})
}
6 changes: 5 additions & 1 deletion src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,9 @@ pub mod prefab;
pub mod components;
pub mod ui;


use crate as bevy_prfb;

pub use prefab::*;
pub use components::*;
pub use components::*;
pub use bevy_prfb_macro::*;

0 comments on commit 561e139

Please sign in to comment.