Skip to content

Commit 69bb893

Browse files
committed
Allow a closure to be used as a required component default
1 parent 378dcac commit 69bb893

File tree

1 file changed

+29
-12
lines changed

1 file changed

+29
-12
lines changed

crates/bevy_ecs/macros/src/component.rs

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use syn::{
99
punctuated::Punctuated,
1010
spanned::Spanned,
1111
token::{Comma, Paren},
12-
DeriveInput, ExprPath, Ident, LitStr, Path, Result,
12+
DeriveInput, ExprPath, ExprClosure, Ident, LitStr, Path, Result
1313
};
1414

1515
pub fn derive_event(input: TokenStream) -> TokenStream {
@@ -84,14 +84,22 @@ pub fn derive_component(input: TokenStream) -> TokenStream {
8484
register_recursive_requires.push(quote! {
8585
<#ident as Component>::register_required_components(components, storages, required_components);
8686
});
87-
if let Some(func) = &require.func {
88-
register_required.push(quote! {
89-
required_components.register(components, storages, || { let x: #ident = #func().into(); x });
90-
});
91-
} else {
92-
register_required.push(quote! {
93-
required_components.register(components, storages, <#ident as Default>::default);
94-
});
87+
match &require.func {
88+
Some(RequireFunc::Path(func)) => {
89+
register_required.push(quote! {
90+
required_components.register(components, storages, || { let x: #ident = #func().into(); x });
91+
});
92+
},
93+
Some(RequireFunc::Closure(func)) => {
94+
register_required.push(quote! {
95+
required_components.register(components, storages, || { let x: #ident = (#func)().into(); x });
96+
});
97+
},
98+
None => {
99+
register_required.push(quote! {
100+
required_components.register(components, storages, <#ident as Default>::default);
101+
});
102+
}
95103
}
96104
}
97105
}
@@ -162,7 +170,12 @@ enum StorageTy {
162170

163171
struct Require {
164172
path: Path,
165-
func: Option<Path>,
173+
func: Option<RequireFunc>,
174+
}
175+
176+
enum RequireFunc {
177+
Path(Path),
178+
Closure(ExprClosure)
166179
}
167180

168181
// values for `storage` attribute
@@ -238,8 +251,12 @@ impl Parse for Require {
238251
let func = if input.peek(Paren) {
239252
let content;
240253
parenthesized!(content in input);
241-
let func = content.parse::<Path>()?;
242-
Some(func)
254+
if let Ok(func) = content.parse::<ExprClosure>() {
255+
Some(RequireFunc::Closure(func))
256+
} else {
257+
let func = content.parse::<Path>()?;
258+
Some(RequireFunc::Path(func))
259+
}
243260
} else {
244261
None
245262
};

0 commit comments

Comments
 (0)