Skip to content

Commit 4468656

Browse files
Add ability to pass modifier function for classes (#127)
1 parent 75ea323 commit 4468656

File tree

2 files changed

+15
-3
lines changed

2 files changed

+15
-3
lines changed

crates/macros/src/class.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ pub struct Class {
1919
pub constructor: Option<crate::method::Method>,
2020
pub constants: Vec<crate::constant::Constant>,
2121
pub properties: HashMap<String, Property>,
22+
/// A function name called when creating the class entry. Given an instance
23+
/// of `ClassBuilder` and must return it.
24+
pub modifier: Option<String>,
2225
}
2326

2427
#[derive(Debug)]
@@ -33,6 +36,7 @@ pub enum ParsedAttribute {
3336
#[darling(default)]
3437
pub struct AttrArgs {
3538
name: Option<String>,
39+
modifier: Option<String>,
3640
}
3741

3842
pub fn parser(args: AttributeArgs, mut input: ItemStruct) -> Result<TokenStream> {
@@ -120,6 +124,7 @@ pub fn parser(args: AttributeArgs, mut input: ItemStruct) -> Result<TokenStream>
120124
interfaces,
121125
docs: comments,
122126
properties,
127+
modifier: args.modifier,
123128
..Default::default()
124129
};
125130

crates/macros/src/startup_function.rs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,16 +114,23 @@ fn build_classes(classes: &HashMap<String, Class>) -> Result<Vec<TokenStream>> {
114114
// Ok(quote! { .property(#name, #default_expr, #flags_expr) })
115115
// })
116116
// .collect::<Result<Vec<_>>>()?;
117+
let class_modifier = class.modifier.as_ref().map(|modifier| {
118+
let modifier = Ident::new(modifier, Span::call_site());
119+
quote! {
120+
let builder = #modifier(builder).expect(concat!("Failed to build class ", #class_name));
121+
}
122+
});
117123

118124
Ok(quote! {{
119-
let class = ::ext_php_rs::builders::ClassBuilder::new(#class_name)
125+
let builder = ::ext_php_rs::builders::ClassBuilder::new(#class_name)
120126
#(#methods)*
121127
#(#constants)*
122128
#(#interfaces)*
123129
// #(#properties)*
124130
#parent
125-
.object_override::<#ident>()
126-
.build()
131+
.object_override::<#ident>();
132+
#class_modifier
133+
let class = builder.build()
127134
.expect(concat!("Unable to build class `", #class_name, "`"));
128135

129136
#meta.set_ce(class);

0 commit comments

Comments
 (0)